it-swarm.com.de

Können zwei Anwendungen denselben Port überwachen?

Können zwei Anwendungen auf demselben Computer an denselben Port und dieselbe IP-Adresse gebunden werden? Kann eine App Anfragen von einer bestimmten IP-Adresse und die andere von einer anderen Remote-IP-Adresse abhören? Ich weiß, dass eine Anwendung, die zwei Threads (oder Forks) startet, ein ähnliches Verhalten aufweisen kann. Können jedoch zwei Anwendungen, die nichts gemeinsam haben, dasselbe tun?

257
nadiv

Die Antwort hängt davon ab, welches Betriebssystem in Betracht gezogen wird. Im Allgemeinen jedoch:

Für TCP nein. Es kann immer nur eine Anwendung auf demselben Port empfangsbereit sein. Wenn Sie nun 2 Netzwerkkarten hätten, könnte eine Anwendung die erste IP-Adresse und die zweite die zweite IP-Adresse mit derselben Portnummer überwachen.

Bei UDP (Multicasts) können mehrere Anwendungen denselben Port abonnieren.

Bearbeiten: Seit Linux Kernel 3.9 und höher wurde die Unterstützung für mehrere Anwendungen, die denselben Port abhören, mit der Option SO_REUSEPORT Hinzugefügt. Weitere Informationen finden Sie unter dieser Artikel von lwn.net.

229
Chris Dail

Ja (für TCP), Sie können zwei Programme auf demselben Socket abhören lassen, wenn die Programme dafür ausgelegt sind. Wenn der Socket vom ersten Programm erstellt wird, stellen Sie sicher, dass die Option SO_REUSEADDR Für den Socket festgelegt ist, bevor Sie bind(). Dies ist jedoch möglicherweise nicht das, was Sie möchten. Dies bewirkt, dass eine eingehende TCP Verbindung zu einem der Programme geleitet wird, nicht zu beiden, sodass die Verbindung nicht dupliziert wird, sondern nur zu zwei Programmen Warten Sie die eingehende Anforderung ab. Auf Webservern überwachen beispielsweise mehrere Prozesse den Port 80, und das Betriebssystem sendet eine neue Verbindung an den Prozess, der bereit ist, neue Verbindungen zu akzeptieren.

SO_REUSEADDR

Ermöglicht anderen Sockets, bind() an diesen Port zu senden, es sei denn, es ist bereits ein aktiver Empfangs-Socket an den Port gebunden. Auf diese Weise können Sie die Fehlermeldungen "Adresse wird bereits verwendet" umgehen, wenn Sie versuchen, den Server nach einem Absturz neu zu starten.

113
JNewton

Im Prinzip nein.

Es ist nicht in Stein gemeißelt; Aber so sind alle APIs geschrieben: Die App öffnet einen Port, erhält ein Handle und das Betriebssystem benachrichtigt ihn (über dieses Handle), wenn eine Client-Verbindung (oder ein Paket im UDP-Fall) eintrifft.

Wenn das Betriebssystem zulässt, dass zwei Apps denselben Port öffnen, wie kann es wissen, welche Apps benachrichtigt werden müssen?

Aber ... es gibt Möglichkeiten, das zu umgehen:

  1. Als Jed notiert könnten Sie einen 'Master'-Prozess schreiben, der der einzige ist, der den Port wirklich überwacht und andere benachrichtigt, wobei er eine beliebige Logik verwendet, um Client-Anforderungen zu trennen.
    • Unter Linux und BSD (zumindest) können Sie "Remapping" -Regeln einrichten, mit denen Pakete vom "sichtbaren" Port an verschiedene (von den Apps empfangene) weitergeleitet werden, und zwar nach beliebigen netzwerkbezogenen Kriterien (z. B. Origin-Netzwerk oder nach bestimmten Kriterien) einfache Formen des Lastausgleichs).
47
Javier

Ja.

  1. Mehrere empfangsbereite TCP - Sockets, die alle an denselben Port gebunden sind, können nebeneinander existieren, vorausgesetzt, sie sind alle an verschiedene lokale IP-Adressen gebunden. Clients können sich mit jeder beliebigen IP-Adresse verbinden. Dies schließt 0.0.0.0 (INADDR_ANY).

  2. Es können mehrere akzeptierte Sockets nebeneinander existieren, die alle von demselben Listening-Socket akzeptiert werden und alle dieselbe lokale Portnummer wie der Listening-Socket aufweisen.

  3. Mehrere UDP-Sockets, die alle an denselben Port gebunden sind, können gleichzeitig vorhanden sein, sofern entweder die gleiche Bedingung wie unter (1) erfüllt ist oder für alle vor dem Binden die Option SO_REUSEADDR Festgelegt wurde.

  4. TCP-Ports und UDP-Ports belegen unterschiedliche Namespaces. Die Verwendung eines Ports für TCP schließt die Verwendung für UDP nicht aus und mgekehrt

Referenz: Stevens & Wright, TCP/IP illustriert Band II.

46
user207421

Ja Auf jeden Fall . Soweit ich mich erinnere ab Kernel-Version 3.9 (nicht sicher auf der Version) Unterstützung für die SO_REUSEPORT wurde vorgestellt. SO_RESUEPORT ermöglicht das Binden an genau denselben Port und dieselbe Adresse, solange der erste Server diese Option vor dem Binden seines Sockets festlegt.

Es funktioniert sowohl für [~ # ~] tcp [~ # ~] als auch [~ # ~] udp [ ~ # ~] . Weitere Informationen finden Sie unter dem Link: SO_REUSEPORT

Hinweis: Akzeptierte Antwort gilt meiner Meinung nach nicht mehr.

24
piyush

Nein. Es kann immer nur eine Anwendung an einen Port gebunden werden. Das Verhalten bei erzwungener Bindung ist unbestimmt.

Bei Multicast-Sockets - die sich nicht annähernd so anhören, wie Sie es möchten - kann mehr als eine Anwendung an einen Port gebunden werden, solange SO_REUSEADDR in den Optionen jedes Sockets festgelegt ist.

Sie können dies erreichen, indem Sie einen "Master" -Prozess schreiben, der alle Verbindungen akzeptiert und verarbeitet und sie dann an Ihre beiden Anwendungen weitergibt, die denselben Port abhören müssen. Dies ist der Ansatz, den Webserver und dergleichen verfolgen, da viele Prozesse 80 abhören müssen.

Darüber hinaus gehen wir auf Besonderheiten ein - Sie haben sowohl TCP als auch UDP markiert, was ist das? Auch welche Plattform?

18
Jed Smith

Sie können eine Anwendung an einem Port für eine Netzwerkschnittstelle überwachen lassen. Deshalb könnten Sie haben:

  1. httpd Abhören über eine fernzugängliche Schnittstelle, z. 192.168.1.1:80
  2. ein anderer Daemon lauscht auf 127.0.0.1:80

Beispielanwendungsfall könnte sein, httpd als Load Balancer oder Proxy zu verwenden.

3
SummerBreeze

Eine andere Möglichkeit besteht darin, ein Programm zu verwenden, das an einem Port empfangsbereit ist und die Art des Datenverkehrs (ssh, https usw.) analysiert, der intern an einen anderen Port umgeleitet wird, an dem der "echte" Dienst empfangsbereit ist.

Beispiel für Linux: sslh: https://github.com/yrutschle/sslh

3
Mitchbcn

Wenn Sie eine TCP Verbindung herstellen, werden Sie aufgefordert, eine Verbindung zu einer bestimmten TCP Adresse herzustellen. Dabei handelt es sich um eine Kombination aus einer IP - Adresse (v4 oder v6, je nach Version) das Protokoll, das Sie verwenden) und einen Port.

Wenn ein Server auf Verbindungen wartet, kann er den Kernel darüber informieren, dass er eine bestimmte IP - Adresse und einen bestimmten Port abhören möchte, dh eine TCP Adresse oder denselben Port auf jedem der Die IP-Adressen des Hosts (normalerweise mit der IP-Adresse 0.0.0.0 Angegeben), die effektiv viele verschiedene "TCP-Adressen" abhören (z. B. 192.168.1.10:8000, 127.0.0.1:8000 Usw.)

Nein, es ist nicht möglich, dass zwei Anwendungen dieselbe "TCP-Adresse" abhören. Wenn eine Nachricht eingeht, wie würde der Kernel dann wissen, an welche Anwendung die Nachricht gesendet werden soll?

In den meisten Betriebssystemen können Sie jedoch mehrere IP-Adressen auf einer einzigen Schnittstelle einrichten (z. B. wenn Sie 192.168.1.10 Auf einer Schnittstelle haben, können Sie auch 192.168.1.11 Einrichten, wenn niemand anderes aktiviert ist das Netzwerk verwendet es), und in diesen Fällen können Sie separate Anwendungen haben, die den Port 8000 für jede dieser beiden IP-Adressen abhören.

2
Curt J. Sampson

Wenn mindestens eine der Remote-IPs bereits bekannt ist, statisch ist und nur für die Kommunikation mit einer Ihrer Apps vorgesehen ist, können Sie die iptables-Regel (Tabelle nat, Kette PREROUTING) verwenden, um eingehenden Datenverkehr von dieser Adresse an den "gemeinsam genutzten" lokalen Port weiterzuleiten Jeder andere Port, an dem die entsprechende Anwendung tatsächlich empfangsbereit ist.

2
Stemar

Ja.

Aus diesem Artikel:
https://lwn.net/Articles/542629/

Mit der neuen Socket-Option können mehrere Sockets auf demselben Host an denselben Port gebunden werden

1
user6169806

Ja und nein. Nur eine Anwendung kann einen Port aktiv überwachen. Diese Anwendung kann jedoch ihre Verbindung zu einem anderen Prozess vererben. Sie können also mehrere Prozesse auf demselben Port ausführen.

1
rajesh

Sie können zwei Anwendungen veranlassen, auf der gleichen Netzwerkschnittstelle auf denselben Port zu warten.

Es kann nur einen Listening-Socket für die angegebene Netzwerkschnittstelle und den angegebenen Port geben, dieser Socket kann jedoch von mehreren Anwendungen gemeinsam genutzt werden.

Wenn sich in einem Anwendungsprozess ein abhörender Socket befindet und Sie diesen Prozess fork ausführen, wird der Socket geerbt. Technisch gesehen gibt es jetzt zwei Prozesse, die denselben Port abhören.

0
warvariuc

Ich habe Folgendes mit socat versucht:

socat TCP-L:8080,fork,reuseaddr -

Und obwohl ich keine Verbindung zum Socket hergestellt habe, kann ich trotz der Option reuseaddr nicht zweimal auf demselben Port lauschen.

Ich erhalte diese Nachricht (die ich vorher erwartet hatte):

2016/02/23 09:56:49 socat[2667] E bind(5, {AF=2 0.0.0.0:8080}, 16): Address already in use
0
aDoN

Nur um zu teilen, was @jnewton erwähnt hat. Ich habe auf meinem Mac einen Nginx- und einen eingebetteten Tomcat-Prozess gestartet. Ich kann sehen, dass beide Prozesse bei 8080 ablaufen.

LT<XXXX>-MAC:~ b0<XXX>$ Sudo netstat -anp tcp | grep LISTEN
tcp46      0      0  *.8080                 *.*                    LISTEN     
tcp4       0      0  *.8080                 *.*                    LISTEN   
0
Amit Parashar

Wenn Sie mit Anwendungen mehrere Prozesse meinen, dann ja, aber im Allgemeinen NEIN. Zum Beispiel führt der Apache-Server mehrere Prozesse auf demselben Port aus (in der Regel 80). Dazu wird einer der Prozesse festgelegt, der tatsächlich an den Port gebunden werden soll, und dieser Prozess wird dann zur Übergabe an verschiedene Prozesse verwendet, die Verbindungen akzeptieren.

0
nitinsh99