Pular para o conteúdo
Todos os conceitos

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
os pacotes, na ordem de chegada chegou 1º Seq 5 IA{ chegou 2º Seq 1 TOCA lido na chegada IA{TOCA 1 2 3 4 5 6 7 T O C A I A { posição de cada byte na conversa lido pelo Seq TOCAIA{
Os dois pedaços chegaram trocados: lidos na ordem de chegada dão IA{TOCA, mas cada Seq aponta a posição do primeiro byte do pedaço, e pelo Seq a mensagem é TOCAIA{.

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).

Aparece nestes desafios