O campo Window (Janela), também conhecido como Tamanho da Janela de Recepção (Receiver Window ou rwnd), é um campo de 16 bits localizado no cabeçalho TCP. Sua função é fundamental para o Controle de Fluxo, impedindo que o remetente envie dados mais rápido do que o receptor consegue processar.
Em uma comunicação TCP, o Window Size anuncia ao parceiro quantos bytes de dados o receptor está disposto a aceitar no momento, além dos dados que já foram confirmados (ACKed). É o mecanismo que impede que um transmissor rápido “afogue” um receptor lento.
1. O Problema do Congestionamento do Receptor
Se o remetente (ex: um servidor web poderoso) puder enviar dados a 10 Gbps, mas o receptor (ex: um smartphone antigo) só conseguir processar dados a 100 Mbps, a diferença de velocidade causaria problemas.
- Sem Controle de Fluxo: O receptor receberia pacotes mais rápido do que poderia ler e processar a aplicação. Os pacotes se acumulariam no buffer de memória do receptor. Se o buffer encher, o sistema operacional seria forçado a descartar novos pacotes.
- Resultado: A largura de banda seria desperdiçada enviando dados que seriam perdidos, e o remetente teria que retransmitir tudo, gerando ineficiência total na rede.
2. Como Funciona a Janela Deslizante (Sliding Window)
O campo Window implementa o conceito de Janela Deslizante. Pense na janela como um “limite de crédito” de envio.
- O Valor: O valor no campo Window indica o número de bytes de espaço livre disponível no buffer de recepção do host que enviou o segmento.
- Anúncio: O receptor envia esse valor em todo segmento TCP (no cabeçalho) junto com o
ACK Number.- Exemplo: Se o receptor envia
ACK 1000eWindow 5000, ele está dizendo: “Recebi tudo até o 999. Tenho espaço no meu buffer para mais 5000 bytes. Você pode me enviar do byte 1000 até o 5999.”
- Exemplo: Se o receptor envia
3. Dinâmica da Janela (A Janela Desliza)
À medida que a aplicação no receptor lê os dados do buffer, espaço é liberado, e o valor da Janela aumenta. À medida que o remetente envia dados, o valor da janela disponível diminui. O conceito de “deslizante” refere-se ao movimento desse intervalo permitido:
- Envio: O remetente envia dados dentro da janela permitida. A janela “fechando” (o espaço livre diminui).
- Recepção: O receptor recebe os dados e os coloca no buffer.
- Processamento: A aplicação lê os dados do buffer.
- Atualização: O receptor envia um novo ACK com um valor de Janela maior (abrindo a janela).
- Deslizamento: O remetente agora pode enviar mais dados. O intervalo de bytes permitidos “deslizou” para frente no fluxo.
4. Janela Zero (Zero Window) - O Bloqueio
Se a aplicação do receptor estiver muito lenta (ex: um processo travado ou lendo dados de um disco rígido lento), o buffer de recepção pode encher completamente.
- Window = 0: O receptor envia um segmento com
Window 0. Isso é um comando de PARE. O remetente não deve enviar nenhum novo byte de dados. - Persistência: O remetente entra em modo de persistência. Ele não envia dados, mas envia pequenos segmentos de teste chamados Zero Window Probes (sondas de janela zero) periodicamente para perguntar: “Você já liberou algum espaço?”.
- Desbloqueio: Assim que a aplicação ler alguns dados, o receptor responde à sonda com um
Window > 0, e a transmissão retoma.
5. Limitação do Campo de 16 Bits e Escala de Janela (Window Scale)
O campo Window tem 16 bits, o que limita o tamanho máximo da janela anunciada a 65.535 bytes (aproximadamente 64 KB).
- O Problema: Em redes modernas de alta latência e alta largura de banda (ex: links de satélite ou backbones de 10 Gbps), uma janela de 64 KB é ridículamente pequena. O remetente enviaria 64 KB e teria que parar e esperar o ACK (latência), subutilizando drasticamente a capacidade do link.
-
A Solução (Window Scale - RFC 7323): Durante o Three-Way Handshake (no pacote SYN), os hosts podem negociar uma opção chamada Window Scale. Essa opção multiplica o valor do campo Window por um fator de escala (
2S
, onde
S
é o valor do shift).
- Com um scale de 14, o limite da janela vai de 65KB para aproximadamente 1 GB.
- Isso permite que o TCP preencha “tubos” longos e largos (Long Fat Networks - LFN), mantendo o pipe cheio de dados.
6. Distinção entre Janela de Recepção (rwnd) e Janela de Congestionamento (cwnd)
Embora este tópico foque no campo Window (rwnd), é vital entender que o remetente TCP respeita dois limites simultaneamente:
- rwnd (Receiver Window): O que o receptor consegue aguentar (definido pelo campo Window no cabeçalho). Evita sobrecarga do host.
- cwnd (Congestion Window): O que a rede consegue suportar (definido pelo algoritmo de controle de congestionamento do remetente). Evita colapso da rede.
O remetente só pode enviar dados até o limite do menor dos dois:
Envio Efetivo=min(rwnd,cwnd)