Stellen Sie sich einen übergeordneten Prozess vor, der einen abschließt socket/bind/accept
und untergeordnete Prozesse mit diesem Socket zur Kommunikation öffnet, während der übergeordnete Prozess weiterhin Verbindungen akzeptiert. Dieser übergeordnete Prozess wird dann beendet.
Ein anderer Prozess versucht nun, eine Bindung an die gleiche Adresse am gleichen Port herzustellen, an die der übergeordnete Prozess gebunden war, erhält jedoch einen EADDRINUSE-Fehler.
Wenn Sie diesen Vorgang jedoch mit abschließen sshd
, scheint essshd
Istin der Lage, die Verbindung zum geschlossenen Port wiederherzustellen, während während des Neustartfensters (in dem der übergeordnete SSHD-Prozess nicht ausgeführt wird) ein anderes Programm (das als anderer Benutzer ausgeführt wird) nur EADDRINUSE erhält.
Welche Semantik steckt dahinter? Warum ist sshd
eine erneute Bindung möglich, ein anderer Benutzerprozess jedoch nicht?
Darüber hinaus kann ich bestätigen, dass die netstat -a | grep PORT
Ausgabe während der Zeit, in der nur der untergeordnete Prozess ausgeführt wird (wenn der andere Prozess dies nicht kann bind
), die einzige Verbindung die ist ESTABLISHED
, „Keine im LISTEN
Zustand“.
Antwort1
Obwohl ich die Semantik nicht vollständig verstehe (entweder suche ich an der falschen Stelle oder die Dokumentation ist unzureichend), bin ich der Meinung, dass für eine bestimmte Zeitspanne nach dem Schließen einer Verbindung (die möglicherweise durch festgelegt wurde SO_LINGER
) kein Prozess einen neuen Socket mit denselben Details öffnen kann, sofern diese nicht SO_REUSEADDR
festgelegt wurden.
Dies soll, so wie ich es verstehe, verhindern, dass sich jemand eine Sekunde nach dem Schließen einer Verbindung erneut anmeldet und der Prozess mit Paketen umgehen muss, die für den vorherigen Prozess bestimmt waren.
man 7 socket
dokumentiert dies nicht, SO_REUSEADDR
was es teilweise schwierig machte, diese Antwort herauszufinden.