J'ai changé la fenêtre initiale TCP sur ma machine à 10 comme indiqué ci-dessous
[user@site etc]$ sudo ip route change default via 17.255.209.1 dev eth0 proto static initcwnd 10
Et changé tcp_slow_start_after_idle
comme indiqué ci-dessous
[user@site etc]$ sudo sysctl -a | grep tcp_slow_start_after_idle
net.ipv4.tcp_slow_start_after_idle = 0
une confirmation d'exposition de route ip est donnée ci-dessous
[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
Maintenant, quand je fais un tcpdump sur le site Web, je ne semble pas voir de changement dans la fenêtre initiale avec le WIN / MSS restant 4 par défaut. 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
Le curl hit que j'ai fait sur la page Web a demandé environ 30 Ko de données.
[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
Quel pourrait être le problème dans mon approche?
Noyau
[user~]$ uname -r
3.0.4x86_64-linode21
En tant que mise à jour, voici les résultats lorsque j'essaie 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
Comme vous pouvez le voir, WIN / MSS est 14600/1460 = 10 dans ce cas
J'ai essayé de frapper mon site depuis la machine serveur elle-même via curl et voici le résultat:
[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 est 32792/16396 = 2 dans ce cas
la source
Réponses:
Je pense que vous comprenez mal le fonctionnement de TCP.
Chaque paquet envoyé annoncera toujours une fenêtre de récepteur (aka. RWIN) et un facteur d'échelle facultatif, voir RFC 1323
L'expéditeur n'est pas autorisé à envoyer plus que la quantité de données spécifiée dans le RWIN sans qu'il soit reconnu. Selon la fenêtre de congestion, l'expéditeur peut décider de remplir le RWIN ou non.
Ainsi, il y a deux bits d'informations qui sont publics dans les paquets TCP. Le RWIN sur le serveur et le RWIN sur le client. Ces deux chiffres dictent la taille maximale de la fenêtre de congestion aux deux extrémités.
Le RWIN sur le serveur est intéressant lorsque nous essayons d'optimiser les performances pour les téléchargements de fichiers.
Le RWIN sur le client est intéressant lorsque nous essayons de déterminer la vitesse de téléchargement.
Aucun de ces chiffres ne rend public la fenêtre de congestion à l'autre extrémité .
Donc, si j'ai un RWIN de 64k, la fenêtre de congestion sur le serveur peut être N'IMPORTE QUEL numéro inférieur à 64k.
La seule façon de déterminer la fenêtre de congestion réelle est de compter les paquets.
Si je sais:
Si je récupère 2 paquets du serveur d'une longueur de 1452 octets dans ~ 200 ms, il est probable que la fenêtre de congestion sur le serveur soit inférieure à 4356, car s'il était plus grand, 3 paquets seraient envoyés. Si IW était réglé sur 10, je verrais une rafale de 10 paquets autour de la marque des 200 ms.
Si vous modifiez votre IW et souhaitez confirmer que la modification a fonctionné, vous devez compter les paquets pour obtenir une estimation de la taille de la fenêtre de congestion sur le serveur.
Gardez à l'esprit, vous voudrez probablement regarder la conversation directement après le SYN, SYN-ACK, ACK pour vous assurer que vous ne regardez pas au milieu d'une conversation (où la fenêtre de congestion aurait déjà pu s'agrandir).
la source
La taille de la fenêtre sera la plus petite: taille de la fenêtre d'initialisation du serveur ou RWIN client. Étant donné que 5840 est le RWIN par défaut pour Linux 2.6, il semble que votre client soit le facteur limitant ici.
Essayez à partir d'une boîte Windows. Windows XP a un RWIN de 64k, une version plus récente 8k.
Source: http://www.cdnplanet.com/blog/tune-tcp-initcwnd-for-optimum-performance/ (La partie intéressante est en dessous de la vidéo)
Modifier: étendre la réponse pour la rendre plus claire:
Edit2: Les tcpdumps ajoutés à la question montrent le serveur ouvrant des connexions à Google et lui-même AGISSANT COMME CLIENT.
la source