Fenêtre de réception TCP

Je suis en train d'essayer de comprendre comment la fenêtre du récepteur affecter le débit sur une connexion à latence élevée.

J'ai un client simple paire de serveurs d'applications sur les deux machines, de loin en loin, avec la connexion entre les deux 250mSec de latence de RTT. J'ai couru ce test avec Windows (XP, 7), Linux (Ubuntu 10.x), avec les mêmes résultats, donc, pour des raisons de simplicité, supposons le cas de:
Client de la réception de données: WinXP Pro
Serveur d'envoi des données: Win7 Pro
Encore une fois, le temps de latence est 250mSec RTT.

Je lance mon test TCP sans changer le récepteur taille de la mémoire tampon sur le client (la valeur par défaut est de 8 ko), et je vois sur le câble (à l'aide de Wireshark):

  • au client d'envoyer les accusés de réception sur le serveur et les paquets TCP contient RWIN=65k
  • serveur envoie des données et rapport RWIN=65k

À la recherche à la trace, je vois une des éclats de 3-4 paquets (avec une charge utile de 1460 octets), immédiatement suivie par l'accusé de réception envoyé à partir de l'ordinateur client au serveur, puis plus rien pendant environ 250mSec puis une nouvelle rafale de paquets à partir du serveur vers le client.

Donc, en conclusion, il apparaît que le serveur n'envoie pas de nouvelles données avant même qu'il ne se remplit que le récepteur de la fenêtre.

Faire plus d'essais, j'ai également fait le même test en changeant le récepteur de la taille de la mémoire tampon sur la machine client (sur Windows, changer le récepteur de la taille de la mémoire tampon finit par affecter la RWIN annoncés par la machine). Je m'attends à voir un grand éclat de paquets avant de les bloquer pour ACK... et au moins un débit plus élevé.

Dans ce cas, j'ai mis recv taille de la mémoire tampon à 100 000 000. Les paquets du client vers le serveur ont maintenant une RWIN=99,999,744 (eh bien, c'est joli), mais malheureusement, le modèle des données envoyées à PARTIR du serveur vers le client est toujours le même: une courte rafale suivie par une longue attente.
Pour confirmer ce que je vois sur le fil, j'ai aussi mesurer le temps d'envoyer un bloc de données à partir du serveur vers le client. Je ne vois pas de changements dans l'utilisation d'un grand RWIN ou utiliser la valeur par défaut.

Quelqu'un peut-il m'aider à comprendre pourquoi la modification de la RWIN n'a pas vraiment d'incidence sur le débit?

Quelques remarques:
- serveur envoie des données aussi vite que possible à l'aide de write() de blocs de 8 ko
- comme je l'ai dit avant, je vois des effets similaires à l'aide de Linux. changer le récepteur taille de buffer affecte la RWIN utilisé par un nœud, mais le débit reste le même.
- Je analyser le suivi après plusieurs centaines de paquets, pour donner suffisamment de temps pour le TCP démarrage lent mécanisme pour agrandir la CWIN taille.


Comme l'a suggéré, je vais ajouter une petite capture d'écran d'un fil de trace ici

No.     Time        Source                Destination           Protocol Length Info
     21 2.005080    CCC.CCC.CCC.CCC       sss.sss.sss.sss       TCP      60     57353 > 21500 [ACK] Seq=1 Ack=11681 Win=99999744 Len=0
     22 2.005109    sss.sss.sss.sss       CCC.CCC.CCC.CCC       TCP      1514   21500 > 57353 [ACK] Seq=19305 Ack=1 Win=65536 Len=1460
     23 2.005116    sss.sss.sss.sss       CCC.CCC.CCC.CCC       TCP      1514   21500 > 57353 [ACK] Seq=20765 Ack=1 Win=65536 Len=1460
     24 2.005121    sss.sss.sss.sss       CCC.CCC.CCC.CCC       TCP      1514   21500 > 57353 [ACK] Seq=22225 Ack=1 Win=65536 Len=1460
     25 2.005128    sss.sss.sss.sss       CCC.CCC.CCC.CCC       TCP      946    21500 > 57353 [PSH, ACK] Seq=23685 Ack=1 Win=65536 Len=892
     26 2.005154    CCC.CCC.CCC.CCC       sss.sss.sss.sss       TCP      60     57353 > 21500 [ACK] Seq=1 Ack=14601 Win=99999744 Len=0
     27 2.007106    CCC.CCC.CCC.CCC       sss.sss.sss.sss       TCP      60     57353 > 21500 [ACK] Seq=1 Ack=16385 Win=99999744 Len=0
     28 2.007398    sss.sss.sss.sss       CCC.CCC.CCC.CCC       TCP      1514   21500 > 57353 [ACK] Seq=24577 Ack=1 Win=65536 Len=1460
     29 2.007401    sss.sss.sss.sss       CCC.CCC.CCC.CCC       TCP      1514   21500 > 57353 [ACK] Seq=26037 Ack=1 Win=65536 Len=1460
     30 2.007403    sss.sss.sss.sss       CCC.CCC.CCC.CCC       TCP      1514   21500 > 57353 [ACK] Seq=27497 Ack=1 Win=65536 Len=1460
     31 2.007404    sss.sss.sss.sss       CCC.CCC.CCC.CCC       TCP      1514   21500 > 57353 [ACK] Seq=28957 Ack=1 Win=65536 Len=1460
     32 2.007406    sss.sss.sss.sss       CCC.CCC.CCC.CCC       TCP      1514   21500 > 57353 [ACK] Seq=30417 Ack=1 Win=65536 Len=1460
     33 2.007408    sss.sss.sss.sss       CCC.CCC.CCC.CCC       TCP      946    21500 > 57353 [PSH, ACK] Seq=31877 Ack=1 Win=65536 Len=892
     34 2.007883    CCC.CCC.CCC.CCC       sss.sss.sss.sss       TCP      60     57353 > 21500 [ACK] Seq=1 Ack=19305 Win=99999744 Len=0
     35 2.257143    CCC.CCC.CCC.CCC       sss.sss.sss.sss       TCP      60     57353 > 21500 [ACK] Seq=1 Ack=22225 Win=99999744 Len=0
     36 2.257160    CCC.CCC.CCC.CCC       sss.sss.sss.sss       TCP      60     57353 > 21500 [ACK] Seq=1 Ack=24577 Win=99999744 Len=0
     37 2.257358    sss.sss.sss.sss       CCC.CCC.CCC.CCC       TCP      1514   21500 > 57353 [ACK] Seq=32769 Ack=1 Win=65536 Len=1460
     38 2.257362    sss.sss.sss.sss       CCC.CCC.CCC.CCC       TCP      1514   21500 > 57353 [ACK] Seq=34229 Ack=1 Win=65536 Len=1460
     39 2.257364    sss.sss.sss.sss       CCC.CCC.CCC.CCC       TCP      1514   21500 > 57353 [ACK] Seq=35689 Ack=1 Win=65536 Len=1460
     40 2.257365    sss.sss.sss.sss       CCC.CCC.CCC.CCC       TCP      1514   21500 > 57353 [ACK] Seq=37149 Ack=1 Win=65536 Len=1460

Comme vous le voyez, le serveur d'arrêter d'envoyer des données à partir des paquets #33.

Client d'envoyer ACK au paquet #34 d'un vieux paquet (seq=19305, envoyé le paquet n ° 20, non représenté ici).
Avec une RWIN de 100mo, je m'attends à ce que le serveur de ne PAS bloquer pendant un certain temps.

Après 20 à 30 paquets, la fenêtre de congestion sur le côté serveur doit être suffisamment grand pour envoyer plus de paquets que je vois...
Je suppose que la fenêtre de congestion est éventuellement va croître jusqu'à la RWIN... mais encore, même après des centaines de paquets, le motif est le même: données les données de bloquer pour 250mSec...

Est la machine sans fil? Pouvez-vous imprimer les numéros de séquence envoyé en arrière et quatrième à partir de la client/serveur dans les paquets et les accusés de réception. Il pourrait y avoir beaucoup de bruit sur le client ou côté serveur provoquer la perte de données.

OriginalL'auteur fabrizi0 | 2012-04-23