Wie viele Prozesse können einen bestimmten Port überwachen?

7

Wie viele Prozesse können einen bestimmten Port wie 80 überwachen? und wie können die untergeordneten Prozesse einer Anwendung denselben Port zum Abhören verwenden? Gibt es einen Unterschied zwischen dem Abhören eines Ports oder dem Herstellen einer Abhörverbindung?

faressoft
quelle

Antworten:

8

F: Wie viele Prozesse können einen bestimmten Port überwachen?

A: so viele wie du spawnen kannst.

SOCK_STREAMZumindest für Sockets und sofern Sie nicht die SO_REUSEPORTOption (neu in Linux 3.9) verwenden, kann ein Prozess einen Socket nicht an einen lokalen Endpunkt binden (Adresse + Port für TCP, Dateiname für Unix ...), wenn bereits ein anderer Socket gebunden ist das (oder ein lauschender an diesem Port mit der Platzhalteradresse).

Wenn Sie SO_REUSEPORT nicht verwenden, können verschiedene Prozesse denselben Port nur abhören, indem die entsprechenden Dateideskriptoren auf dieselbe geöffnete Dateibeschreibung (auf denselben Socket) verweisen .

Das passiert automatisch, wenn Sie fork()einen Prozess durchführen. Wenn fd 3 auf einen empfangenden TCP-Socket an der Platzhalteradresse und an Port 12345 zeigt, lauschen beide Prozesse nach dem Fork an diesem Port an diesem fd ( zshSyntax unten):

$ zmodload zsh/net/tcp
$ ztcp -ld 3 12345
$ sleep 10 &
$ lsof -ni tcp:12345
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
zsh     26277 stephane    3u  IPv4 506354      0t0  TCP *:12345 (LISTEN)
sleep   26988 stephane    3u  IPv4 506354      0t0  TCP *:12345 (LISTEN)

Für Prozesse, die nicht miteinander verbunden sind, besteht die einzige Möglichkeit (die ich kenne), dass ein Prozess Zugriff auf diesen Listening-Socket erhält, darin, den SCM_RIGHTMechanismus zu verwenden, um fds (eigentlich eher wie offene Dateibeschreibungen ) zwischen Prozessen mit Unix-Domain-Sockets zu übergeben.

Sie werden feststellen, dass ein Argument für listen()das Backlog ist .

Sobald ein Socket auf einem bestimmten Endpunkt lauscht, akzeptiert der Kernel eingehende Verbindungen zu diesem Endpunkt ( das Backlog gibt dem Kernel einen Hinweis darauf, wie viele möglicherweise akzeptiert werden, die nicht acceptvon Anwendungen bearbeitet wurden ).

Dann erhält der erste Prozess, der eine accept()der fds ausführt, die auf den Listening-Socket (oder einen der Listening-Sockets mit SO_REUSEPORT) zeigen, die eingehende Verbindung. accept()erstellt einen neuen Socket und gibt einen neuen fd zurück socket. Dieser fd kann wiederum dupliziert werden (ein neuer fd zeigt auf denselben Socket), und untergeordnete Prozesse erben diesen verbundenen Socket wie den abhörenden.

Stéphane Chazelas
quelle
3

Diese Antwort beschreibt TCP unter IPv4.

Nur ein Prozess kann auf neue Verbindungen warten. Sie erhalten den Fehler "Adresse bereits verwendet", wenn mehr als ein Prozess versucht, denselben Port zu beanspruchen.

Dies unterscheidet sich grundlegend von der Anzahl der Prozesse, die diesen Port aktiv verwenden.

Schauen Sie sich folgende Ausgabe an:

remote          local        state
*:*           - 4.3.2.1:5000 LISTENING
1.2.3.4:12345 - 4.3.2.1:5000 CONNECTED
4.5.6.7:83247 - 4.3.2.1:5000 CONNECTED

Was einzigartig sein muss, ist das 4-Tupel (remote-ip, remote-port, local-ip, local-port). Da der (remote-ip, remote-port)Status LISTENING a ist *:*, kann nur ein Prozess abhören.

Die Überwachungsanwendung startet bei jeder eingehenden Verbindung einen neuen Thread / eine neue Aufgabe / einen neuen Prozess.

joepd
quelle
1
Sie können auch nur an die angegebene Adresse binden (und nicht an *) und sich daran erinnern, dass IPv4 und IPv6 separate Stapel sind.
pawel7318
Sie können mehrere Prozesse haben, die dasselbe Protokoll abhören: Adresse: Port, solange es sich um Dateideskriptoren handelt, die dieselben offenen Dateibeschreibungen verwenden (wie Kinder, die fds erben, oder fds, die mit SCM_RIGHTS übergeben wurden).
Stéphane Chazelas