Verwenden von SO_REUSEADDR – Was passiert mit dem zuvor geöffneten Socket?

Lesezeit: 2 Minuten

Benutzer-Avatar
Naren

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?

  • 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

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.

  • Ahh… natürlich. Der Socket ist schließlich nur ein Dateihandle und wird vom Betriebssystem bereinigt. Vielen Dank 🙂

    – Naren

    22. April 2009 um 4:19 Uhr

  • Genauer gesagt bleibt der TCP-Endpunkt im 2MSL-Zustand. Die Steckdose ist weg.

    – David Schwartz

    12. Januar 2012 um 2:34 Uhr

  • Die Wartezeit wurde der Spezifikation aus einem bestimmten Grund hinzugefügt. Die Verwendung von SO_REUSEADDR bewirkt, dass der TCP-Stack die Wartezeit verletzt. (Ihr 2MSL-Staat)

    – unixman83

    29. Januar 2012 um 8:43 Uhr


1365060cookie-checkVerwenden von SO_REUSEADDR – Was passiert mit dem zuvor geöffneten Socket?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy