FIN vs RST dans les connexions TCP

La façon dont je comprends cela, il y a 2 façons de fermer la connexion TCP:

  • envoyer fin drapeau
  • envoyer le premier drapeau

RST provoque la résiliation immédiate de la connexion, tandis que dans FIN, vous obtenez une confirmation.

Est-ce que je comprends ce droit, et y a-t-il d'autres distinctions entre les deux? Ces 2 drapeaux être utilisés ensemble?

31
demandé sur Mike Pennington 2012-10-24 17:04:40

3 réponses

  • FIN dit :" j'ai fini de vous parler, mais j'écouterai tout ce que vous avez à dire jusqu'à ce que vous disiez que vous avez terminé."

  • RST dit: "il n'y a pas de conversation. Je ne dirai rien et je n'écouterai rien de ce que vous direz."

    RST est utile si vous avez une connexion TCP longue durée avec peu de trafic. Si l'ordinateur est redémarré, il oublie la connexion, et de l'autre ordinateur est PREMIER, dès qu'il envoie un autre paquet.

62
répondu escitalopram 2018-09-03 14:12:31

FIN ou RST serait envoyé dans le cas suivant

  • votre processus ferme le socket
  • Le système d'exploitation effectue le nettoyage des ressources lorsque votre processus se termine sans fermer le socket.

    Si votre processus appelle close (), FIN sera envoyé du côté de la fermeture par défaut (note: vous pouvez définir l'option socket SO_LINGER pour le faire envoyer RST au lieu de FIN)

    Si votre processus se termine sans fermer le socket, le noyau fermera la connexion tcp et fera le nettoyage de votre processus. FIN ou RST peut être envoyé. S'il y a des données dans votre file d'attente de réception, RST sera envoyé. Sinon, la FIN serait envoyé.

    Vous pouvez faire une boucle à travers tcp_close () dans tcp.c pour plus de détails.(J'utilise kernel-2.6.32-573.7.1 de la branche redhat)

6
répondu Ben 2015-11-06 06:01:53

De la RFC 1122, que tout le monde continue de citer, mais ne cite pas réellement, contre moi:

Une connexion TCP peut se terminer de deux manières: (1) la normale TCP fermer la séquence à l'aide D'une poignée de main FIN, et (2) un"" dans lequel un ou plusieurs premiers segments sont envoyés et l'état de connexion est immédiatement ignoré.

, Il n'est pas possible d'utiliser les deux en même temps. Le concept ne commence même pas à faire sens.

Il est possible au moyen d'une ruse que je ne décrirai pas ici de fermer une connexion TCP avec un RST au lieu d'un FIN, mais c'est une idée stupide, c'est pourquoi je ne la documente pas. D'une part, toutes les données en attente en vol sont perdues.

6
répondu user207421 2018-05-31 09:16:45