Bei der Netzwerkprogrammierung in Unix habe ich immer die SO_REUSEADDR-Option auf dem Socket gesetzt, der vom Server zum Abhören von Verbindungen verwendet wird. Dies besagt im Grunde, dass ein anderer Socket auf demselben Port auf der Maschine geöffnet werden kann. Dies ist nützlich, wenn Sie sich nach einem Absturz erholen und der Socket nicht ordnungsgemäß geschlossen wurde – die App kann neu gestartet werden und öffnet einfach einen anderen Socket auf demselben Port und hört weiter.
Meine Frage ist, was passiert mit der alten Steckdose? Ohne Zweifel werden alle Daten/Verbindungen weiterhin auf der alten Buchse empfangen. Wird es automatisch vom Betriebssystem geschlossen?
Ein Socket gilt als geschlossen, wenn das Programm, das ihn verwendet hat, stirbt. So viel wird vom OS gehandhabt, und das OS wird sich weigern, jede weitere Kommunikation von der toten Konversation zu akzeptieren. Wenn der Socket jedoch unerwartet geschlossen wurde, weiß der Computer am anderen Ende möglicherweise nicht, dass die Konversation beendet ist, und versucht möglicherweise immer noch zu kommunizieren.
Aus diesem Grund gibt es in der TCP-Spezifikation eine Wartezeit, bevor dieselbe Portnummer wiederverwendet werden kann. Denn theoretisch, wenn auch unwahrscheinlich, ist es möglich, dass ein Paket aus der alten Konversation mit der richtigen IP-Adresse, Portnummern und Sequenznummern ankommt, sodass der empfangende Server es versehentlich versehentlich in den falschen TCP-Stream einfügt.
Das SO_REUSEADDR
Option setzt dieses Verhalten außer Kraft, sodass Sie den Port sofort wiederverwenden können. Im Grunde sagen Sie: „Ich verstehe die Risiken und möchte den Port trotzdem nutzen.“
Ja, das Betriebssystem schließt automatisch den vorherigen Socket, wenn der alte Prozess endet. Der Grund, warum Sie normalerweise nicht sofort denselben Port abhören können, liegt darin, dass der Socket, obwohl er geschlossen ist, für einige Zeit (normalerweise einige Minuten) im 2MSL-Zustand bleibt. Das Betriebssystem versetzt den alten Socket automatisch aus diesem Zustand, wenn das Timeout abläuft.
Zur Verdeutlichung: Nach dem Absturz eines Programms schließt das Betriebssystem, z. B. der Linux-Kernel, den Socket automatisch. Es gibt Protokollgründe (TCP), warum Sie eine Verbindung nicht sofort wieder öffnen möchten.
– unixman83
29. Januar 2012 um 8:39 Uhr
Pflichtlektüre zu diesem Thema: serverframework.com/asynchronousevents/2011/01/…
– Benutzer246645
3. April 2012 um 8:57 Uhr