FIN
Kurz: Ein TCP-Flag, mit dem eine Seite signalisiert, dass sie keine weiteren Daten mehr senden wird — der Beginn des geordneten Verbindungsabbaus.
Genauer: Da eine TCP-Verbindung aus zwei unabhängigen Datenrichtungen besteht, muss jede Seite ihre eigene Richtung einzeln per FIN beenden — deshalb läuft ein vollständiger, geordneter Abbau typischerweise über einen Four-Way-Handshake (FIN/ACK von beiden Seiten). Eine Seite kann dadurch bereits “fertig mit Senden” sein (FIN geschickt), während sie noch Daten von der Gegenseite empfängt — dieser Zustand heißt Half-Close.
Im Detail
Der typische Ablauf beim geordneten Verbindungsabbau:
- Client sendet
FIN— “ich habe keine weiteren Daten mehr zu senden” - Server bestätigt mit
ACKund kann selbst noch weiter senden (Half-Close-Zustand) - Sobald auch der Server fertig ist, sendet er seinerseits
FIN - Client bestätigt mit
ACK— die Verbindung ist vollständig geschlossen
Nach dem letzten ACK verbleibt die Verbindung auf der Seite, die zuerst FIN gesendet hat, noch für eine Weile im Zustand TIME_WAIT (typischerweise 30-120 Sekunden), bevor der Socket wirklich freigegeben wird — das verhindert, dass verspätet ankommende, “verirrte” Pakete einer alten Verbindung fälschlich einer neuen, zufällig denselben Port wiederverwendenden Verbindung zugeordnet werden. Bei Servern mit sehr vielen kurzlebigen Verbindungen (z. B. Webservern unter Last) kann eine große Zahl an Sockets im TIME_WAIT-Zustand tatsächlich zum praktischen Problem werden, da Port-Nummern dadurch vorübergehend blockiert bleiben.
Im Gegensatz zu einem geordneten Abbau per FIN beendet ein RST die Verbindung sofort und ohne Rücksicht auf noch unbestätigte Daten — FIN sagt “ich bin fertig”, RST sagt “diese Verbindung existiert für mich nicht mehr, ignorier alles”.
Siehe auch: RST, Three-Way-Handshake, TCP, SYN, ACK