web-dev-qa-db-fra.com

Utilisation de Recv-Q et Send-Q

Quelle est l'utilité des colonnes Recv-Q et Send-Q dans la sortie de netstat? Comment est-ce que je l'utilise dans un scénario réaliste?

Sur mon système, les deux colonnes sont toujours affichées à zéro. Quelle est la signification de cela?

18
mrg

Depuis ma page de manuel:

Recv-Q

Établi: nombre d'octets non copiés par le programme utilisateur connecté à ce socket.

Écoute: depuis le noyau 2.6.18, cette colonne contient le backlog syn actuel.

Send-Q

Établi: nombre d'octets non reconnus par l'hôte distant.

Écoute: depuis le noyau 2.6.18, cette colonne contient la taille maximale du backlog syn.

Si vous êtes bloqué à 0, cela signifie simplement que vos applications, des deux côtés de la connexion et du réseau entre elles, fonctionnent correctement. Les valeurs instantanées réelles peuvent être différentes de 0, mais d'une manière fugitive et transitoire telle que vous n'avez pas la chance de réellement l'observer.

Exemple de scénario réel où cela pourrait être différent de 0 (sur les connexions établies, mais je pense que vous aurez l'idée):

J'ai récemment travaillé sur un appareil embarqué Linux parlant à un appareil tiers (mal conçu). Sur ce périphérique tiers, l'application est parfois bloquée, ne lisant pas les données reçues sur la connexion TCP, ce qui entraîne sa fenêtre TCP descendant à 0) et y rester coincé pendant des dizaines de secondes (phénomène observé via wirehark sur un port miroir entre les 2 hôtes). Dans ce cas:

  • Recv-Q: exécutant netstat sur le périphérique tiers (ce que je n'avais aucun moyen de faire) peut avoir montré un Recv-Q croissant, jusqu'à une valeur de toit où l'autre côté (moi) arrête d'envoyer des données parce que la fenêtre descend à 0, car l'application ne lit pas les données disponibles sur son socket, et ces données restent en mémoire tampon dans le TCP implémentation dans le système d'exploitation, ne va pas à l'application bloquée -> du côté récepteur, problème d'application.

  • Send-Q: exécutant netstat sur mon côté (que je n'ai pas essayé car 1/le problème était clair de Wireshark et était le premier cas ci-dessus et 2/ce n'était pas reproductible à 100%) peut avoir montré un Send-Q non nul, si l'autre côté TCP au niveau du système d'exploitation a été bloquée et arrêtée ACKnowlinging mes données -> du côté de l'expéditeur, recevant TCP implémentation (généralement au niveau du système d'exploitation).

Notez que le scénario Send-Q décrit ci-dessus peut également être un problème côté envoi (mon côté) si mon Linux TCP = l'implémentation se comportait mal et a continué à envoyer des données après la TCP est descendue à 0: le côté récepteur n'a alors plus de place pour ces données -> ne ACKnowledge pas.

Notez également que le problème Send-Q peut être causé non pas à cause du récepteur, mais par un problème de routage quelque part entre l'expéditeur et le récepteur . Certains paquets sont "à la volée" entre les 2 hôtes, mais pas encore ACKnowledge. D'un autre côté, le problème Recv-Q est définitivement sur un hôte: paquets reçus, ACKnowledged, mais pas encore lus depuis l'application.

MODIFIER:

Dans la vraie vie, avec des hôtes et des applications non merdiques comme vous pouvez raisonnablement vous y attendre, je parierais que le problème Send-Q est causé la plupart du temps par un problème de routage/de mauvaises performances réseau entre le côté émetteur et le côté récepteur. L'état "à la volée" des paquets ne doit jamais être oublié:

  • Le paquet peut être sur le réseau entre l'expéditeur et le récepteur,

  • (ou reçu mais ACK pas encore envoyé, voir ci-dessus)

  • ou l'ACK peut être sur le réseau entre le récepteur et l'expéditeur.

Il faut un RTT (aller-retour) pour qu'un paquet soit envoyé puis ACKé.

21
jbm