Guia prático
Por que a janela TCP limita a velocidade em links longos
A filial tem um link de 1 Gbps, mas a cópia de arquivos para o data center em outro continente não passa de poucos megabits por segundo. O problema quase nunca é o link: é quanto dado o TCP pode deixar em trânsito antes de esperar a confirmação.
O caso: a filial tem um link de 1 Gbps até o data center, com RTT (tempo de ida e volta) de 150 ms. Uma cópia de arquivo usa uma única conexão TCP, e um equipamento no caminho limita a janela a 64 KiB.
Resposta curta: com janela de 64 KiB e 150 ms de RTT, uma conexão não passa de 3,50 Mbps, 0,350% do link. Para encher 1 Gbps, a janela precisa ter 17,9 MiB, o produto banda × atraso. O window scaling da RFC 7323 permite isso com um deslocamento de 9.
1. O TCP trabalha em rodadas
O TCP não manda dados sem parar. O receptor anuncia uma janela: quantos bytes o emissor pode enviar sem ter recebido confirmação. Quando a janela se esgota, o emissor espera. A confirmação só chega depois de um tempo de ida e volta (RTT).
Se a janela é pequena e o RTT é grande, o emissor passa a maior parte do tempo esperando. O teto de uma conexão é, no máximo, uma janela por RTT:
No caso: 64 KiB são 65.536 bytes, ou 524.288 bits. Divididos por 0,150 s, dão 3,50 Mbps. Não importa se o link é de 100 Mbps ou de 10 Gbps: a conexão não passa disso.
2. O produto banda × atraso
A RFC 6349 define o BDP como a capacidade do enlace multiplicada pelo atraso fim a fim. Na prática, é a quantidade de dados que "cabe no cano" durante um RTT:
Para 1 Gbps e 150 ms: 1.000.000.000 × 0,150 ÷ 8 = 18.750.000 bytes, ou 17,9 MiB. Para usar o link inteiro com uma conexão, a janela precisa ser pelo menos desse tamanho.
A calculadora de BDP e janela TCP faz as duas contas e diz qual dos limites (link, janela ou perda) manda em cada caso.
3. A mesma janela em RTTs diferentes
O efeito cresce com a distância. Com janela fixa de 64 KiB em um link de 1 Gbps:
| RTT | Teto com 64 KiB | BDP do link | Uso do link |
|---|---|---|---|
| 2 ms | 262 Mbps | 244 KiB | 26,2% |
| 10 ms | 52,4 Mbps | 1.221 KiB | 5,24% |
| 50 ms | 10,5 Mbps | 6.104 KiB | 1,05% |
| 100 ms | 5,24 Mbps | 12.207 KiB | 0,524% |
| 150 ms | 3,50 Mbps | 18.311 KiB | 0,350% |
| 300 ms | 1,75 Mbps | 36.621 KiB | 0,175% |
| 600 ms | 0,874 Mbps | 73.242 KiB | 0,087% |
Em uma rede local, com 2 ms, 64 KiB já entregam 262 Mbps. Em um enlace intercontinental, a mesma janela entrega uma fração pequena do link. É por isso que o problema aparece "só na filial" ou "só com o data center de fora".
4. Por que 64 KiB: o campo de 16 bits
O cabeçalho TCP reserva 16 bits para a janela. O maior valor possível é 65.535 bytes, praticamente 64 KiB. Com o TCP original, nenhuma conexão anunciava mais que isso.
A RFC 7323 resolve com a opção window scale, negociada na abertura da conexão. Cada lado informa um deslocamento s, e a janela anunciada passa a valer o campo × 2s. O deslocamento máximo é 14, o que leva a janela a 65.535 × 214 = 1.073.725.440 bytes, perto de 1 GiB.
Para o caso, a janela precisa cobrir 18.750.000 bytes. O menor deslocamento que atende é s = 9: 65.535 × 29 = 33.553.920 bytes. Com o máximo de 14, o teto teórico de uma conexão a 150 ms seria 57,3 Gbps.
5. Se a janela pode crescer, por que fica em 64 KiB?
Os sistemas operacionais atuais negociam window scale e ajustam a janela sozinhos. Quando uma conexão longa fica presa perto de 64 KiB, procure a causa no caminho ou na configuração. As mais prováveis:
- Equipamento que remove ou reescreve a opção na abertura da conexão (firewall, otimizador de WAN, proxy). Sem a opção, as duas pontas voltam ao campo de 16 bits.
- Buffers de recepção limitados no sistema ou na aplicação. A janela anunciada não passa do buffer disponível.
- Aplicação que fixa o tamanho do socket com um valor baixo, desligando o ajuste automático.
Para diagnosticar, capture o início da conexão e veja se a opção window scale aparece nos dois sentidos. Depois, compare a janela anunciada durante a transferência com o BDP calculado.
Se o problema for só a janela e ela puder subir para, digamos, 4 MiB, o teto vai para 224 Mbps. Ainda é 22,4% do link. Para o link inteiro, a janela tem de chegar ao BDP de 17,9 MiB.
A conta ao contrário
A mesma fórmula responde à pergunta do projeto: de que janela eu preciso para a vazão que quero? Basta multiplicar a vazão desejada pelo RTT. A 150 ms:
| Vazão desejada por conexão | Janela necessária | Deslocamento mínimo (window scale) |
|---|---|---|
| 10 Mbps | 183 KiB | 2 |
| 50 Mbps | 916 KiB | 4 |
| 100 Mbps | 1.831 KiB | 5 |
| 500 Mbps | 9.155 KiB | 8 |
| 1.000 Mbps | 18.311 KiB | 9 |
E, para uma janela fixa, o RTT máximo que ainda entrega a vazão desejada é janela ÷ vazão. Com 64 KiB, 100 Mbps só são possíveis até 5,24 ms de RTT, e 10 Mbps até 52,4 ms. Acima disso, nenhuma configuração de link muda o resultado; só a janela.
Essa inversão é útil para conversar com quem contrata o link. Se a aplicação precisa de 500 Mbps por conexão entre dois sites a 150 ms, o requisito não é só "link de 1 Gbps": é também janela de pelo menos 8,94 MiB nas duas pontas e nenhum equipamento no caminho removendo a opção window scale.
6. Quanto tempo isso custa
Em números de operação: copiar 50 GB por uma única conexão limitada a 3,50 Mbps leva cerca de 31 h 47 min. Com o link inteiro, levaria 6 min, sem contar overhead. O tempo de transferência faz essa conta com o overhead que você informar.
Uma saída paliativa é abrir várias conexões em paralelo. Para somar 1 Gbps com janelas de 64 KiB a 150 ms, seriam necessárias 287 conexões. Ferramentas de cópia e de teste de vazão costumam ter essa opção, mas ela não corrige a causa.
7. Perda de pacotes: o terceiro limite
Mesmo com janela grande, a perda limita a vazão. O modelo de Mathis, Semke, Mahdavi e Ott (1997) estima o teto de uma conexão em regime como MSS ÷ RTT × C ÷ √p, em que p é a taxa de perda. A calculadora usa C = 1,22 e MSS de 1.460 bytes.
| RTT | Perda | Teto pelo modelo |
|---|---|---|
| 150 ms | 0,01% | 9,50 Mbps |
| 150 ms | 0,1% | 3,00 Mbps |
| 20 ms | 0,1% | 22,5 Mbps |
A perda pesa mais quanto maior o RTT. Com 0,1% de perda, o mesmo TCP que entrega 22,5 Mbps a 20 ms cai para 3,00 Mbps a 150 ms.
O modelo vale para o controle de congestionamento clássico, baseado em perda. Os próprios autores publicaram em 2019 que ele tende a ficar obsoleto com algoritmos como o BBR, que não reagem à perda da mesma forma. Use o número como referência de ordem de grandeza, não como promessa.
8. Roteiro de diagnóstico
- Meça o RTT real (ping ou o handshake na captura) e calcule o BDP.
- Teste com uma conexão e com várias. Se várias somam muito mais que uma, o limite é por conexão: janela ou perda.
- Na captura, confira a opção window scale e a janela anunciada.
- Meça a perda no caminho. Com perda, aumentar a janela ajuda pouco.
- Só então pense em trocar o link.
Perguntas frequentes
Aumentar a banda do link resolve?
Não, se o limite for a janela. Com 64 KiB a 150 ms, a conexão fica em 3,50 Mbps em um link de 1 Gbps ou de 10 Gbps. Mais banda só ajuda quando o limite é o próprio link, e a calculadora indica no resultado qual dos três limites está mandando.
KiB ou KB?
A calculadora usa KiB (1.024 bytes) para a janela, que é como os sistemas costumam reportar buffers. O BDP em bytes é o mesmo; só muda a unidade em que ele é exibido.
Posso usar o ping para medir o RTT?
Para a conta, sim, como primeira aproximação. O ping mede o tempo de ida e volta de pacotes ICMP, que alguns equipamentos tratam com prioridade diferente. O valor mais fiel ao TCP é o intervalo entre o SYN e o SYN-ACK na captura da própria conexão.
UDP tem o mesmo problema?
Não da mesma forma, porque o UDP não tem janela nem confirmação. Mas protocolos sobre UDP que garantem entrega têm controle de fluxo próprio, e o mesmo raciocínio de banda × atraso vale para eles.
Onde faço a conta do meu link?
Na calculadora de BDP e janela TCP: informe banda, RTT, janela e, se quiser, a perda e o MSS. Há respostas prontas como BDP de 1 Gbps com 100 ms e 10 Gbps com 100 ms.
tcp-bdpFaça a conta com os seus númerosBanda × RTT: a janela TCP que o link precisa e a vazão real de um fluxo.Fontes e referências
- RFC 7323 — TCP Extensions for High PerformanceOpção window scale, deslocamento máximo de 14 e janela máxima perto de 1 GiB
- RFC 6349 — Framework for TCP Throughput TestingDefinição do BDP como capacidade do enlace × atraso fim a fim
- Mathis, Semke, Mahdavi e Ott (1997) — The Macroscopic Behavior of the TCP Congestion Avoidance AlgorithmModelo do teto de vazão com perda: MSS/RTT × C/√p
- Mathis e Mahdavi (2019) — Deprecating The TCP Macroscopic ModelLimite do modelo de 1997 diante de controles de congestionamento como o BBR
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.