Czy dwie aplikacje mogą słuchać tego samego portu?

Czy dwie aplikacje na tej samej maszynie mogą łączyć się z tym samym portem i adresem IP? Idąc o krok dalej, czy jedna aplikacja może słuchać żądań pochodzących z określonego IP, a druga do innego zdalnego IP? Wiem, że mogę mieć jedną aplikację, która uruchamia się z dwóch wątków (lub forków), aby mieć podobne zachowanie, ale czy dwie aplikacje, które nie mają nic wspólnego, mogą zrobić to samo?

Author: ROMANIA_engineer, 2009-11-07

16 answers

Dla TCP, nie Możesz mieć tylko jedną aplikację nasłuchującą na tym samym porcie w tym samym czasie. Teraz, jeśli masz 2 karty sieciowe, możesz mieć jedną aplikację nasłuchuj na pierwszym IP, a drugą na drugim IP przy użyciu tego samego numeru portu.

Dla UDP (multicast) wiele aplikacji może subskrybować ten sam port.

 212
Author: Chris Dail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 18:44:03

Tak (dla TCP) możesz mieć dwa programy nasłuchujące na tym samym gnieździe, jeśli programy są do tego zaprojektowane. Gdy gniazdo jest tworzone przez pierwszy program, upewnij się, że opcja SO_REUSEADDR jest ustawiona na gnieździe przed bind(). Jednak może to nie być to, czego chcesz. To, co robi, to przychodzące połączenie TCP będzie kierowane do jednego z programów, a nie obu, więc nie powiela połączenia, po prostu pozwala dwóm programom obsługiwać przychodzące żądanie. Na przykład, web serwery będą miały wiele procesów nasłuchujących na porcie 80, A O / S wysyła nowe połączenie do procesu, który jest gotowy do przyjęcia nowych połączeń.

SO_REUSEADDR

Pozwala innym gniazdom na bind() do tego portu, chyba że istnieje aktywne gniazdo nasłuchowe podłączone do portu. Umożliwia to obejście komunikatów o błędach "adres już używany" podczas próby ponownego uruchomienia serwera po awarii.

 85
Author: JNewton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-11 20:45:48

W zasadzie nie.

To nie jest napisane w kamieniu; ale tak są napisane wszystkie API: aplikacja otwiera port, dostaje uchwyt do niego, a system operacyjny powiadamia go (za pośrednictwem tego uchwytu), gdy połączenie klienta (lub pakiet w przypadku UDP) przybywa.

Jeśli system operacyjny zezwolił dwóm aplikacjom na otwarcie tego samego portu, skąd wiedziałby, którą z nich powiadomić?

Ale... są sposoby na obejście tego:

  1. jak zauważył Jed , można napisać proces 'master', który byłby jedynym to naprawdę nasłuchuje na porcie i powiadamia innych, używając dowolnej logiki, która chce oddzielić żądania klientów.
    • na Linuksie i BSD (przynajmniej) można skonfigurować reguły 'remapowania', które przekierowują pakiety z' widocznego ' portu do innych (gdzie aplikacje nasłuchują), zgodnie z dowolnymi kryteriami związanymi z siecią (może z siecią pochodzenia lub prostymi formami równoważenia obciążenia).
 45
Author: Javier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:48

Tak.

  1. Wiele nasłuchujących gniazd TCP, wszystkie podłączone do tego samego portu, może współistnieć, pod warunkiem, że wszystkie są podłączone do różnych lokalnych adresów IP. Klienci mogą połączyć się z dowolnym, który jest im potrzebny. Nie obejmuje to 0.0.0.0 (INADDR_ANY).

  2. Wiele zaakceptowanych gniazd może współistnieć, wszystkie akceptowane z tego samego gniazda nasłuchowego, wszystkie z tym samym numerem portu lokalnego, co gniazdo nasłuchowe.

  3. Wiele gniazd UDP podłączonych do tego samego portu czy wszystkie mogą współistnieć pod warunkiem, że mają ten sam warunek co at (1) lub że wszystkie mają ustawioną przed wiązaniem opcję SO_REUSEADDR.

  4. Porty TCP i UDP zajmują różne przestrzenie nazw, więc użycie portu dla TCP nie wyklucza jego użycia dla UDP, a odwrotnie.

Reference: Stevens & Wright, TCP / IP Illustrated, Volume II.

 42
Author: user207421,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-30 08:47:16

Nie. Tylko jedna aplikacja może wiązać się z portem na raz, a zachowanie, jeśli Wiązanie jest wymuszone, jest nieokreślone.

W przypadku gniazd multicastowych -- które brzmią jak nigdzie indziej niż to, co chcesz -- więcej niż jedna aplikacja może połączyć się z portem tak długo, jak SO_REUSEADDR jest ustawiony w opcjach każdego gniazda.

Możesz to osiągnąć pisząc proces "master", który akceptuje i przetwarza wszystkie połączenia, a następnie przekazuje je dwóm aplikacjom, które muszą słuchać na tym samym porcie. Jest to podejście, które serwery internetowe i takie przyjmują, ponieważ wiele procesów musi słuchać 80.

Poza tym, wchodzimy w szczegóły -- otagowałeś zarówno TCP, jak i UDP, co to jest? Jaka Platforma?

 18
Author: Jed Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-07 19:39:54

Tak Zdecydowanie . O ile pamiętam od wersji jądra 3.9 (Nie jestem pewien co do wersji) wprowadzono wsparcie dla SO_REUSEPORT. SO_RESUEPORT umożliwia powiązanie z tym samym portem i Adresem, o ile pierwszy serwer ustawia tę opcję przed powiązaniem gniazda.

Działa zarówno dla TCP jak i UDP . Więcej szczegółów można znaleźć w linku: SO_REUSEPORT

Uwaga : zaakceptowana odpowiedź nie jest już zgodna z moją opinią.

 12
Author: piyush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-13 08:47:33

Możesz mieć jedną aplikację nasłuchującą na jednym porcie dla jednego interfejsu sieciowego. Dlatego można mieć:

  1. httpd nasłuchiwanie na zdalnie dostępnym interfejsie, np. 192.168.1.1:80
  2. kolejny daemon nasłuchujący 127.0.0.1:80

Przykładowym przypadkiem użycia może być użycie httpd jako load balancer lub proxy.

 3
Author: SummerBreeze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-20 06:52:53

Innym sposobem jest użycie programu nasłuchującego w jednym porcie, który analizuje rodzaj ruchu (ssh, https, itp.), który przekierowuje wewnętrznie do innego portu, na którym nasłuchuje "prawdziwa" usługa.

Na przykład dla Linuksa, sslh: https://github.com/yrutschle/sslh

 3
Author: Mitchbcn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-28 09:37:03

Jeśli co najmniej jeden zdalny adres IP jest już znany, statyczny i dedykowany do rozmowy tylko z jedną z Twoich aplikacji, możesz użyć reguły iptables (table nat, chain PREROUTING), aby przekierować ruch z tego adresu do" współdzielonego " lokalnego portu do dowolnego innego portu, na którym odpowiednia aplikacja faktycznie nasłuchuje.

 2
Author: Stemar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-05 21:24:48

Tak i nie. Tylko jedna aplikacja może aktywnie nasłuchiwać na porcie. Ale ta aplikacja może zapisać swoje połączenie z innym procesem. Więc możesz mieć wiele procesów pracujących na tym samym porcie.

 1
Author: rajesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-15 16:56:25

Tak.

Z tego artykułu:
https://lwn.net/Articles/542629/

Nowa opcja socket pozwala wielu gniazdom na tym samym hoście wiązać się z tym samym portem

 1
Author: user6169806,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-07 02:46:36

Kiedy tworzysz połączenie TCP, prosisz o połączenie z określonym adresem TCP, który jest kombinacją adresu IP (v4 lub v6, w zależności od używanego protokołu) i portu.

Gdy serwer nasłuchuje połączeń, może poinformować jądro, że chce nasłuchać określonego adresu IP i portu, np. jednego adresu IP, lub wszystkich adresów IP hostów, każdy na określonym porcie, które skutecznie nasłuchuje na wielu różnych "adresach TCP" (np., 192.168.1.10: 8000, 127.0.0.1: 8000 itd.)

Nie, Nie możesz mieć dwóch aplikacji nasłuchujących na tym samym "adresie TCP", ponieważ kiedy pojawia się wiadomość, skąd jądro wie, do której aplikacji ma ją przekazać?

Jednak w większości systemów operacyjnych możesz skonfigurować kilka adresów IP na jednym interfejsie( np. jeśli masz 192.168.1.10 na interfejsie, możesz również skonfigurować 192.168.1.11, jeśli nikt inny w sieci go nie używa), a w takich przypadkach możesz mieć osobne aplikacje nasłuchujące na porcie 8000 na każdym z tych dwóch adresów IP.

 1
Author: Curt J. Sampson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-18 07:53:46

Jeśli przez aplikacje masz na myśli wiele procesów, to tak, ale ogólnie nie. Na przykład serwer Apache uruchamia wiele procesów na tym samym porcie (zazwyczaj 80). odbywa się to poprzez wyznaczenie jednego z procesów, aby rzeczywiście powiązać port, a następnie użyć tego procesu do przekazania do różnych procesów, które akceptują połączenia.

 0
Author: nitinsh99,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-23 00:19:51

Możesz sprawić, że dwie aplikacje będą nasłuchiwać dla tego samego portu w tym samym interfejsie sieciowym.

Może być tylko jedno gniazdo nasłuchowe dla określonego interfejsu sieciowego i portu, ale gniazdo to może być współdzielone między kilkoma aplikacjami.

Jeśli masz gniazdo nasłuchowe w procesie aplikacji i fork ten proces, gniazdo zostanie odziedziczone, więc technicznie będą teraz dwa procesy nasłuchujące tego samego portu.

 0
Author: warvariuc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-30 09:28:54

Próbowałem z socat:

socat TCP-L:8080,fork,reuseaddr -

I mimo, że nie nawiązałem połączenia z gniazdem, nie mogę słuchać dwa razy na tym samym porcie, pomimo opcji reuseaddr.

Otrzymuję wiadomość (której się wcześniej spodziewałem):

2016/02/23 09:56:49 socat[2667] E bind(5, {AF=2 0.0.0.0:8080}, 16): Address already in use
 0
Author: aDoN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-23 10:00:17

Krótka odpowiedź:

Po odpowiedzi udzielonej tutaj . Możesz mieć dwie aplikacje nasłuchujące na tym samym adresie IP i numerze portu, o ile jeden z portów jest portem UDP, a drugi portem TCP.

Explanation:

Pojęcie portu jest istotne na warstwie transportowej stosu TCP / IP, więc tak długo, jak używasz różnych protokołów warstwy transportowej stosu, możesz mieć wiele procesów nasłuchujących na tym samym <ip-address>:<port> kombinacja.

Jedna wątpliwość, że ludzie mają jest jeśli dwie aplikacje są uruchomione na tej samej kombinacji <ip-address>:<port>, jak klient uruchomiony na zdalnej maszynie odróżnić te dwie? Jeśli spojrzysz na nagłówek pakietu warstwy IP (https://en.wikipedia.org/wiki/IPv4#Header ), zobaczysz, że bity od 72 do 79 są używane do definiowania Protokołu, w ten sposób można dokonać rozróżnienia.

Jeśli jednak chcesz mieć dwie aplikacje na tej samej kombinacji TCP <ip-address>:<port>, to odpowiedź czy nie (ciekawym ćwiczeniem będzie uruchomienie dwóch maszyn wirtualnych, dać im ten sam adres IP, ale różne adresy MAC, i zobaczyć, co się stanie-można zauważyć, że niektóre razy VM1 dostanie Pakiety, a inne razy VM2 dostanie pakiety-w zależności od odświeżania pamięci podręcznej ARP).

Czuję, że poprzez uruchomienie dwóch aplikacji na tym samym <op-address>:<port> chcesz osiągnąć jakiś rodzaj równoważenia obciążenia. W tym celu można uruchamiać aplikacje na różnych portach i pisać reguły tabeli IP, aby rozwidlić ruch między oni.

Zobacz też odpowiedź @user6169806.
 -1
Author: Sahil Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:48