comportement de la fonction send () lorsque le lien est interrompu dans une connexion TCP

Voici le scénario:

A B

J’utilise des sockets non bloquants sur A et B (machines basées sur Linux). A et B ont une connexion TCP et tout à coup le lien les reliant s’éteint (le lien peut ne pas être direct). Maintenant, après que le lien est arrêté, lorsque la fonction send () est appelée du côté A pour envoyer des données à B, elle retourne avec succès (c’est-à-dire qu’elle renvoie le nombre d’octets à envoyer).

Quelle est la raison de ce comportement, lorsque nous soaps que le côté distant ne pourra pas recevoir ces données, lorsque le lien sera arrêté?

C’est un comportement normal et attendu.

quand on sait que le côté distant ne pourra pas recevoir ces données

Eh bien, vous savez peut-être que c’est vous qui avez tiré le câble et que vous n’êtes pas sur le sharepoint le retwigr, mais l’ordinateur (ou la stack TCP en particulier) ne le sait pas.

La première raison pour laquelle il ne sait pas que les données ne le feront pas, c’est qu’à la fin de l’appel de send() , les données ne sont pas encore sur le réseau: elles n’ont été mises en queue que dans une mémoire tampon.

La deuxième raison pour laquelle il ne sait pas que les données ne le feront pas, c’est parce qu’il ne peut pas (du moins au début) faire la différence entre un lien qui a simplement laissé tomber un paquet et le paquet peut passer quand il essaie de retransmettez-le, par opposition à un câble qui a bel et bien été coupé. Même pour une coupure de câble, TCP continuera à retransmettre pendant un certain temps, en espérant que soit (1) le lien revienne, ou (2) les routeurs convergent vers un autre chemin de réseau qui fonctionne.

Même si vous pouviez savoir instantanément quand un lien est en panne (même si vous pouvez dans des cas très spécifiques, vous ne pouvez pas en général, vous devez attendre un délai d’attente pour comprendre cela), vous ne voudriez pas que TCP rompt instantanément les connexions chaque fois que cela se produirait: il serait bien trop fragile que les connexions TCP se brisent à chaque perte d’un paquet sur le réseau.