10

Camada de Transporte Completa: UDP e TCP

Introdução10.1

Hoje você vai ver por que a comunicação na Internet não termina quando um pacote IP chega ao host correto. A camada de rede entrega pacotes entre máquinas, mas uma máquina executa muitos programas ao mesmo tempo. O problema da camada de transporte é levar os dados ao processo correto e, quando necessário, transformar uma rede de melhor esforço em uma comunicação confiável.

Na aula anterior, o IP apareceu como um protocolo sem conexão e de melhor esforço. Isso é suficiente para encaminhar datagramas entre redes, mas não garante entrega, ordem, ausência de duplicação nem controle de velocidade. A camada de transporte existe justamente acima desse ponto frágil.

Ideia central

A camada de transporte oferece comunicação processo a processo. O UDP faz isso com mínimo controle e baixo overhead. O TCP faz isso criando uma conexão virtual, numerando bytes, confirmando dados, controlando fluxo e reagindo a perdas e congestionamento.

Esta aula usa como base o Forouzan, capítulo 23, páginas 703 a 735, excluindo a parte de SCTP, e o Tanenbaum, capítulo 6, principalmente as seções 6.1 a 6.5, páginas 310 a 365.

Mapa de leitura dos livros10.2

Antes de entrar nos detalhes, vale deixar claro de onde a aula está saindo nos dois livros.

No Forouzan, o capítulo 23 aparece dentro da parte de Camada de Transporte e se chama Comunicação entre Processos: UDP, TCP e SCTP. Para esta aula, usamos as seções 23.1 a 23.3.

Fonte Trecho usado Páginas do livro Assunto
Forouzan 23.1 703 a 708 Comunicação entre processos, cliente/servidor, multiplexação, demultiplexação e serviços
Forouzan 23.2 709 a 715 UDP, portas, datagrama, checksum e operação
Forouzan 23.3 715 a 735 TCP, fluxo de bytes, segmento, conexão, fluxo, erro e congestionamento

No Tanenbaum, o capítulo 6 se chama A camada de transporte. Ele organiza a discussão de forma mais conceitual, começando pelo serviço de transporte e depois entrando nos elementos que qualquer protocolo de transporte precisa resolver.

Fonte Trecho usado Páginas do livro Assunto
Tanenbaum 6.1 310 a 318 Serviço de transporte, primitivas e sockets
Tanenbaum 6.2 318 a 333 Endereçamento, estabelecimento, encerramento, erro, fluxo e multiplexação
Tanenbaum 6.3 333 a 340 Controle de congestionamento
Tanenbaum 6.4 340 a 346 UDP e protocolos relacionados
Tanenbaum 6.5 347 a 365 TCP, cabeçalho, conexão, janela e congestionamento
Recorte da aula

O SCTP aparece no Forouzan e as seções 6.6 e 6.7 aparecem no Tanenbaum, mas ficam fora do foco de hoje. O objetivo aqui é dominar UDP e TCP como transportes essenciais da Internet.

O problema que a camada de transporte resolve10.3

Imagine que seu computador esteja acessando uma página Web, sincronizando arquivos, recebendo mensagens e fazendo uma consulta DNS quase ao mesmo tempo. Do ponto de vista da camada de rede, todos esses dados chegam ao mesmo endereço IP da sua máquina. Mas isso não basta.

O IP identifica o host. Ele não identifica diretamente qual processo deve receber cada pedaço de dado. Sem a camada de transporte, o sistema operacional receberia pacotes IP e ainda teria de adivinhar se aquele conteúdo pertence ao navegador, ao cliente de e-mail, ao serviço de sincronização ou a outro programa.

Reflita

Se o endereço IP identifica a máquina de destino, qual informação falta para entregar o dado ao programa correto dentro dessa máquina?

Falta o endereço da camada de transporte. Na Internet, esse endereço é o número de porta. O par formado por endereço IP e porta identifica um ponto de comunicação em um host.

Forouzan apresenta essa diferença como três níveis de comunicação.

Camada Unidade de entrega Tipo de comunicação
Enlace Quadro Nó a nó
Rede Datagrama ou pacote Host a host
Transporte Segmento ou datagrama de usuário Processo a processo

O Tanenbaum reforça a mesma ideia por outro caminho. A camada de transporte roda nas máquinas finais e pode compensar limitações da camada de rede. Se a rede perde, atrasa, duplica ou reordena pacotes, a entidade de transporte pode implementar mecanismos para tornar o serviço mais adequado às aplicações.

A figura do Tanenbaum ajuda a visualizar a mudança de ambiente. Na camada de enlace, dois dispositivos vizinhos conversam por um canal físico direto. Na camada de transporte, as pontas conversam através de uma rede inteira, com roteadores, filas, caminhos alternativos, perdas e atrasos.

Por isso, problemas que eram simples no enlace ficam mais difíceis no transporte. Não basta saber que há um vizinho do outro lado do fio. É preciso endereçar processos, abrir conexões quando necessário, detectar duplicatas antigas, lidar com perda e decidir quanto enviar sem destruir o receptor ou congestionar a rede.

Exemplo 1

Considere um notebook com o endereço IP 192.168.1.20. Ele executa três aplicações ao mesmo tempo.

Aplicação Protocolo típico Porta de destino remota
Navegador acessando Web TCP 443
Consulta DNS UDP 53
Sincronização de horário UDP 123

Todos os pacotes podem sair do mesmo IP de origem, mas eles não pertencem ao mesmo processo. A camada de transporte separa essas conversas usando portas de origem e destino.

O exemplo mostra que o IP coloca o pacote no host correto. A porta ajuda a colocá-lo no processo correto.

Portas, multiplexação e demultiplexação10.4

Um número de porta tem 16 bits. Portanto, os valores possíveis vão de 0 a 65.535. Em uma comunicação cliente-servidor, o servidor normalmente usa uma porta conhecida, enquanto o cliente usa uma porta temporária, também chamada porta efêmera.

Essa separação resolve um problema prático. O cliente precisa saber onde encontrar o serviço. Por isso, serviços padronizados costumam usar portas bem conhecidas. Já o cliente só precisa de uma identificação temporária para receber a resposta.

Porta Serviço comum Transporte usual
20 e 21 FTP TCP
22 SSH TCP
25 SMTP TCP
53 DNS UDP ou TCP
80 HTTP TCP
123 NTP UDP
443 HTTPS TCP
Cuidado conceitual

A porta não identifica uma máquina. Quem identifica a máquina é o endereço IP. A porta identifica um ponto de comunicação dentro da máquina.

Multiplexar na origem, demultiplexar no destino10.4.1

Na origem, vários processos podem querer enviar dados pela rede. A camada de transporte recebe dados desses processos, coloca cabeçalhos com portas e entrega os segmentos ou datagramas ao IP. Esse lado é a multiplexação.

No destino, acontece o inverso. A camada de transporte recebe dados vindos do IP, observa as portas no cabeçalho e entrega o conteúdo ao processo adequado. Esse lado é a demultiplexação.

TransporteMuxp1Processo Aporta origem 52000t1Camada de transportemultiplexaçãop1->t1p2Processo Bporta origem 52001p2->t1p3Processo Cporta origem 52002p3->t1ipIPentrega host a hostt1->ipt2Camada de transportedemultiplexaçãoip->t2s1Servidor Webporta 443t2->s1s2Servidor DNSporta 53t2->s2
Exemplo 2

Um cliente com IP 10.0.0.8 acessa um servidor HTTPS 200.10.1.5.

Origem: 10.0.0.8:53144
Destino: 200.10.1.5:443

O servidor responde invertendo os papéis.

Origem: 200.10.1.5:443
Destino: 10.0.0.8:53144

A porta 443 diz ao cliente qual serviço foi acessado no servidor. A porta 53144 permite que a resposta volte para a conversa correta no cliente.

Exemplo 3

Suponha que duas abas do navegador acessem o mesmo servidor 200.10.1.5:443 ao mesmo tempo.

Aba 1: 10.0.0.8:53144 -> 200.10.1.5:443
Aba 2: 10.0.0.8:53145 -> 200.10.1.5:443

O IP de origem e o IP de destino são iguais. A porta de destino também é igual. O que diferencia as duas conversas é a porta de origem escolhida no cliente. Assim, quando as respostas chegam, o sistema operacional consegue associar cada fluxo ao socket correto.

UDP como transporte mínimo10.5

O UDP, ou User Datagram Protocol, é o protocolo de transporte mais simples da Internet. Ele oferece comunicação processo a processo usando portas, mas quase não acrescenta controle ao serviço do IP.

O UDP é sem conexão. Isso significa que ele não estabelece uma conexão antes de enviar dados. Cada datagrama UDP é independente.

O UDP também é não confiável no sentido técnico. Ele não confirma recebimento, não retransmite perdas, não reordena datagramas e não controla a velocidade do emissor. Isso não significa que ele seja inútil. Significa que ele deixa essas responsabilidades para a aplicação quando elas forem necessárias.

Reflita

Se o UDP não garante entrega, por que protocolos importantes como DNS, NTP e SNMP podem usá-lo?

Porque nem toda aplicação precisa do mesmo tipo de garantia dentro da camada de transporte. Uma consulta curta pode ser repetida pela própria aplicação. Uma aplicação em tempo real pode preferir perder uma pequena parte do áudio a esperar uma retransmissão atrasada. Um protocolo simples pode ganhar desempenho evitando o custo de uma conexão TCP.

O cabeçalho UDP10.5.1

O cabeçalho UDP tem apenas 8 bytes.

Campo Tamanho Função
Porta de origem 16 bits Identifica o processo de origem
Porta de destino 16 bits Identifica o processo de destino
Comprimento 16 bits Informa o tamanho do datagrama UDP completo
Checksum 16 bits Detecta erros no cabeçalho e nos dados

O campo de checksum usa também um pseudocabeçalho com informações do IP, como endereços de origem e destino e o número do protocolo. A razão é importante. O UDP precisa detectar não apenas erros no conteúdo UDP, mas também situações em que o datagrama poderia ser entregue ao host ou protocolo errado.

Os campos são pequenos e o formato é enxuto. A porta de origem pode ser zero se o transmissor não esperar resposta. A porta de destino é essencial para a demultiplexação. O comprimento mínimo é 8 bytes (só cabeçalho, sem dados).

O checksum do UDP inclui também um pseudocabeçalho com campos do IP.

A inclusão do pseudocabeçalho é uma defesa contra erros de roteamento. Se o datagrama IP for entregue ao host errado, o checksum detectará a inconsistência entre os endereços IP do pseudocabeçalho e o que o host realmente recebeu.

O que o UDP não faz10.5.2

O UDP não cria relação entre datagramas sucessivos. Se uma aplicação envia três mensagens, o UDP não trata isso como um fluxo único. São três datagramas independentes.

Isso tem consequências diretas.

Necessidade UDP faz sozinho? Consequência
Estabelecer conexão Não Envia sem handshake
Confirmar recebimento Não A aplicação deve confirmar, se precisar
Retransmitir perda Não A aplicação deve retransmitir, se precisar
Ordenar dados Não Datagramas podem chegar fora de ordem
Controlar fluxo Não O receptor pode ser sobrecarregado
Detectar erro simples Sim, quando o checksum é usado No IPv4 o checksum UDP pode ser zero; no IPv6 ele é obrigatório
Exemplo 4

Uma aplicação envia uma consulta DNS para descobrir o endereço IP de example.com.

  1. O cliente envia uma pequena pergunta UDP para a porta 53 do servidor DNS.
  2. O servidor responde com um pequeno datagrama UDP.
  3. Se a resposta não chegar, o cliente pode tentar novamente.

Esse padrão combina bem com UDP porque a interação é curta. Não faria tanto sentido estabelecer uma conexão completa apenas para uma pergunta e uma resposta simples.

Exemplo 5

Imagine uma chamada de voz. Se um pequeno pacote de áudio se perde, retransmiti-lo muito tarde pode piorar a experiência, porque aquele som já passou do momento de reprodução.

Nesse caso, a aplicação pode preferir continuar com os próximos pacotes. O UDP combina com esse cenário porque não força retransmissões e não bloqueia a entrega esperando o dado perdido.

O exemplo não significa que toda aplicação de mídia seja “sem controle”. Significa que o controle pode ser feito em outro nível, com lógica própria para tempo real.

TCP como fluxo confiável de bytes10.6

O TCP, ou Transmission Control Protocol, resolve um problema diferente. Ele foi projetado para oferecer um fluxo de bytes fim a fim confiável sobre uma rede IP que pode perder, atrasar, duplicar ou reordenar datagramas.

O TCP é orientado a conexão. Antes da transferência de dados, as duas pontas estabelecem uma conexão virtual. Depois, os dados fluem. Ao final, a conexão é encerrada.

Essa conexão não é um fio físico reservado. Ela é um estado mantido nas pontas. O IP continua encaminhando datagramas individualmente. O TCP é quem numera bytes, confirma recebimentos, retransmite perdas e entrega os dados em ordem para a aplicação.

O cabeçalho TCP é maior que o cabeçalho UDP porque carrega mais responsabilidade. Além das portas, ele precisa de números de sequência, números de confirmação, flags de controle, janela, checksum e opções. Cada campo existe porque o TCP tenta criar uma abstração mais forte que a oferecida pelo IP.

Campo TCP Por que importa
Porta de origem e destino Identificam os processos nas pontas
Número de sequência Localiza o primeiro byte do segmento dentro do fluxo
Número de confirmação Informa o próximo byte esperado
Flags Controlam abertura, encerramento, reset, confirmação e urgência
Janela Informa quanto o receptor ainda aceita
Checksum Detecta corrupção no segmento
Opções Permitem extensões como MSS, escala de janela e timestamps
Erro comum

O número de sequência TCP não conta segmentos. Ele conta bytes. Dois segmentos de tamanhos diferentes avançam a sequência em quantidades diferentes.

Fluxo de bytes, não mensagens10.6.1

Uma das ideias mais importantes do TCP é que ele entrega um fluxo de bytes. Ele não preserva necessariamente as fronteiras das escritas feitas pela aplicação.

Se uma aplicação escreve quatro blocos de 512 bytes, a outra ponta pode ler quatro blocos de 512 bytes, dois blocos de 1024 bytes, um bloco de 2048 bytes ou outra divisão. Para o TCP, os dados são uma sequência contínua de bytes.

Erro comum

Não pense no TCP como “UDP confiável”. O UDP preserva mensagens individuais. O TCP oferece um fluxo contínuo de bytes. A aplicação precisa definir sua própria forma de separar mensagens dentro desse fluxo quando isso for necessário.

Exemplo 6

Uma aplicação envia pelo TCP os textos abaixo em três chamadas de escrita.

GET
 /index.html
 HTTP/1.1

A aplicação do outro lado não deve assumir que receberá exatamente três pedaços. Ela pode receber tudo junto.

GET /index.html HTTP/1.1

Ou pode receber divisões diferentes. O TCP garante ordem e confiabilidade do fluxo, mas não preserva as fronteiras originais das chamadas de escrita.

Sockets e a visão da aplicação10.6.2

O Tanenbaum apresenta sockets de Berkeley para mostrar como a aplicação enxerga a camada de transporte. A aplicação não manipula diretamente cada detalhe de SYN, ACK, janela e retransmissão. Ela usa primitivas do sistema operacional.

Primitiva Ideia prática
socket Cria um ponto final de comunicação
bind Associa endereço local e porta ao socket
listen Coloca um servidor em modo de espera por conexões
accept Aceita uma conexão de entrada
connect Inicia uma conexão com um servidor
send Envia dados pela conexão ou socket
receive Recebe dados
close Encerra o uso do socket
Exemplo 6b

Um servidor Web típico segue esta lógica simplificada.

  1. Cria um socket TCP.
  2. Associa o socket à porta 80 ou 443.
  3. Fica escutando conexões.
  4. Aceita uma conexão de cliente.
  5. Lê a requisição HTTP.
  6. Envia a resposta.
  7. Fecha ou mantém a conexão, dependendo do protocolo e da configuração.

O programador chama funções relativamente simples. Por baixo, o sistema operacional mantém estado TCP, números de sequência, buffers, timers e janelas.

Segmentos e numeração de bytes10.6.3

O TCP recebe bytes da aplicação, armazena em buffers e agrupa partes desse fluxo em segmentos TCP. Cada byte tem um número de sequência. O número de sequência de um segmento é o número do primeiro byte transportado naquele segmento.

As confirmações são cumulativas. O número de confirmação indica o próximo byte esperado, não o último byte recebido.

Exemplo 7

Uma conexão TCP envia 3000 bytes. O primeiro byte recebeu número de sequência 1001. O TCP divide os dados em três segmentos de 1000 bytes.

Segmento Bytes transportados Número de sequência
1 1001 a 2000 1001
2 2001 a 3000 2001
3 3001 a 4000 3001

Se o receptor recebeu corretamente os três segmentos em ordem, ele pode responder com confirmação 4001. Isso significa “recebi tudo até 4000 e agora espero o byte 4001”.

Conexão TCP e handshake de três vias10.7

Antes de transferir dados, o TCP estabelece uma conexão com o handshake de três vias. Esse processo sincroniza os números de sequência iniciais e confirma que as duas pontas estão prontas.

TCPHandshakecliente1Clienteabertura ativaservidor1Servidorabertura passivacliente1->servidor11. SYNseq = xcliente2Clienteconexão estabelecidaservidor1->cliente22. SYN + ACKseq = y, ack = x + 1servidor2Servidorconexão estabelecidacliente2->servidor23. ACKack = y + 1

O primeiro segmento tem SYN ativo. Ele não carrega dados de aplicação, mas consome um número de sequência. O segundo segmento tem SYN e ACK ativos. Ele confirma o primeiro SYN e sincroniza o número de sequência da outra direção. O terceiro segmento confirma o SYN do servidor.

Repare no consumo de números de sequência. O primeiro SYN do cliente usa seq = 8000. O servidor responde com seq = 15000 e ack = 8001, confirmando o byte "fantasma" do SYN. O cliente então envia ack = 15001. A partir desse ponto, o primeiro byte de dados do cliente terá sequência 8001, e o primeiro byte do servidor terá sequência 15001.

Exemplo 8

Suponha que o cliente escolha número inicial 8000 e o servidor escolha 15000.

Etapa Segmento Significado
1 Cliente envia SYN, seq = 8000 Cliente pede abertura e sincroniza sua sequência
2 Servidor envia SYN + ACK, seq = 15000, ack = 8001 Servidor aceita e confirma o SYN do cliente
3 Cliente envia ACK, ack = 15001 Cliente confirma o SYN do servidor

Após isso, a conexão entra no estado de transferência de dados. O primeiro byte real do cliente usará sequência 8001, porque o SYN consumiu um número de sequência.

Por que três vias são necessárias10.7.1

O Tanenbaum dedica atenção ao problema de duplicatas atrasadas. Em uma rede real, um segmento antigo pode ficar preso, aparecer depois e ser confundido com uma nova tentativa de conexão. O handshake de três vias, combinado com números de sequência iniciais adequados, reduz esse risco.

Se bastasse enviar “quero conectar” e receber “aceito”, uma duplicata antiga poderia criar confusão. Com três etapas, as duas pontas confirmam explicitamente que estão falando da mesma tentativa atual de conexão.

Cuidado de segurança

O handshake TCP também abre espaço para ataques de inundação de SYN. Um atacante envia muitos SYN e não completa as conexões, consumindo recursos do servidor. Implementações modernas usam estratégias como limitação de solicitações e cookies SYN para reduzir esse problema.

Controle de fluxo, erro e congestionamento10.8

O TCP oferece confiabilidade porque combina vários mecanismos. Três deles precisam ficar bem separados.

Mecanismo Pergunta que responde Ideia central
Controle de fluxo O receptor consegue receber mais dados? Evita sobrecarregar o buffer do receptor
Controle de erro Algo foi perdido, corrompido, duplicado ou chegou fora de ordem? Usa checksum, ACKs, temporizadores e retransmissões
Controle de congestionamento A rede consegue carregar mais dados agora? Ajusta envio para não piorar congestionamento

Controle de fluxo10.8.1

O controle de fluxo protege o receptor. O receptor anuncia uma janela de recepção, normalmente chamada rwnd, indicando quantos bytes ainda consegue receber. O transmissor deve respeitar esse limite.

Se a janela anunciada for zero, o transmissor deve parar de enviar novos dados. Mais tarde, quando a aplicação receptora consumir dados do buffer, o receptor pode anunciar uma janela maior.

Exemplo 9

Um receptor tem buffer livre de 4096 bytes. O transmissor envia 2048 bytes.

  1. O receptor recebe os 2048 bytes.
  2. Agora restam 2048 bytes livres no buffer.
  3. O receptor confirma os dados e anuncia janela 2048.
  4. O transmissor sabe que pode enviar mais 2048 bytes sem sobrecarregar o receptor.

Se a aplicação no receptor não consumir nada e chegarem mais 2048 bytes, a janela pode cair para zero. Nesse caso, o transmissor deve aguardar.

Controle de erro10.8.2

Reflita

Se o checksum do UDP pode ser desabilitado no IPv4 e o do TCP é obrigatório, o que essa diferença revela sobre o projeto de cada protocolo?

Revela que a confiabilidade é estrutural no TCP, não um extra. O TCP não pode abrir mão da detecção de corrupção porque sua tarefa é justamente entregar um fluxo confiável. Se um segmento silenciosamente corrompido fosse aceito, toda a abstração de "fluxo de bytes confiável" ruiria. No UDP sobre IPv4, o checksum pode ser enviado como zero, deixando essa proteção fora do UDP; no UDP sobre IPv6, o checksum é obrigatório. O ponto conceitual continua sendo que o TCP não tem essa liberdade.

O controle de erro protege a confiabilidade do fluxo. O TCP usa checksum para detectar corrupção, confirmações para indicar progresso, temporizadores para detectar ausência de resposta e retransmissões para reenviar dados provavelmente perdidos.

Um segmento corrompido é descartado e tratado como perdido. Um segmento fora de ordem pode ser armazenado temporariamente, mas não deve ser entregue à aplicação antes dos bytes faltantes.

Exemplo 10

O transmissor envia quatro segmentos com estas faixas de bytes.

Segmento Bytes
1 501 a 600
2 601 a 700
3 701 a 800
4 801 a 900

Se o segmento 3 se perde e o segmento 4 chega, o receptor ainda espera o byte 701. Ele pode armazenar 801 a 900 temporariamente, mas confirma novamente 701.

ACK = 701

Esse ACK repetido informa ao transmissor que o receptor continua parado no mesmo ponto do fluxo. Implementações TCP modernas podem usar ACKs duplicados como sinal de perda e retransmitir antes mesmo do temporizador expirar.

Exemplo 10b

Nem toda retransmissão significa que os dados se perderam. Considere o mesmo cenário em que o transmissor envia os bytes 501 a 600.

  1. O receptor recebe o segmento corretamente e envia ACK = 601.
  2. Essa confirmação se perde na rede.
  3. O timer de retransmissão do transmissor expira.
  4. O transmissor reenvia os bytes 501 a 600.

O receptor já tem esses bytes. O que ele faz? Simplesmente descarta a cópia duplicada e reenvia ACK = 601. Nenhum dano ao fluxo, apenas um segmento desperdiçado.

Este exemplo é importante porque mostra que a retransmissão TCP é idempotente do ponto de vista do receptor. Chegar duas vezes o mesmo trecho não corrompe o fluxo nem insere bytes repetidos na entrega à aplicação.

A diferença prática entre perda de dados e perda de ACK está em quem paga o custo. Na perda de dados, o transmissor precisa retransmitir para o receptor progredir. Na perda de ACK, a retransmissão é supérflua, mas inevitável sem um mecanismo adicional de distinção.

Temporizadores e retransmissão10.8.3

O TCP não pode esperar para sempre por uma confirmação. Quando envia dados, ele acompanha o tempo de espera por ACKs. Se a confirmação não chega dentro do prazo estimado, o transmissor presume perda e retransmite.

Esse prazo não pode ser fixo demais. Uma rede local pode responder em poucos milissegundos. Uma conexão atravessando continentes pode demorar muito mais. Por isso, implementações TCP estimam o tempo de ida e volta, chamado RTT, e ajustam o temporizador de retransmissão.

Observação

Temporizador curto demais causa retransmissões desnecessárias. Temporizador longo demais deixa a recuperação lenta. O TCP precisa equilibrar os dois riscos.

Exemplo 10c

Considere uma conexão cujo RTT médio está perto de 80 ms.

  1. O transmissor envia um segmento.
  2. O ACK normalmente volta em torno de 80 ms.
  3. Se o temporizador fosse 90 ms, uma pequena variação já causaria retransmissões falsas.
  4. Se o temporizador fosse 5 s, uma perda real demoraria demais para ser corrigida.

O temporizador precisa acompanhar o comportamento observado da rede, não apenas um valor escolhido uma vez.

Entrega ordenada e buffer de recepção10.8.4

Quando segmentos chegam fora de ordem, o TCP receptor pode guardá-los temporariamente. Mas ele só entrega à aplicação a parte contínua do fluxo, sem buracos.

Situação O que o TCP receptor pode fazer
Segmento esperado chega Entrega ou prepara para entregar à aplicação
Segmento futuro chega antes Guarda em buffer, se houver espaço
Segmento duplicado chega Descarta a cópia e confirma novamente
Segmento corrompido chega Descarta e não entrega à aplicação

Essa regra preserva a promessa central do TCP: a aplicação recebe bytes em ordem, sem duplicatas e sem lacunas.

Controle de congestionamento10.8.5

O controle de congestionamento protege a rede. Mesmo que o receptor tenha buffer disponível, a rede pode estar sobrecarregada. O TCP considera esse cenário usando uma janela de congestionamento, normalmente chamada cwnd.

Na prática, a quantidade de dados que o transmissor pode manter em trânsito depende de dois limites.

$$ janela\ efetiva = \min(rwnd, cwnd) $$

O primeiro limite vem do receptor. O segundo vem da condição percebida da rede. Se houver sinais de congestionamento, como perdas, o TCP reduz sua taxa de envio.

Observação

Forouzan deixa o controle de congestionamento detalhado para o capítulo 24, enquanto Tanenbaum o discute no capítulo 6. Para esta aula, o ponto essencial é distinguir congestionamento de fluxo. Fluxo protege o receptor. Congestionamento protege a rede.

Encerramento de conexão TCP10.9

Reflita

Se uma conexão TCP é full-duplex e cada lado pode enviar e receber ao mesmo tempo, por que não basta um lado simplesmente parar de enviar quando terminar? Por que é necessário um ritual explícito de encerramento com FIN e ACK?

Porque o outro lado precisa saber que a transmissão acabou e não está apenas em silêncio temporário. Sem um sinal explícito, o receptor poderia esperar indefinidamente por dados que nunca chegarão. É por isso que o TCP dedica flags, números de sequência e temporizadores ao encerramento da conexão.

Como uma conexão TCP é full-duplex, cada direção pode ser encerrada separadamente. Um lado pode parar de enviar e ainda continuar recebendo. Esse comportamento é chamado semi-encerramento.

O encerramento usa a flag FIN. Quando uma ponta envia FIN, ela informa que não tem mais dados para transmitir naquela direção. A outra ponta confirma com ACK. Depois, quando a outra direção também terminar, ela envia seu próprio FIN, que também deve ser confirmado.

TCPCloseclienteClienteservidorServidorcliente->servidor1. FINcliente não envia mais dadoscliente->servidor4. ACKcliente confirmaservidor->cliente2. ACKservidor confirmaservidor->cliente3. FINservidor também encerra

O encerramento normal consome números de sequência de forma parecida com a abertura. O FIN do cliente e o FIN + ACK do servidor consomem um número de sequência cada um, mesmo sem transportar dados.

No semi-encerramento, o cenário é assimétrico.

O cliente envia FIN e o servidor confirma com ACK. A partir desse momento, o cliente não envia mais dados, mas continua recebendo e confirmando os dados que o servidor ainda transmite. Quando o servidor termina, ele envia seu próprio FIN, que o cliente confirma. Esse padrão é útil quando o servidor precisa processar antes de responder, como em uma ordenação remota.

Erro comum

Encerrar uma direção não significa apagar imediatamente toda a conexão. Como o TCP é full-duplex, cada sentido do fluxo tem sua própria finalização lógica.

UDP e TCP lado a lado10.10

UDP e TCP não são versões “boa” e “ruim” da mesma coisa. Eles resolvem problemas diferentes.

UDP TCP
Sem conexão Orientado a conexão
Datagrama independente Fluxo de bytes
Cabeçalho pequeno Cabeçalho maior
Sem retransmissão própria Retransmite perdas
Sem controle de fluxo próprio Controla fluxo com janela
Não entrega ordem garantida Entrega bytes em ordem
Bom para mensagens curtas, tempo real e controle próprio da aplicação Bom para arquivos, Web, e-mail, SSH e dados que exigem confiabilidade

Critérios de escolha10.10.1

Uma forma prática de escolher entre UDP e TCP é perguntar o que acontece se houver perda, atraso ou reordenação.

Pergunta Se a resposta for sim Transporte provável
A aplicação precisa receber todos os bytes, em ordem? Sim TCP
A troca é curta e pode ser repetida pela aplicação? Sim UDP
Atraso é pior que perda ocasional? Sim UDP ou transporte especializado sobre UDP
A aplicação precisa de fluxo contínuo confiável? Sim TCP
A aplicação quer implementar controle próprio? Sim UDP

Essa tabela não substitui projeto de protocolo, mas evita a resposta automática de que “TCP é sempre melhor”. Em redes, melhor depende do serviço exigido pela aplicação.

Relação com a próxima aula10.10.2

Na próxima aula, a camada de aplicação vai mostrar essas escolhas acontecendo em protocolos reais.

Protocolo de aplicação Transporte comum Motivo
DNS UDP e TCP UDP para consultas comuns; TCP para respostas grandes, transferência de zonas e alguns cenários modernos
HTTP/1.1 e HTTP/2 TCP Precisam de fluxo confiável, normalmente protegido por TLS
HTTP/3 QUIC sobre UDP Usa UDP, mas reconstrói confiabilidade, segurança e multiplexação em outro nível
SMTP TCP E-mail não pode perder bytes da mensagem
IMAP/POP3 TCP Acesso a mensagens exige sessão confiável
NTP UDP Mensagens pequenas e sensíveis a atraso

Perceba o ponto: UDP não significa ausência de protocolo sofisticado. HTTP/3 usa UDP, mas não porque abriu mão de confiabilidade. Ele usa UDP para implementar outro transporte, o QUIC, no espaço de aplicação.

Exemplo 11

Escolha o transporte mais adequado para cada caso.

Situação Escolha provável Motivo
Transferir um arquivo TCP Precisa de entrega completa e ordenada
Consulta DNS simples UDP Pergunta e resposta curtas, tentativa pode ser repetida
Acesso HTTPS TCP Requer fluxo confiável para HTTP sobre TLS
Métrica periódica de monitoramento UDP Pode tolerar perda ocasional e evitar overhead
Sessão SSH TCP Precisa de ordem, confiabilidade e conexão persistente

O critério não é “qual é mais moderno”. O critério é o que a aplicação precisa da camada de transporte.

Mini-laboratório no Linux10.11

Os comandos abaixo servem para transformar a discussão conceitual em observação prática durante a aula. Eles não dependem de Internet externa quando usam 127.0.0.1, pois tudo acontece na própria máquina pelo loopback.

. Ver portas e sockets abertos10.11.1

ss -tulpen

O que observar:

Coluna ou informação Como interpretar
tcp ou udp Protocolo de transporte usado pelo socket
LISTEN ou UNCONN TCP esperando conexões ou UDP esperando datagramas de entrada
Local Address:Port Endereço local e porta associados ao socket
users:(...) Processo dono do socket, quando disponível

Esse comando conecta a ideia de porta à implementação real do sistema operacional. A porta não é apenas um número no slide; ela aparece em uma tabela mantida pelo kernel para demultiplexar dados para processos.

. Enviar uma mensagem UDP local10.11.2

Em um terminal, abra um receptor UDP.

nc -u -l 9999

Em outro terminal, envie uma mensagem.

printf 'consulta\n' | nc -u -w1 127.0.0.1 9999

O ponto didático é observar que não há abertura de conexão antes da mensagem. O datagrama é enviado diretamente para 127.0.0.1:9999. Se o receptor não estiver escutando, o UDP não cria uma sessão persistente esperando que alguém apareça.

. Abrir uma conexão TCP local10.11.3

Em um terminal, abra um servidor TCP simples.

nc -l 9998

Em outro terminal, conecte no servidor.

nc -v 127.0.0.1 9998

Enquanto a conexão estiver aberta, observe o estado com ss.

ss -tn '( sport = :9998 or dport = :9998 )'

O estado ESTAB mostra a diferença prática em relação ao UDP. O TCP mantém estado de conexão nas pontas.

. Observar o handshake e o encerramento10.11.4

Se houver tcpdump instalado e permissão de sudo, rode antes de abrir a conexão TCP.

sudo tcpdump -i lo -nn 'tcp port 9998'

Depois abra a conexão com nc como no exemplo anterior. Na saída do tcpdump, procure as flags:

Flag no tcpdump Significado
[S] SYN
[S.] SYN + ACK
[.] ACK
[F.] FIN + ACK, comum no encerramento

Esse exemplo é útil para reforçar que o handshake não é uma metáfora. Ele aparece como segmentos TCP reais passando pela interface de loopback.

Fechando a ideia10.12

A camada de transporte existe porque a comunicação real acontece entre processos, não apenas entre máquinas. O UDP resolve o problema com o mínimo de controle: portas, checksum e nada mais. O TCP resolve o mesmo problema com uma abstração mais rica: conexão virtual, numeração de bytes, confirmações, retransmissões, controle de fluxo e reação a congestionamento.

A escolha entre os dois não é questão de "qual é melhor". É questão de qual combinação de simplicidade, confiabilidade, ordem e controle a aplicação realmente precisa.

Conclusão prática

Quando você vê uma aplicação usando TCP, entenda que há uma conexão lógica sendo mantida, com estado, buffers, timers e janelas. Quando vê UDP, entenda que a aplicação assumiu para si parte dessas responsabilidades ou deliberadamente não precisa delas.

Questões10.13

1. Explique a diferença entre comunicação nó a nó, host a host e processo a processo.

2. Por que o endereço IP sozinho não basta para entregar dados ao programa correto?

3. O que é uma porta na camada de transporte?

4. Diferencie porta conhecida e porta efêmera.

5. Explique multiplexação e demultiplexação na camada de transporte.

6. Um cliente 10.0.0.5:52000 acessa um servidor 200.1.1.10:443. Quais valores devem aparecer como origem e destino na resposta do servidor?

7. Cite duas características do UDP.

8. Por que o UDP pode ser adequado para uma consulta DNS simples?

9. Quais são os quatro campos do cabeçalho UDP?

10. Explique por que o TCP é chamado de protocolo orientado a conexão.

11. O que significa dizer que o TCP oferece um fluxo de bytes e não um fluxo de mensagens?

12. Uma conexão TCP envia bytes de 3001 a 4000 em um segmento. Qual é o número de sequência desse segmento?

13. Se um receptor TCP confirma com ACK = 7001, o que isso significa?

14. Descreva as três etapas do handshake TCP.

15. Diferencie controle de fluxo e controle de congestionamento.

16. O que acontece quando um segmento TCP chega corrompido?

17. Por que um segmento fora de ordem não deve ser entregue imediatamente à aplicação?

18. Marque V ou F.

  • ( ) O UDP estabelece conexão antes de enviar dados.
  • ( ) O TCP usa portas para identificar processos.
  • ( ) O número de confirmação TCP indica o próximo byte esperado.
  • ( ) Controle de fluxo protege principalmente a rede contra congestionamento.
  • ( ) Uma conexão TCP é virtual, não um circuito físico reservado.

19. Por que o cabeçalho TCP precisa de números de sequência e números de confirmação, enquanto o UDP não precisa?

20. Explique por que o TCP não preserva fronteiras de mensagens da aplicação.

21. O que é um socket no contexto da camada de transporte?

22. Por que o handshake de três vias ajuda a evitar confusão com segmentos antigos duplicados?

23. Diferencie perda de segmento de perda de ACK em uma conexão TCP.

24. Em que situação uma retransmissão TCP pode ser desnecessária, mas ainda assim correta?

25. Por que controle de fluxo e controle de congestionamento não são a mesma coisa?

26. Por que DNS pode usar UDP em consultas comuns, mas também pode usar TCP em outros casos?

Gabarito

1. Nó a nó é a entrega no enlace entre dispositivos adjacentes. Host a host é a entrega da camada de rede entre máquinas. Processo a processo é a entrega da camada de transporte entre aplicações em execução nos hosts.

2. Porque o IP identifica o host, mas não indica qual processo dentro do host deve receber os dados. A porta resolve essa identificação dentro da máquina.

3. É um número de 16 bits usado pela camada de transporte para identificar um ponto de comunicação associado a um processo ou serviço.

4. Porta conhecida é usada por serviços padronizados, como 80 para HTTP e 443 para HTTPS. Porta efêmera é temporária, geralmente escolhida pelo cliente para identificar uma conversa específica.

5. Multiplexação é reunir dados de vários processos na origem e encaminhá-los pela camada de rede. Demultiplexação é receber dados no destino e entregá-los ao processo correto com base nas portas.

6. A resposta deve ter origem 200.1.1.10:443 e destino 10.0.0.5:52000.

7. Exemplos possíveis: é um protocolo sem conexão (não estabelece circuito virtual), é não confiável (não confirma recebimento nem retransmite perdas) e não implementa controle de fluxo (não ajusta a taxa de envio ao receptor).

8. Porque a consulta é curta e pode ser repetida pela própria aplicação se não houver resposta. Assim, evita-se o custo de estabelecer uma conexão TCP para uma troca simples.

9. Porta de origem, porta de destino, comprimento e checksum.

10. Porque antes de transferir dados as duas pontas estabelecem uma conexão virtual, mantêm estado sobre ela e depois encerram essa conexão.

11. Significa que o TCP entrega uma sequência contínua de bytes. Ele não preserva obrigatoriamente as fronteiras das escritas feitas pela aplicação.

12. O número de sequência é 3001, pois ele identifica o primeiro byte transportado no segmento.

13. Significa que o receptor recebeu todos os bytes em ordem até 7000 e agora espera o byte 7001.

14. Primeiro, o cliente envia SYN. Segundo, o servidor responde com SYN + ACK. Terceiro, o cliente envia ACK, concluindo a abertura da conexão.

15. Controle de fluxo evita sobrecarregar o receptor. Controle de congestionamento evita injetar dados demais em uma rede congestionada.

16. Ele é descartado pelo TCP de destino e passa a ser tratado como perdido. A recuperação ocorre por retransmissão.

17. Porque o TCP promete entregar um fluxo ordenado de bytes. Entregar bytes fora de ordem quebraria a abstração oferecida à aplicação.

18.

  • ( F ) O UDP estabelece conexão antes de enviar dados.
  • ( V ) O TCP usa portas para identificar processos.
  • ( V ) O número de confirmação TCP indica o próximo byte esperado.
  • ( F ) Controle de fluxo protege principalmente a rede contra congestionamento.
  • ( V ) Uma conexão TCP é virtual, não um circuito físico reservado.

19. Porque o TCP precisa controlar um fluxo confiável de bytes. O número de sequência posiciona os bytes no fluxo, e o número de confirmação informa até onde o receptor recebeu corretamente. O UDP envia datagramas independentes e não mantém esse controle.

20. Porque o TCP trata os dados como uma sequência contínua de bytes. As divisões feitas em chamadas de escrita pela aplicação não são necessariamente iguais às divisões entregues na leitura.

21. É um ponto final de comunicação usado pela aplicação para enviar e receber dados, normalmente associado a um protocolo de transporte, endereço IP e porta.

22. Porque as duas pontas precisam confirmar explicitamente a tentativa atual de conexão e sincronizar números de sequência. Isso reduz o risco de uma mensagem antiga ser confundida com uma abertura nova.

23. Na perda de segmento, faltam bytes no receptor e o fluxo não progride. Na perda de ACK, o receptor já recebeu os bytes, mas o transmissor não sabe disso e pode retransmitir desnecessariamente.

24. Quando o segmento original chegou corretamente, mas o ACK se perdeu. O transmissor pode reenviar por timeout, e o receptor descarta a duplicata.

25. Controle de fluxo protege o receptor contra excesso de dados no buffer. Controle de congestionamento protege a rede contra excesso de tráfego em trânsito.

26. Consultas DNS comuns são pequenas e podem ser repetidas se a resposta não chegar, o que combina com UDP. TCP é usado quando a resposta é maior, quando há transferência de zonas ou quando o cenário exige sessão confiável.

Próximos passos10.14

Na próxima aula, o passo natural é subir para a camada de aplicação e observar como protocolos como DNS, HTTP e e-mail usam UDP e TCP para oferecer serviços concretos aos usuários.

Você verá que muitas decisões da aplicação dependem diretamente do transporte escolhido.