2011-10-28 2 views
9

je passer au crible quelques traces de réseau et remarqué sur ma propre machine que lorsque je me connecte sur HTTP, les paquets ressemblent à:charge utile de données dans un environnement TCP ack

client --> server: GET 
server --> client: tcp ack 
server --> client: HTTP response 
client --> server: tcp ack 

Cependant, je regardais un peu CIFS (SMB) traces que j'ai sauvées il y a quelques années. Je vois des choses comme:

client --> server: Create Request 
server --> client: Create response (This packet also acks the request) 

À un niveau élevé, je me demande pourquoi la différence - ce qui est à l'origine des comportements différents? Qu'est-ce qui détermine si la réponse de l'application est placée sur la requête ack ou un autre paquet: l'application ou le système d'exploitation?

Répondre

5

Ce comportement dépend du système d'exploitation et de l'application. Sous linux, le noyau n'envoie pas un ACK directement, mais attend un nombre fixe de millisecondes (environ 200), en espérant qu'il a des données à renvoyer et peut laisser l'ACK greffer les données.

Si la minuterie s'éteint, l'ACK est envoyé immédiatement.

Exemple 1.

Client sends the GET request. 

Server tries to create a http response, but before it does that 200ms are gone 
and it must send the ACK before the http response. 

Exemple 2.

Client sends the GET request. 

Server creates a http response within the timer limit, and the ACK can piggyback 
the data. 

Signification, si votre application a plus lente à générer cette réponse, l'accusé de réception sera envoyé sans ferroutage sur les données. Et aussi selon le système d'exploitation, le temporisateur peut être plus haut/bas et changer encore une fois comment ACK sont envoyés.

+0

pouvez-vous spécifier le retardateur dans les paramètres d'initialisation TCP? – NHDaly

+1

Vous pouvez le désactiver avec l'option TCP_QUICKACK avec setsockopt sous IPPROTO_TCP (btw non portable). Mais changer la valeur peut ne pas être possible car je crois que c'est codé en dur à moins qu'il y ait un sysctl nouvellement ajouté pour cela (ou quelque chose de similaire). – Milan

+0

Après avoir défini l'option de socket TCP pour désactiver TCP Quick ACK, je n'ai toujours pas reçu le paquet combiné répondu: opt = 0; setsockopt (sockfd, IPPROTO_TCP, TCP_QUICKACK, (char *) & opt, sizeof (opt)); –

Questions connexes