/etc/init.d/networking restart
Lassen Sie mich näher darauf eingehen. Das Transmission Control Protocol (TCP) ist als bidirektionales, geordnetes und zuverlässiges Datenübertragungsprotokoll zwischen zwei Endpunkten (Programmen) konzipiert. In diesem Zusammenhang bedeutet der Begriff "zuverlässig", dass die Pakete erneut übertragen werden, wenn sie in der Mitte verloren gehen. TCP garantiert die Zuverlässigkeit durch das Zurücksenden von Bestätigungspaketen (Acknowledgement, ACK) für ein einzelnes Paket oder einen Bereich von Paketen, die vom Peer empfangen wurden.
Dies gilt auch für die Steuersignale wie Beendigungsanforderung / -antwort. RFC 793 definiert den Status TIME-WAIT wie folgt:
TIME-WAIT - Stellt das Warten auf genügend Zeit dar, um sicherzustellen, dass das entfernte TCP die Bestätigung seiner Verbindungsanforderung zur Beendigung erhalten hat.
Siehe folgendes TCP-Zustandsdiagramm:
TCP ist ein bidirektionales Kommunikationsprotokoll. Wenn die Verbindung hergestellt wird, gibt es keinen Unterschied zwischen dem Client und dem Server. Beide können auch Quits aufrufen, und beide Peers müssen sich auf das Schließen einigen, um eine hergestellte TCP-Verbindung vollständig zu schließen.
Nennen wir den ersten, der die Quits als aktiven Näher bezeichnet, und den anderen, der den passiven Näher bezeichnet. Wenn der aktive Schließer FIN sendet, geht der Status zu FIN-WAIT-1. Dann erhält es eine ACK für das gesendete FIN und der Zustand geht zu FIN-WAIT-2. Sobald er FIN auch vom passiven Schließer empfängt, sendet der aktive Schließer die ACK an den FIN und der Zustand geht zu TIME-WAIT. Falls der passive Schließer die ACK für die zweite FIN nicht erhalten hat, überträgt er das FIN-Paket erneut.
RFC 793 legt das TIME-OUT auf das Doppelte der maximalen Segmentlebensdauer oder 2MSL fest. Da MSL, die maximale Zeit, die ein Paket im Internet durchwandern kann, auf 2 Minuten festgelegt ist, beträgt 2MSL 4 Minuten. Da es keine ACK für eine ACK gibt, kann der aktive Schließer nichts anderes tun, als 4 Minuten zu warten, wenn er das TCP / IP-Protokoll korrekt einhält, nur für den Fall, dass der passive Absender die ACK für seine FIN nicht erhalten hat (theoretisch) .
In der Realität sind fehlende Pakete wahrscheinlich selten und sehr selten, wenn alles im LAN oder auf einer einzelnen Maschine stattfindet.
Um die Frage wörtlich zu beantworten, wie ein Socket in TIME_WAIT gewaltsam geschlossen wird, halte ich mich weiterhin an meine ursprüngliche Antwort:
/etc/init.d/networking restart
In der Praxis würde ich es so programmieren, dass es den TIME-WAIT-Status mit der SO_REUSEADDR-Option ignoriert, wie in WMR erwähnt. Was genau macht SO_REUSEADDR?
Diese Socket-Option teilt dem Kernel mit, dass selbst wenn dieser Port belegt ist (im
TIME_WAIT-Status), er trotzdem weiterverwendet werden soll. Wenn es besetzt ist, aber mit einem anderen Status, erhalten Sie immer noch einen Fehler, dass die Adresse bereits verwendet wird. Dies ist nützlich, wenn Ihr Server heruntergefahren und dann sofort neu gestartet wurde, während Sockets an seinem Port noch aktiv sind. Sie sollten sich darüber im Klaren sein, dass unerwartete Daten Ihren Server verwirren können. Dies ist zwar möglich, aber unwahrscheinlich.
TIME_WAIT
Servern" hier sind , überspringen Sie einfach die ersten drei Antworten, um die Frage zu vermeiden, anstatt sie zu beantworten.