2010-07-07 4 views
5

Dans la programmation de socket TCP, si recv() renvoie 0, cela est pris comme une indication que l'autre côté a fermé sa connexion. Cependant, AFAIK, le RFC TCP n'exige pas que la charge utile de TCP soit> 0. Donc, théoriquement, une pile TCP peut recevoir un message avec la charge utile 0.Quelle valeur recv() retournera-t-elle si elle reçoit un paquet TCP valide avec une charge utile de taille 0

Donc, essentiellement ma question est ce que recv() retournera si elle reçoit un paquet de charge utile de taille 0? Si elle renvoie 0, alors comment le distinguer d'une indication de connexion fermée.

Répondre

11

Les segments TCP avec une taille de charge utile de 0 sont omniprésents - ils se produisent dans pratiquement tous les flux TCP réels. Ils sont envoyés chaque fois qu'une partie souhaite accuser réception des données de l'autre, mais n'a pas de données à envoyer de son propre. (Ceux-ci sont communément appelés "paquets ACK", mais un "paquet ACK" est juste un segment régulier qui ne contient aucune donnée).

Étant donné que ces paquets ne contiennent aucune donnée à transmettre à l'application utilisateur, ils ne provoqueront pas le retour recv() - recv() continuera le blocage jusqu'à ce que certaines données réelles arrivent. Si recv() renvoie 0, cela indique clairement que l'autre extrémité a fermé son côté de la connexion et n'enverra plus de données.

Rappelez-vous que TCP est courant orienté: il n'y a pas un 1-à-1 correspondance entre les données renvoyées par un seul recv() appel et les données dans un seul segment TCP. Un seul appel recv() peut renvoyer un bloc de données qui chevauche plusieurs segments TCP et les données d'un seul segment TCP peuvent être renvoyées dans plusieurs appels recv(). Les limites entre les segments TCP ne sont pas visibles à l'application en utilisant l'API BSD sockets. Si vous voulez de telles limites, vous devez soit vous implémenter en utilisant un protocole de couche d'application dans le flux TCP, soit utiliser un protocole orienté datagramme tel que UDP.

+0

+1 pour mentionner les ACK. –

+0

Les paquets ACK auront un fanion ACK. – AlastairG

+1

@AlastairG: Bien, mais tous les paquets autres que le 'SYN' initial ou une réinitialisation de connexion ont le bit' ACK' défini. – caf

3

À droite, selon POSIX si recv renvoie 0, la connexion est arrêtée correctement par le pair.

Si quelqu'un a réussi à envoyer un paquet TCP avec une charge utile de taille zéro, le système d'exploitation ne doit pas retourner des données au processus en cours bloqué sur appel système recv sur cette prise. Rappelez-vous que les charges TCP forment un flux continu qui peut être découpé de manière aléatoire par le système d'exploitation, et non une séquence de datagrammes qui doit être renvoyée au cours d'un appel système unique.

Questions connexes