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.
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 / handshakedadosACKperdaFIN / 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ê
Fase
Custo
3-way handshake
1 RTT antes do 1º byte
Slow start
cwnd dobra por RTT até ssthresh
Congestion avoidance
cwnd +1 por RTT (linear)
Perda detectada
cwnd 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.