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.
+1 pour mentionner les ACK. –
Les paquets ACK auront un fanion ACK. – AlastairG
@AlastairG: Bien, mais tous les paquets autres que le 'SYN' initial ou une réinitialisation de connexion ont le bit' ACK' défini. – caf