taap.digitalferramentas para engenharia de redes

Guia prático

Janela TCP em alta latência: por que o link rende pouco

Um link de 1 Gbit/s entre sede e data center de backup entrega menos de 9 Mbit/s numa cópia de um fluxo só. O problema não é a operadora: é a janela TCP. Este guia faz a conta do BDP, acha o fator de escala certo e mostra onde a janela costuma ficar presa.

Equipamento óptico com cabos de fibra amarelos e verdes ligados em um rack
Um link de 1 Gbit/s só rende o que a janela TCP permite: o gargalo está no protocolo, não na fibra. Foto: Kirill Sh / Unsplash

O caso: uma empresa contratou um link de 1.000 Mbit/s entre a sede e o data center de backup. O RTT medido com ping é de 60 ms. A cópia noturna de um arquivo de 50 GB, feita por um único fluxo TCP, não passa de 8,7 Mbit/s, e a equipe abriu chamado na operadora. Banda, RTT e tamanho do arquivo são um exemplo, não um caso real.

Resposta curta: o link está bom. Quem trava é a janela TCP. Sem a opção de escala de janela do RFC 7323, cada fluxo só pode ter 65.535 bytes em trânsito, e isso rende 8,7 Mbit/s a 60 ms, ou 0,9% do link. Para encher o cano, a janela precisa chegar a 7.500.000 bytes (o BDP), o que pede fator de escala 7. A cópia cai de 12,7 horas para cerca de 7 minutos.

Por que a latência limita a vazão

O TCP não manda dados à vontade. O receptor anuncia uma janela: quantos bytes ele aceita receber antes de confirmar. O transmissor envia até esse limite e espera a confirmação (ACK). A confirmação só volta depois de um RTT, o tempo de ida e volta.

Então, por fluxo, a vazão máxima é:

vazão = janela ÷ RTT

O campo de janela no cabeçalho TCP tem 16 bits. O maior valor é 65.535 bytes, cerca de 64 KiB. Com RTT de 60 ms, a conta fica:

  • 65.535 bytes × 8 = 524.280 bits por RTT
  • 524.280 bits ÷ 0,060 s = 8,74 Mbit/s

Não importa se o link tem 1.000 Mbit/s ou 10.000 Mbit/s. Com essa janela, o fluxo fica parado em 8,7 Mbit/s, porque passa a maior parte do tempo esperando ACK.

Passo 1: meça o RTT e calcule o BDP

O BDP (produto banda × atraso) diz quantos bytes cabem "dentro do cano" durante um RTT. O RFC 6349, que descreve testes de vazão TCP, usa o BDP para dimensionar os buffers de envio e de recepção.

BDP (bytes) = banda (bit/s) × RTT (s) ÷ 8

No caso:

  • 1.000 Mbit/s = 1.000.000.000 bit/s
  • 1.000.000.000 × 0,060 s = 60.000.000 bits
  • ÷ 8 = 7.500.000 bytes, ou 7,15 MiB

A janela de 64 KiB é 0,87% desse valor. Por isso o link fica quase vazio.

Use o RTT do caminho real, medido com ping ou com a própria ferramenta de cópia, e não o valor teórico. Se não tiver medição, dá para estimar o mínimo pela distância. A luz na fibra leva cerca de 5 µs por km (aproximação). Uma rota de 3.000 km de fibra (exemplo) tem RTT mínimo de 30 ms, antes de filas e equipamentos.

Passo 2: veja quanto a janela de 64 KiB rende em cada RTT

A tabela usa um link de 1.000 Mbit/s e um fluxo com janela fixa de 65.535 bytes. A vazão é o menor valor entre a banda e a janela ÷ RTT.

RTT Situação de exemplo Vazão máxima do fluxo Uso do link
1 ms Mesmo prédio 524,3 Mbit/s 52,4%
5 ms Mesma cidade 104,9 Mbit/s 10,5%
20 ms Mesma região 26,2 Mbit/s 2,6%
60 ms Outra região do país 8,74 Mbit/s 0,87%
120 ms Outro continente 4,37 Mbit/s 0,44%
600 ms Satélite geoestacionário 0,87 Mbit/s 0,09%

Os RTTs da tabela são exemplos. No satélite geoestacionário, só a propagação já pesa: o satélite fica a 35.786 km de altitude, e um RTT passa quatro vezes por essa distância. São 477 ms só de viagem da luz no vácuo, sem contar processamento.

Detalhe de um rack de equipamentos em sala de servidores
No servidor de backup, o buffer de recepção precisa ser maior que o BDP para a janela crescer. Foto: Tyler / Unsplash

Passo 3: calcule o fator de escala

O RFC 7323 resolve o limite dos 16 bits com a opção Window Scale. As duas pontas anunciam, no SYN, um fator de escala (shift). A janela anunciada passa a ser multiplicada por 2 elevado a esse fator. O RFC limita o fator a 14.

O fator mínimo é o menor número que faz 65.535 × 2^fator alcançar o BDP:

  • BDP ÷ janela = 7.500.000 ÷ 65.535 = 114,4
  • log2(114,4) = 6,84
  • arredondado para cima: fator 7
  • janela máxima com esse fator: 65.535 × 128 = 8.388.480 bytes

Com o fator máximo de 14, a janela chega a 1.073.725.440 bytes, perto de 1 GiB. Isso cobre, por exemplo, 85,9 Gbit/s a 100 ms de RTT.

Cenário de exemplo Banda RTT BDP Fator mínimo
Filial regional 100 Mbit/s 30 ms 375.000 bytes 3
Backup entre regiões (o caso) 1.000 Mbit/s 60 ms 7.500.000 bytes 7
Réplica em outro continente 1.000 Mbit/s 120 ms 15.000.000 bytes 8
Data centers a 10 Gbit/s 10.000 Mbit/s 60 ms 75.000.000 bytes 11
Satélite geoestacionário 50 Mbit/s 600 ms 3.750.000 bytes 6

Repare no satélite: o link é 20 vezes mais lento que o do caso, mas o BDP é da mesma ordem, porque o RTT é 10 vezes maior.

Passo 4: confira os buffers do sistema

A opção de escala só abre espaço. Quem decide o tamanho real da janela é o buffer de recepção do sistema operacional. Se o buffer for menor que o BDP, a janela para nele.

Exemplo: se o buffer máximo de recepção estiver limitado a 4 MiB, a conta fica:

  • 4.194.304 bytes × 8 ÷ 0,060 s = 559 Mbit/s
  • a cópia de 50 GB leva cerca de 12 minutos, contra 7 minutos com o link cheio

No Linux, o terceiro valor de net.ipv4.tcp_rmem é o teto do ajuste automático do buffer de recepção. O padrão muda com a versão do kernel e a memória da máquina, então leia o valor no próprio servidor. Ele precisa ser maior que o BDP, com folga, porque parte do buffer vai para controle interno e não vira janela.

Comandos para conferir:

  • sysctl net.ipv4.tcp_window_scaling deve mostrar 1.
  • sysctl net.ipv4.tcp_rmem mostra mínimo, padrão e máximo do buffer de recepção.
  • ss -ti mostra, por conexão, o RTT medido e o campo wscale com os fatores das duas pontas.
  • No Windows, netsh interface tcp show global mostra o nível do ajuste automático da janela de recepção.

Passo 5: calcule o resultado esperado

Com a janela acima do BDP, o limite volta a ser o link. Mesmo assim, nem todo bit é dado útil. Num quadro Ethernet de 1500 bytes de MTU com timestamps TCP ligados:

  • carga útil por segmento: 1500 − 20 (IP) − 20 (TCP) − 12 (timestamps) = 1.448 bytes
  • bytes no fio por quadro: 1500 + 14 (cabeçalho) + 4 (FCS) + 8 (preâmbulo) + 12 (intervalo) = 1.538 bytes
  • eficiência: 1.448 ÷ 1.538 = 94,1%
  • vazão útil máxima: 941,5 Mbit/s
Situação Vazão do fluxo Tempo para 50 GB
Janela de 64 KiB, sem escala 8,7 Mbit/s 12,7 h
Buffer limitado a 4 MiB (exemplo) 559 Mbit/s 12 min
Janela acima do BDP 941 Mbit/s 7 min

Esse é o teto teórico sem perda. Perda de pacotes reduz a janela de congestionamento do transmissor, um limite separado da janela de recepção, e a vazão cai abaixo desses números.

Erros comuns

  • Culpar a operadora pelo teste de um fluxo só. Um teste com um único fluxo TCP mede a janela, não o link. Antes do chamado, calcule janela ÷ RTT e compare.
  • Achar que mais banda resolve. Com janela de 64 KiB e 60 ms, um link de 10.000 Mbit/s rende os mesmos 8,74 Mbit/s por fluxo.
  • Equipamento no caminho que remove opções TCP. A escala só vale se as duas pontas enviarem a opção no SYN. Um firewall ou otimizador que apaga a opção deixa a janela presa em 64 KiB. Confira o wscale nas duas pontas com ss -ti ou numa captura do handshake.
  • Buffer fixo na aplicação. No Linux, uma aplicação que fixa o buffer do socket (SO_RCVBUF) desliga o ajuste automático daquela conexão. Se o valor fixo for menor que o BDP, ele vira o limite.
  • Confundir Mbit/s com MB/s. 941 Mbit/s são 118 MB/s na tela da ferramenta de cópia.
  • Usar o RTT do ping em horário vazio. Com fila, o RTT cresce e o BDP também. Dimensione com o RTT do horário da cópia.

Checklist rápido

  1. Meça o RTT real no horário do tráfego.
  2. Calcule o BDP: banda × RTT ÷ 8.
  3. Confirme que a escala de janela está ligada e aparece nas duas pontas.
  4. Confirme que o buffer máximo de recepção é maior que o BDP.
  5. Teste de novo e compare com a vazão útil esperada de 941 Mbit/s.

Perguntas frequentes

Qual é o tamanho máximo da janela TCP?

Sem a opção de escala, 65.535 bytes, porque o campo tem 16 bits. Com o fator máximo de 14 do RFC 7323, 1.073.725.440 bytes, perto de 1 GiB.

Quanto rende um link de 1 Gbit/s com 100 ms de RTT sem escala de janela?

Cerca de 5,24 Mbit/s por fluxo: 524.280 bits ÷ 0,1 s. Isso é 0,52% do link.

Abrir vários fluxos em paralelo resolve?

Ajuda, porque cada fluxo tem sua janela. Mas, no caso de 60 ms, seriam precisos 115 fluxos de 64 KiB para somar o BDP de 7.500.000 bytes. Ligar a escala de janela é bem mais simples.

Qual fator de escala preciso para 10 Gbit/s com 60 ms?

O BDP é 75.000.000 bytes. Dividido por 65.535 dá 1.144, e o log2 arredondado para cima dá fator 11. A janela máxima fica em 134.215.680 bytes.

Por que o link via satélite rende pouco mesmo com banda baixa?

Porque o RTT é alto. A 50 Mbit/s e 600 ms, o BDP é 3.750.000 bytes. Com janela de 64 KiB, o fluxo fica em 0,87 Mbit/s, ou 1,7% do link.

Refaça a conta com a sua banda, o seu RTT e o tamanho do arquivo na calculadora de tempo de transferência.

Leia também: Por que a janela TCP limita a velocidade em links longos

xfer-timeFaça a conta com os seus númerosQuanto tempo leva para mover GB ou TB por um link de Mbps ou Gbps.
Abrir Tempo de transferência com este caso →

Fontes e referências

Conferimos cada afirmação técnica nas fontes acima. Os números foram calculados com as mesmas fórmulas das ferramentas do site. Veja a metodologia e a lista completa de fontes.

Outros guias