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.
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.
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_scalingdeve mostrar 1.sysctl net.ipv4.tcp_rmemmostra mínimo, padrão e máximo do buffer de recepção.ss -timostra, por conexão, o RTT medido e o campowscalecom os fatores das duas pontas.- No Windows,
netsh interface tcp show globalmostra 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
wscalenas duas pontas comss -tiou 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
- Meça o RTT real no horário do tráfego.
- Calcule o BDP: banda × RTT ÷ 8.
- Confirme que a escala de janela está ligada e aparece nas duas pontas.
- Confirme que o buffer máximo de recepção é maior que o BDP.
- 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.Fontes e referências
- RFC 7323: TCP Extensions for High Performance (IETF, setembro de 2014)Opção Window Scale: negociação no SYN pelas duas pontas e fator máximo de 14 (janela perto de 1 GiB)
- RFC 9293: Transmission Control Protocol (TCP) (IETF, agosto de 2022)Especificação atual do TCP: campo de janela de 16 bits no cabeçalho e funcionamento da janela de recepção
- RFC 6349: Framework for TCP Throughput Testing (IETF, agosto de 2011)Definição do BDP a partir do RTT e da banda do gargalo para dimensionar buffers de envio e recepção
- Linux kernel: IP Sysctl (documentação oficial)Parâmetros tcp_window_scaling e tcp_rmem (mínimo, padrão e máximo do buffer de recepção)
- taap.digital: Calculadora de tempo de transferênciaCalculadora para refazer a conta com a banda, o RTT e o arquivo do leitor
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.