Aucune donnée n'est envoyée sur le réseau pour maintenir les connexions TCP. Vous pouvez envoyer un keep-alive au niveau de la couche réseau en envoyant simplement un paquet de zéro octet à partir de l'un ou l'autre pair ou en activant les options de socket pour que le système d'exploitation les envoie périodiquement pour vous. À mon avis, les keep-alives de la couche application (votre protocole d'application les gère) offrent une meilleure conception/relabilité que les mécanismes de la couche transport.
Lors de la conception de protocoles d'application superposés à TCP pour une fiabilité maximale, il est généralement nécessaire d'incorporer une sorte de non-opération (NOOP), ping, heartbeat dans la conception du protocole.
Ceci est très important car, par exemple, si votre serveur écoute une requête d'un client et que ce dernier est désactivé après que la connexion ait été établie, la session TCP est essentiellement orpheline et votre serveur peut se retrouver à écouter pour toujours. L'interruption de la connexion ne peut pas être détectée si aucune donnée n'est jamais envoyée ou reçue !
Si le serveur envoyait au moins des noop/ping/heartbeats à intervalles réguliers, la requête sortante déclencherait le mécanisme de retransmission/temps mort de la couche TCP et le serveur serait alors capable de détecter la connexion morte. Si, au lieu de cela, votre application envoie un message "ping" ou "hi, how are you ?" de la couche application, vous pouvez aller plus loin et l'utiliser pour vous renseigner sur l'état de votre homologue plutôt que sur la simple connexion sous-jacente.
Par exemple, si un pair est coincé dans une boucle infinie ou si ses disques durs sont en feu, les keepalives TCP ne suffisent pas à comprendre et à résoudre le problème sous-jacent.