Alterei a janela inicial do TCP na minha máquina para 10, como mostrado abaixo
[user@site etc]$ sudo ip route change default via 17.255.209.1 dev eth0 proto static initcwnd 10
E alterado tcp_slow_start_after_idle
conforme mostrado abaixo
[user@site etc]$ sudo sysctl -a | grep tcp_slow_start_after_idle
net.ipv4.tcp_slow_start_after_idle = 0
uma rota ip mostra confirmação é dada abaixo
[user@site etc]$ ip route show
default via 17.255.209.1 dev eth0 proto static initcwnd 10
169.254.0.0/16 dev eth0 scope link metric 1002
17.255.209.0/24 dev eth0 proto kernel scope link src 17.255.209.19
Agora, quando eu faço um tcpdump no site, não pareço ver uma alteração na janela inicial com o WIN / MSS restante 4 como padrão. 5840/1460 = 4
[user@site etc]$ sudo tcpdump -n -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn and port 80'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
11:17:45.048174 IP 21.101.151.198.45873 > 17.255.209.19.http: Flags [S], seq 2008673341, win 5840, options [mss 1460,sackOK,TS val 1724223146 ecr 0,nop,wscale 6], length 0
O hit de curl que fiz na página da Web solicitou cerca de 30 KB de dados.
[user@machine ~]$ curl http://www.site.com/js/main.js > /dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 88212 100 88212 0 0 179k 0 --:--:-- --:--:-- --:--:-- 272k
O que poderia estar errado na minha abordagem?
Núcleo
[user~]$ uname -r
3.0.4x86_64-linode21
Como atualização, aqui estão os resultados quando tento google.com
[user@site ~]$ sudo tcpdump -n -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn and host www.google.com'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
17:20:28.033236 IP 17.255.209.19.42799 > 74.125.127.106.http: Flags [S], seq 3148947324, win 14600, options [mss 1460,sackOK,TS val 193695310 ecr 0,nop,wscale 4], length 0
Como você pode ver, o WIN / MSS é 14600/1460 = 10 neste caso
Eu tentei acessar meu site a partir da própria máquina do servidor através do curl e aqui está o resultado:
[user@site ~]$ sudo tcpdump -n -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn and host www.site.com'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
17:25:14.584338 IP 17.255.209.19.35008 > 17.255.209.19.http: Flags [S], seq 3894567470, win 32792, options [mss 16396,sackOK,TS val 193981861 ecr 0,nop,wscale 4], length 0
WIN / MSS é 32792/16396 = 2 neste caso
linux
networking
tcp
optimization
tcp-slow-start
Quintin Par
fonte
fonte
Respostas:
Eu acho que você está entendendo mal como o TCP funciona.
Cada pacote enviado sempre anunciará uma janela do receptor (também conhecida como RWIN) e um fator de escala opcional, consulte RFC 1323
O remetente não tem permissão para enviar mais do que a quantidade de dados especificada no RWIN sem que seja reconhecida. Dependendo da janela de congestionamento, o remetente pode decidir preencher o RWIN ou não.
Portanto, existem dois bits de informação que são públicos nos pacotes TCP. O RWIN no servidor e o RWIN no cliente. Ambas as figuras determinam qual pode ser o tamanho máximo da janela de congestionamento nas duas extremidades.
O RWIN no servidor é interessante quando estamos tentando otimizar o desempenho para, por exemplo, upload de arquivos.
O RWIN no cliente é interessante quando estamos tentando determinar a velocidade do download.
Nenhum desses números torna pública a janela de congestionamento .
Portanto, se eu tiver um RWIN de 64k, a janela de congestionamento no servidor poderá ser QUALQUER número menor que 64k.
A única maneira de determinar qual é a janela de congestionamento real é contar pacotes.
Se eu soubesse:
Se eu receber 2 pacotes de volta do servidor com 1452 bytes de comprimento dentro de ~ 200ms, é provável que a janela de congestionamento no servidor seja menor que 4356, porque se fossem maiores, seriam enviados 3 pacotes. Se o IW estivesse definido como 10, eu veria uma explosão de 10 pacotes em torno da marca de 200ms.
Se você alterar seu IW e quiser confirmar que a alteração funcionou, precisará contar os pacotes para obter uma estimativa do tamanho da janela de congestionamento no servidor.
Lembre-se de que você provavelmente deseja examinar a conversa diretamente após o SYN, SYN-ACK, ACK para garantir que não esteja olhando no meio de uma conversa (onde a janela de congestionamento já poderia ter crescido).
fonte
O tamanho da janela será o menor: tamanho da janela de inicialização do servidor ou cliente RWIN. Como 5840 é o RWIN padrão para Linux 2.6, parece que seu cliente é o fator limitante aqui.
Tente em uma caixa do Windows. O Windows XP possui um RWIN de 64k, versão mais recente 8k.
Fonte: http://www.cdnplanet.com/blog/tune-tcp-initcwnd-for-optimum-performance/ (a parte interessante está abaixo do vídeo)
Editar: expandir a resposta para torná-la mais clara:
Edit2: Os tcpdumps adicionados à pergunta mostram o servidor abrindo conexões com o google e com ele próprio ATUANDO COMO CLIENTE.
fonte