04 - Full-Duplex
video: https://youtu.be/... no frontmatter da nota.Full-Duplex (Comunicação Bidirecional Simultânea)
A característica Full-Duplex (Duplicação Completa ou Duplo Sentido) na Camada de Transporte refere-se à capacidade de um protocolo (notadamente o TCP) de suportar a transmissão de dados em ambas as direções simultaneamente e de forma independente sobre uma única conexão lógica.
Em um serviço Full-Duplex, os dois hosts (Cliente e Servidor) podem atuar como emissores e receptores ao mesmo tempo. Não é necessário esperar que um lado termine de enviar seus dados para que o outro lado comece a enviar os seus. Isso contrasta com o modelo Half-Duplex (como um rádio walkie-talkie), onde apenas um lado pode falar de cada vez, ou o Simplex (como uma rádio FM), onde a transmissão ocorre apenas em um sentido.
1. Comparação: Simplex, Half-Duplex e Full-Duplex
| Modo | Direção | Exemplos |
|---|---|---|
| Simplex | A → B (uma via) | Rádio FM, TV aberta, sensor unidirecional |
| Half-Duplex | A ↔ B (alternada) | Walkie-talkie, Ethernet clássico (CSMA/CD) |
| Full-Duplex | A ⇄ B (simultânea) | Telefone moderno, Ethernet em switch, TCP |
Diagrama Ilustrativo
SIMPLEX: A ──────► B (só A fala)
HALF-DUPLEX: A ──────► B (A fala, B ouve)
A ◄────── B (depois B fala, A ouve)
FULL-DUPLEX: A ──────► B (A e B falam E ouvem simultaneamente)
A ◄────── B
2. Dois Fluxos de Dados Independentes
Embora estabeleçamos apenas uma conexão TCP (um circuito virtual), ela é composta internamente por dois fluxos de dados separados e independentes:
- Fluxo A → B: Dados enviados do Cliente para o Servidor.
- Fluxo B → A: Dados enviados do Servidor para o Cliente.
Esses fluxos coexistem no mesmo tubo físico, mas são logicamente distintos. Isso significa que o Cliente pode estar enviando um arquivo de 1 GB para o Servidor (fluxo A → B) enquanto, simultaneamente, o Servidor envia uma mensagem de erro ou status para o Cliente (fluxo B → A), sem que um trânsito interfira na capacidade do outro.
3. Números de Sequência Independentes
Para gerenciar esses dois fluxos simultâneos sem confusão, o protocolo de transporte mantém dois conjuntos separados de Números de Sequência (Sequence Numbers) para a mesma conexão:
- Seq_A → B: Usado para numerar os bytes que o Cliente envia.
- Seq_B → A: Usado para numerar os bytes que o Servidor envia.
Quando o Cliente envia um segmento, ele inclui o número de sequência referente aos dados que ele está enviando. Quando o Servidor recebe isso, ele olha para esse número para ordenar os dados do fluxo A → B. A presença de dois espaços de numeração garante que a confirmação de recebimento (ACK) de dados em uma direção não se confunda com os dados sendo enviados na direção oposta.
Estrutura do Cabeçalho TCP
| Campo | Sentido do Fluxo |
|---|---|
| Sequence Number | Próprio fluxo de envio |
| Acknowledgment Number | Confirma fluxo reverso |
| Window Size | Buffer disponível para receber |
4. Piggybacking (Carona de ACKs)
A principal vantagem técnica do modo Full-Duplex na Camada de Transporte é a eficiência obtida através do Piggybacking.
Como os dados fluem em ambas as direções simultaneamente, o protocolo utiliza os segmentos de dados que estão indo em uma direção para carregar as confirmações (ACKs) dos dados que vieram na direção oposta.
Exemplo Prático
Suponha que o Host A esteja enviando dados para o Host B. Simultaneamente, o Host B também tem dados para enviar para o Host A.
- Sem Piggybacking: B precisaria enviar dois pacotes: um ACK puro confirmando dados de A, e depois outro pacote com seus próprios dados.
- Com Piggybacking: B envia um único segmento contendo:
1. Payload: Os dados que B quer enviar para A.
2. Acknowledgment Number: Confirmação dos dados recebidos de A. - Resultado: Reduz significativamente o tráfego de controle na rede e melhora a utilização da largura de banda (overhead cortado pela metade).
5. Controle de Fluxo e Congestionamento Assimétrico
O fato de ser Full-Duplex permite que os mecanismos de controle sejam ajustados independentemente para cada direção da conexão, embora a conexão lógica seja única.
Janela de Recepção (rwnd) Independente
O Host A pode ter muito espaço de buffer disponível para receber dados de B (grande rwnd), permitindo que B envie rápido. Ao mesmo tempo, o Host B pode estar ocupado e com pouco buffer, enviando para A um anúncio de janela baixo (rwnd pequeno), forçando A a enviar devagar. A velocidade em uma direção não dita a velocidade na direção oposta.
Controle de Congestionamento (cwnd)
Embora o congestionamento afete o caminho físico (que geralmente é compartilhado), as decisões de controle de congestionamento (cwnd) podem ser tomadas independentemente com base nos ACKs recebidos em cada direção. Se A está perdendo ACKs para seus dados (indício de congestionamento A→B), isso não afeta a velocidade de envio de B→A.
6. Encerramento Full-Duplex: Four-Way Handshake
Como a conexão é bidirecional independente, o encerramento também é independente. Cada lado fecha seu fluxo de envio separadamente com um FIN:
A → B: FIN, ACK (A não tem mais dados para enviar)
B → A: ACK (B confirma, mas pode ainda ter dados)
B → A: ... dados ... (B continua enviando, A só ouve)
B → A: FIN, ACK (B agora também terminou)
A → B: ACK (A confirma encerramento)
Esse processo de quatro vias (Four-Way Handshake) é necessário porque o TCP é Full-Duplex: cada direção precisa ser fechada independentemente. O estado CLOSE_WAIT e FIN_WAIT no TCP refletem essa independência.
7. Vantagens e Aplicações
O modo Full-Duplex é essencial para a interatividade moderna:
- Baixa Latência de Comando: Em aplicações interativas (como SSH ou Telnet), o usuário digita um caractere (fluxo Cliente → Servidor) enquanto o servidor envia a resposta na tela (fluxo Servidor → Cliente) simultaneamente.
- Throughput Máximo: Utiliza toda a capacidade do enlace em ambos os sentidos simultaneamente. Em um link de 100 Mbps Full-Duplex, você tem teoricamente 100 Mbps de upload E 100 Mbps de download acontecendo ao mesmo tempo.
- HTTP Persistente: Navegação web moderna permite baixar múltiplos objetos (imagens, CSS) em uma única conexão TCP aberta. O cliente pode solicitar a imagem 1 enquanto já está recebendo a imagem 2 e enviando o pedido da imagem 3, tudo Full-Duplex.
- Streaming Bidirecional: Aplicações como WebSockets, videoconferência (WebRTC) e jogos online dependem de Full-Duplex para operar com latência baixa em ambos os sentidos.
8. Suporte Full-Duplex na Camada Física
Para que o TCP opere Full-Duplex efetivamente, o meio físico também deve suportar transmissão simultânea bidirecional:
| Meio Físico | Suporta Full-Duplex? | Como |
|---|---|---|
| Ethernet com Switch | Sim | Par separado para TX e RX (Cat 5+) |
| Ethernet com Hub | Não (Half-Duplex) | Domínio de colisão único (CSMA/CD) |
| Wi-Fi 802.11 clássico | Não (Half-Duplex) | Compartilha espectro (CSMA/CA) |
| Wi-Fi com MIMO OFDMA | Parcial (simulação) | Wi-Fi 7 melhora com DL/UL OFDMA |
| Fibra com 2 cores | Sim | Um core para TX, outro para RX |
| Fibra com 1 core (WDM) | Sim | Comprimentos de onda distintos (CWDM/DWDM) |
| Rádio Full-Duplex | Sim (em laboratório) | Cancelamento de auto-interferência |
9. Conclusão
O Full-Duplex na Camada de Transporte transforma o canal de comunicação em uma "autoestrada de mão dupla", onde o tráfego em uma direção não bloqueia o tráfego na direção oposta, maximizando a eficiência e a interatividade da comunicação. A combinação de números de sequência independentes, piggybacking de ACKs e encerramento Four-Way faz do TCP um protocolo Full-Duplex sofisticado que sustenta praticamente toda a comunicação interativa da Internet moderna.
| Atributo | Valor |
|---|---|
| Modo de operação TCP | Full-Duplex |
| Fluxos de dados por conexão | 2 (independentes) |
| Números de sequência | Um por fluxo (Seq_A, Seq_B) |
| ACKs | Piggybacked em segmentos de dados reversos |
| Encerramento | Four-Way Handshake (FIN/ACK/FIN/ACK) |
| RFC referência | RFC 793 (TCP), RFC 9293 (TCP modernizado) |