College Online
0%

TCP e Comunicacao Confiavel

Modulo 3 · Aula 2 ~30 min de leitura Nivel: Intermediario

Video da aula estara disponivel em breve

TCP: Transmission Control Protocol

TCP e o protocolo de transporte que oferece comunicacao confiavel, orientada a conexao, com entrega ordenada. A maioria dos protocolos de aplicacao (HTTP, SSH, SMTP, PostgreSQL) roda sobre TCP.

Formato do segmento TCP

Diagrama
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Offset|  Res  |C|E|U|A|P|R|S|F|          Window Size         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |       Urgent Pointer          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options (variable)                 |Padding|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Header TCP: 20 bytes (minimo) vs UDP: 8 bytes
Flags importantes:
  SYN (S) = Sincronizar sequence numbers (inicio de conexao)
  ACK (A) = Acknowledgment valido
  FIN (F) = Finalizar conexao
  RST (R) = Reset (abortar conexao)
  PSH (P) = Push (entrega imediata ao aplicativo)

Three-way handshake

TCP usa um three-way handshake para estabelecer uma conexao antes de transferir dados:

Diagrama
Cliente                          Servidor
   |                                |
   |------- SYN (seq=x) ---------->|   1. Cliente quer conectar
   |                                |      (escolhe seq number inicial x)
   |                                |
   |<--- SYN-ACK (seq=y, ack=x+1)--|   2. Servidor aceita e envia seu seq
   |                                |      (escolhe seq number inicial y)
   |                                |
   |------- ACK (ack=y+1) -------->|   3. Cliente confirma
   |                                |
   |===== CONEXAO ESTABELECIDA =====|
   |                                |
   |------- DATA (seq=x+1) ------->|   Agora pode enviar dados
   |<------ ACK (ack=x+1+len) -----|

Sequence numbers e acknowledgments

Cada byte de dados transmitido via TCP tem um sequence number. O receptor envia acknowledgments indicando o proximo byte que espera receber.

Diagrama
Dados: "HELLO" (5 bytes), seq inicial = 100

Cliente:  seq=100, data="HE" (2 bytes)  ------->
                                         <------- ACK=102 (proximo esperado)
Cliente:  seq=102, data="LL" (2 bytes)  ------->
                                         <------- ACK=104
Cliente:  seq=104, data="O"  (1 byte)  ------->
                                         <------- ACK=105

Se um segmento se perder, o receptor reenvia o ultimo ACK:
Cliente:  seq=102, data="LL" ------> [PERDIDO]
          (timeout, sem ACK)
Cliente:  seq=102, data="LL" ------->  (retransmissao)
                                <------- ACK=104

Controle de fluxo (Flow Control)

O controle de fluxo impede que o remetente sobrecarregue o receptor. TCP usa uma janela deslizante (sliding window): o receptor anuncia quantos bytes pode aceitar (campo Window Size no header).

Diagrama
Sliding Window:

Remetente:
  [enviado+ACK] [enviado, sem ACK] [pode enviar] [nao pode enviar]
  ─────────────|──────────────────|─────────────|──────────────────
               ^                  ^              ^
          base da janela    proximo a enviar   limite da janela

Receptor anuncia: Window = 4000 bytes
  -> Remetente pode ter ate 4000 bytes "em voo" (enviados, sem ACK)

Se receptor esta lento:  Window = 0  -> Remetente para de enviar!
Quando receptor libera buffer: Window = 2000 -> Remetente retoma

Encerramento da conexao

Diagrama
Cliente                          Servidor
   |                                |
   |------- FIN ------------------>|   1. Cliente quer fechar
   |<------ ACK -------------------|   2. Servidor confirma
   |                                |      (servidor pode continuar enviando)
   |<------ FIN -------------------|   3. Servidor tambem quer fechar
   |------- ACK ------------------>|   4. Cliente confirma
   |                                |
   | [TIME_WAIT: 2*MSL]            |   Cliente espera antes de liberar porta
   |                                |
   |=== CONEXAO ENCERRADA =========|

TCP com sockets em Python

Python
import socket

# ── Servidor TCP (echo) ──
def tcp_server():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # STREAM = TCP
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(("0.0.0.0", 9999))
    server.listen(5)  # Backlog de 5 conexoes pendentes
    print("TCP server ouvindo na porta 9999")

    while True:
        conn, addr = server.accept()  # Handshake TCP acontece aqui
        print(f"Conexao de {addr}")

        while True:
            data = conn.recv(1024)
            if not data:
                break
            print(f"Recebido: {data.decode()}")
            conn.sendall(data)  # Echo de volta

        conn.close()
        print(f"Conexao com {addr} encerrada")

# ── Cliente TCP ──
def tcp_client():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(("localhost", 9999))  # Three-way handshake

    sock.sendall(b"Hello, TCP!")
    response = sock.recv(1024)
    print(f"Resposta: {response.decode()}")

    sock.close()  # FIN handshake

No harness.os

Diagrama
TCP no harness.os — esta em todo lugar:

1. Neon Postgres: usa PostgreSQL wire protocol sobre TCP
   Agente --> TCP:5432 --> Neon Proxy --> TCP --> Neon Compute
   Confiabilidade do TCP garante: queries chegam intactas,
   resultados nao se perdem, transacoes sao atomicas.

2. MCP HTTP/SSE: HTTP roda sobre TCP
   Claude CLI --> TCP:443 --> Fly.io --> MCP Server
   TCP garante que tool calls e resultados nao se perdem.

3. Session handoffs: confiabilidade critica
   Handoff = "carta" que a proxima sessao deve receber intacta.
   Perder um handoff = perder contexto de trabalho.
   TCP (via HTTP POST ao Neon) garante entrega.

Paralelo: TCP reliability = session handoff reliability
  TCP garante: dados chegam, em ordem, sem duplicatas.
  Harness garante: handoffs sao salvos, com estado, sem perda.

Resumo

Exercicio pratico

Construa um echo server TCP em Python e relate a confiabilidade com session handoffs.

  1. Implemente servidor e cliente TCP (codigo acima)
  2. Envie uma mensagem longa (>1KB). TCP fragmenta e reordena?
  3. Mate o servidor durante uma transmissao. O que o cliente recebe?
  4. Compare: o que acontece se a conexao Neon DB cair durante um handoff write?

Verifique seu entendimento

No three-way handshake do TCP, qual e a sequencia correta de flags?

  • ACK, SYN-ACK, SYN
  • SYN, SYN-ACK, ACK
  • SYN, ACK, SYN-ACK
  • FIN, SYN, ACK