Camada Zero · 18 · TCP Handshake & Controle de Congestão

Antes de mandar 1 byte, o TCP faz um aperto de mão de 3 vias e isso custa 1 RTT. Depois ele não dispara tudo de uma vez: começa devagar, dobra a velocidade até a primeira perda, e aí recua. Roda aqui embaixo e olha a janela de congestão subir e despencar.

Troca de mensagens (Cliente ↔ Servidor)

Janela de congestão (cwnd) ao longo do tempo

1cwnd (segmentos)
~48msRTT
0Pacotes em voo
Conexão fechada. Clica em "Abrir conexão" pra ver o 3-way handshake, depois "Enviar dados" várias vezes pra ver o slow start dobrando o cwnd. Aí "Simular perda" pra ver ele recuar.
SYN / handshake dados ACK perda FIN / fechamento
O TCP entrega um fluxo de bytes confiável e em ordem por cima de uma rede que perde, duplica e reordena pacotes. O kernel cuida de seq/ack/retransmissão/cwnd; no Go você só vê um io.Reader/io.Writer. O preço disso é latência de setup (1 RTT de handshake) mais a rampa do slow start antes de chegar na banda plena.

Abrir uma conexão TCP em Go

// net.Dial faz o 3-way handshake por baixo
conn, err := net.Dial("tcp", "exemplo.com:80")
if err != nil { return err }
defer conn.Close() // dispara o FIN no fim

// você escreve bytes; o kernel cuida de seq, ack e cwnd
conn.Write([]byte("GET / HTTP/1.1\r\nHost: exemplo.com\r\n\r\n"))

O que o kernel faz por você

FaseCusto
3-way handshake1 RTT antes do 1º byte
Slow startcwnd dobra por RTT até ssthresh
Congestion avoidancecwnd +1 por RTT (linear)
Perda detectadacwnd cai pela metade (recua)

🧠 Desafio — TCP

Roda o handshake e manda dados algumas vezes aqui de cima antes de responder. As duas últimas são de reflexão: escreve a sua e só então revela o modelo.