Que se passe-t-il lorsque je termine un processus et que le tampon d'envoi de socket n'est pas vide?

3

Sous Windows (et probablement sous d’autres systèmes d’exploitation), si un processus a une connexion TCP avec un autre processus sur une autre machine, puis que je termine le processus, un paquet RST sera envoyé à l’autre machine pour indiquer la fin de la connexion.

Imaginons maintenant que lorsque le processus est terminé, il reste encore des données dans le tampon d’envoi. Que se passera-t-il dans ce cas, ces données restantes seront-elles envoyées à l'autre machine, suivies d'un paquet RST, ou ces données restantes seront-elles ignorées et seul un paquet RST sera envoyé?

utilisateur424014
la source
Quelques conseils de la communauté à prendre en considération: Crossposting
Louis

Réponses:

1

Le RST est envoyé immédiatement et les données sont supprimées.

utilisateur207421
la source
Est-ce vrai? Je sais qu'il existe des cas dans lesquels Windows continuera à transmettre le tampon d'envoi après la fin de l'application. Je pensais que RST n'avait été envoyé que si SO_LINGER avait la valeur 0, sinon il tente de s'éteindre avec élégance.
Dauphic
@CollinDauphinee La TVD est envoyée dans diverses circonstances: celle que vous mentionnez est la moins probable. La question n'est pas de savoir si RST est envoyé, c'est ce qui arrive aux données si RST est envoyé. Certaines plateformes envoient plutôt une FIN après les données.
user207421
Je pense que l’affiche a l’impression qu’une TVD est toujours envoyée à la fin du processus. Ils ne connaissent probablement pas TIME_WAIT.
Dauphic
@CollinDauphinee RST est envoyé, sur certaines plates-formes, si le socket n'a pas été fermé par l'application. D'autres plates-formes envoient une FIN, ce qui peut conduire à TIME_WAIT.
user207421
@CollinDauphinee OTOH Si l'application ferme le socket avec les données d'envoi en attente, toutes les plates-formes le transmettent toutes, suivies d'un FIN, même après la fermeture de l'application. Ce n'est pas TIME_WAIT non plus, cependant: la connexion est toujours ESTABLISHED pendant cette période. TIME_WAIT ne commence que lorsque le FIN a été ACKed.
user207421