Können zwei Anwendungen denselben Port hören?

Können zwei Anwendungen auf demselben Computer an denselben Port und dieselbe IP-Adresse gebunden werden? Geht man noch einen Schritt weiter, kann eine App Anfragen von einer bestimmten IP und die andere von einer anderen entfernten IP abhören? Ich weiß, dass ich eine Anwendung haben kann, die zwei Threads (oder Forks) startet, um ein ähnliches Verhalten zu haben, aber können zwei Anwendungen, die nichts gemeinsam haben, dasselbe tun?

   

Für TCP, nein. Sie können nur eine Anwendung gleichzeitig auf demselben Port abhören. Wenn Sie jetzt 2 Netzwerkkarten haben, könnte eine Anwendung auf die erste IP und die zweite auf der zweiten IP mit derselben Portnummer abhören.

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

Ja (für TCP) können Sie zwei Programme auf dem gleichen Socket hören, 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. Dadurch wird eine eingehende TCP-Verbindung an eines der Programme geleitet, nicht an beide, so dass die Verbindung nicht dupliziert wird, sondern nur zwei Programme die eingehende Anfrage bearbeiten können. Zum Beispiel haben Web-Server mehrere processe, die alle auf Port 80 horchen, und das O / S sendet eine neue Verbindung zu dem process, der bereit ist, neue Verbindungen zu akzeptieren.

 SO_REUSEADDR 

Erlaubt anderen Sockets, an diesen Port zu bind() , es sei denn, ein aktiver Listening-Socket ist bereits an den Port gebunden. Dadurch können Sie die Fehlermeldungen “Adresse bereits verwendet” umgehen, wenn Sie versuchen, den Server nach einem Absturz neu zu starten.

Im Prinzip nein.

Es ist nicht in Stein gemeißelt; Aber es ist die Art und Weise, wie alle APIs geschrieben werden: Die App öffnet einen Port, erhält ein Handle dazu und das Betriebssystem benachrichtigt es (über dieses Handle), wenn eine Client-Verbindung (oder ein Paket im UDP-Fall) ankommt.

Wenn das Betriebssystem zwei Apps erlauben würde, den gleichen Port zu öffnen, woher soll es wissen, welchen zu benachrichtigen?

Aber … es gibt Wege um es herum:

  1. Wie Jed bemerkte , könnten Sie einen “Master” -process schreiben, der der einzige ist, der den Port wirklich abhört und andere benachrichtigt, indem er jede Logik verwendet, um Client-Anfragen zu trennen.
    • Auf Linux und BSD (zumindest) können Sie Remapping-Regeln erstellen, die Pakete vom sichtbaren Port zu anderen (wo die Apps horchen) redirect, je nach Netzwerk-bezogenen Kriterien (vielleicht Ursprungsnetzwerk oder andere) einfache Formen des Lastausgleichs).

Ja.

  1. Mehrere hörende TCP-Sockets, die alle an denselben Port gebunden sind, können koexistieren, sofern sie alle an verschiedene lokale IP-Adressen gebunden sind. Clients können sich mit dem verbinden, was sie benötigen. Dies schließt 0.0.0.0 ( INADDR_ANY ) aus.

  2. Mehrere akzeptierte Sockets können koexistieren, alle von demselben hörenden Socket akzeptiert werden und alle dieselbe lokale Portnummer wie der hörende Socket aufweisen.

  3. Mehrere UDP-Sockets, die alle an denselben Port gebunden sind, können alle koexistieren und entweder die gleiche Bedingung wie unter (1) haben oder sie haben alle die SO_REUSEADDR Option vor dem Binden eingestellt.

  4. TCP-Ports und UDP-Ports belegen unterschiedliche Namespaces, sodass die Verwendung eines Ports für TCP dessen Verwendung für UDP nicht ausschließt und umgekehrt.

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

Nein. Nur eine Anwendung kann gleichzeitig an einen Port binden, und das Verhalten, wenn die Bindung erzwungen wird, ist unbestimmt.

Mit Multicast-Sockets – die klingen, als ob Sie nicht in der Nähe sind, was Sie wollen – kann mehr als eine Anwendung an einen Port binden, solange SO_REUSEADDR in den Optionen jedes Sockets festgelegt ist.

Sie können dies erreichen, indem Sie einen “Master” -process schreiben, der alle Verbindungen annimmt und verarbeitet und sie dann an Ihre zwei Anwendungen weitergibt, die auf demselben Port hören müssen. Dies ist der Ansatz, den Web-Server und andere benötigen, da viele processe auf 80 zu hören sind.

Darüber hinaus gehen wir auf Details ein – Sie haben sowohl TCP als auch UDP getaggt, was ist das? Auch welche Plattform?

Ja, auf jeden Fall . Soweit ich mich erinnern kann Ab coreel-Version 3.9 (Nicht sicher in der Version) wurde die Unterstützung für SO_REUSEPORT eingeführt. SO_RESUEPORT ermöglicht das Binden an denselben Port und dieselbe Adresse, solange der erste Server diese Option vor dem Binden seines SO_RESUEPORT einstellt.

Es funktioniert für TCP und UDP . Siehe den Link für weitere Details: SO_REUSEPORT

Hinweis : Die akzeptierte Antwort gilt meiner Meinung nach nicht mehr.

Sie können eine Anwendung an einem Port für eine Netzwerkschnittstelle überwachen lassen. Daher könntest du haben:

  1. httpd hört auf einer fernzugänglichen Schnittstelle auf, zB 192.168.1.1:80
  2. ein anderer Dämon, der auf 127.0.0.1:80 hört

Ein Beispiel für einen Anwendungsfall könnte die Verwendung von httpd als Load Balancer oder Proxy sein.

Eine andere Möglichkeit besteht darin, ein Programm zu verwenden, das in einem Port abhört und die Art des Datenverkehrs (ssh, https, usw.) analysiert, der intern an einen anderen Port weitergeleitet wird, auf dem der “echte” Dienst wartet.

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

Wenn mindestens eine der Remote-IPs bereits bekannt ist, statisch und dediziert, um nur mit einer Ihrer Apps zu kommunizieren, können Sie mithilfe der iptables-Regel (Tabelle nat, chain PREROUTING) eingehenden Verkehr von dieser Adresse zum “freigegebenen” lokalen Port redirect jeden anderen Port, an dem die entsprechende Anwendung tatsächlich zu hören ist.

Ja und nein. Nur eine Anwendung kann einen Port aktiv überwachen. Aber diese Anwendung kann ihre Verbindung zu einem anderen process hinterlassen. Sie könnten also mehrere processe am selben Port betreiben.

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

Wenn Sie eine TCP-Verbindung erstellen, müssen Sie eine Verbindung mit einer bestimmten TCP-Adresse herstellen, bei der es sich um eine Kombination aus einer IP-Adresse (v4 oder v6, abhängig vom verwendeten Protokoll) und einem Port handelt.

Wenn ein Server auf Verbindungen wartet, kann er den coreel darüber informieren, dass er eine bestimmte IP-Adresse und einen bestimmten Port, dh eine IP-Adresse, oder alle IP-Adressen der Hosts an einem bestimmten Port abhören möchte Anhören vieler verschiedener “TCP-Adressen” (zB 192.168.1.10:8000, 127.0.0.1:8000, etc.)

Nein, Sie können nicht zwei Anwendungen auf der gleichen “TCP-Adresse” hören, denn wenn eine Nachricht ankommt, wie würde der coreel wissen, an welche Anwendung er die Nachricht senden soll?

In den meisten Betriebssystemen können Sie jedoch mehrere IP-Adressen auf einer einzigen Schnittstelle einrichten (zB wenn Sie 192.168.1.10 auf einer Schnittstelle haben, können Sie auch 192.168.1.11 einrichten, wenn niemand sonst im Netzwerk sie benutzt) In diesen Fällen können Sie separate Anwendungen verwenden, die Port 8000 an jeder dieser beiden IP-Adressen abhören.

Wenn Sie unter Anwendungen mehrere processe verstehen, dann ja, aber generell NEIN. Zum Beispiel führt der Apache-Server mehrere processe auf demselben Port (in der Regel 80) durch. Dabei wird einer der processe so festgelegt, dass er tatsächlich an den Port bindet und diesen process dann für verschiedene processe verwendet, die Verbindungen akzeptieren.

Sie können zwei Anwendungen veranlassen, denselben Anschluss auf derselben Netzwerkschnittstelle zu überwachen.

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

Wenn Sie in einem Anwendungsprozess einen abhörenden Socket verwenden und diesen process fork , wird der Socket geerbt. Aus diesem Grund werden nun zwei processe denselben Port abhören.

Ich habe folgendes versucht, mit socat :

 socat TCP-L:8080,fork,reuseaddr - 

Und obwohl ich keine Verbindung zum Socket hergestellt habe, kann ich trotz der Option reuseaddr nicht zweimal am selben Port reuseaddr .

Ich bekomme diese Nachricht (was ich vorher erwartet habe):

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

Kurze Antwort:

Gehend durch die Antwort hier gegeben . Sie können zwei Anwendungen mit derselben IP-Adresse und derselben Portnummer empfangen, so lange einer der Ports ein UDP-Port ist, während der andere ein TCP-Port ist.

Erläuterung:

Das Konzept von port ist auf der Transportschicht des TCP / IP-Stacks relevant. Wenn Sie also verschiedene Transportschichtprotokolle des Stacks verwenden, können mehrere processe auf derselben : Kombination.

Ein Zweifel, dass Leute haben, ist, wenn zwei Anwendungen auf der gleichen : Kombination laufen, wie wird ein Client, der auf einem Remote-Computer läuft, zwischen den beiden unterscheiden? Wenn Sie sich den Header des IP-Layer-Pakets ansehen ( https://en.wikipedia.org/wiki/IPv4#Header ), werden Sie sehen, dass die Bits 72 bis 79 für die Definition des Protokolls verwendet werden. So kann die Unterscheidung gemacht werden.

Wenn Sie jedoch zwei Anwendungen mit der gleichen TCP : Kombination haben möchten, ist die Antwort nein (Eine interessante Übung ist das Starten von zwei VMs, geben Sie dieselbe IP-Adresse, aber andere MAC-Adressen und sehen Was passiert – Sie werden feststellen, dass VM1 manchmal Pakete erhält, und manchmal VM2 Pakete – je nach Aktualisierung des ARP-Caches.

Ich habe das Gefühl, dass wenn zwei Anwendungen auf der gleichen : laufen : Sie wollen eine Art Load Balancing erreichen. Dazu können Sie die Anwendungen auf verschiedenen Ports ausführen und IP-Tabellenregeln schreiben, um den Datenverkehr zwischen ihnen zu teilen.

Siehe auch die Antwort von @ user6169806.