Conexões e fluxos TCP
O TCP numera cada byte, e é por esses números que dá para remontar uma conversa inteira, mesmo picada e fora de ordem.
O TCP entrega os dados em ordem e sem perder nada, por cima de uma rede que pode perder, atrasar e embaralhar pacotes. Para isso ele faz duas coisas.
Primeiro, abre a conexão com um aperto de mão em três passos (three-way handshake):
cliente -> servidor SYN "quero conversar"
servidor -> cliente SYN, ACK "pode falar"
cliente -> servidor ACK "combinado"
Segundo, numera cada byte enviado. O campo Seq (sequence number) diz em que posição da conversa está o primeiro byte do pacote, e o campo Ack diz até onde o outro lado já recebeu. O Wireshark mostra números relativos, começando em 1, para facilitar a leitura.
Um exemplo: a mensagem TOCAIA{ foi mandada em dois pedaços, e eles chegaram trocados.
| Ordem de chegada | Seq | Dados |
|---|---|---|
| 1º | 5 | IA{ |
| 2º | 1 | TOCA |
Lendo na ordem de chegada sai IA{TOCA. Pelo Seq, o pedaço que começa na posição 1 vem antes do que começa na 5, e a mensagem certa é TOCAIA{. O Wireshark marca esses casos com avisos como TCP Out-Of-Order e TCP Previous segment not captured.
Você não precisa fazer isso à mão. No Wireshark, clique com o botão direito num pacote da conexão e escolha Follow > TCP Stream: ele junta os pedaços na ordem do Seq e mostra a conversa inteira, com cada lado numa cor. No terminal, tshark -r arquivo.pcap -qz follow,tcp,ascii,0 faz o mesmo para a conexão número 0.
A conexão termina com FIN (despedida educada) ou RST (corte na hora).