taap.digitalferramentas para engenharia de redes

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.

Grandes antenas parabólicas em campo aberto ao amanhecer
Distância é atraso: quanto mais longe o outro lado, mais dado precisa estar em trânsito para manter o link cheio. Foto: Donald Giannatti / Unsplash

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:

vazão máxima = janela ÷ 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:

BDP = banda × RTT ÷ 8 (em bytes)

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.

Rack de servidores com luzes verdes acesas
A janela TCP é negociada entre os sistemas das duas pontas, não pelo link: é no servidor que o ajuste acontece. Foto: Domaintechnik / Unsplash

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

  1. Meça o RTT real (ping ou o handshake na captura) e calcule o BDP.
  2. 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.
  3. Na captura, confira a opção window scale e a janela anunciada.
  4. Meça a perda no caminho. Com perda, aumentar a janela ajuda pouco.
  5. 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.
Abrir BDP / janela TCP 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