Могут ли два приложения на одном компьютере связываться с одним и тем же портом и IP-адресом? Если сделать еще один шаг вперед, может ли одно приложение прослушивать запросы, приходящие с определенного IP, а другое - на другой удаленный IP? Я знаю, что у меня может быть одно приложение, которое запускает два потока (или ветвления) для одинакового поведения, но могут ли два приложения, которые не имеют ничего общего, делать то же самое?
283
Ответы:
Ответ зависит от того, какая ОС рассматривается. В общем, хотя:
Для TCP нет. Вы можете иметь только одно приложение, прослушивающее один и тот же порт одновременно. Теперь, если у вас есть две сетевые карты, вы можете заставить одно приложение прослушивать первый IP-адрес, а второе - второй IP-адрес, используя один и тот же номер порта.
Для UDP (Multicasts) несколько приложений могут подписаться на один и тот же порт.
Изменить: Начиная с Linux Kernel 3.9 и выше, поддержка нескольких приложений, прослушивающих один и тот же порт, была добавлена с помощью этой
SO_REUSEPORT
опции. Более подробная информация доступна в этой статье lwn.net.источник
Да (для TCP) вы можете заставить две программы прослушивать один и тот же сокет, если программы предназначены для этого. Когда сокет создается первой программой, убедитесь, что
SO_REUSEADDR
перед вами установлена опцияbind()
. Тем не менее, это может быть не то, что вы хотите. При этом входящее TCP-соединение будет направлено на одну из программ, а не на обе, поэтому оно не дублирует соединение, а просто позволяет двум программам обслуживать входящий запрос. Например, веб-серверы будут иметь несколько процессов, все слушающие через порт 80, и O / S отправляет новое соединение процессу, который готов принять новые соединения.Позволяет подключать к
bind()
этому порту другие сокеты , если к этому порту уже не подключен активный прослушивающий сокет. Это позволяет обойти эти сообщения об ошибках «Адрес уже используется» при попытке перезагрузить сервер после сбоя.источник
SO_REUSEADDR
конечно, не позволяет иметь два сокета TCP в состоянии прослушивания одновременно, по крайней мере, в Unix. Он предназначен для обходаTIME_WAIT state
: unixguide.net/network/socketfaq/4.5.shtml . Это может работать в Windows, но вы не гарантированы, что запрос все равно достигнет нужного сервера).Да.
Несколько прослушивающих сокетов TCP, все связанные с одним и тем же портом, могут сосуществовать, если они все связаны с разными локальными IP-адресами. Клиенты могут подключаться к тому, что им нужно. Это исключает
0.0.0.0
(INADDR_ANY
).Могут сосуществовать несколько принятых сокетов, все из которых принимаются из одного и того же прослушивающего сокета, и все показывают тот же номер локального порта, что и прослушивающий сокет.
Несколько UDP-сокетов, все связанные с одним и тем же портом, могут сосуществовать при условии, что либо то же условие, что и в (1), либо у них всех есть
SO_REUSEADDR
опция, установленная перед привязкой.TCP-порты и UDP-порты занимают разные пространства имен, поэтому использование порта для TCP не исключает его использования для UDP, и наоборот.
Ссылка: Стивенс и Райт, иллюстрированный TCP / IP, том II.
источник
В принципе нет.
Это не написано в камне; но так пишутся все API: приложение открывает порт, получает его дескриптор, и ОС уведомляет его (через этот дескриптор), когда приходит клиентское соединение (или пакет в случае UDP).
Если ОС позволяет двум приложениям открывать один и тот же порт, как она узнает, какое из них следует уведомить?
Но ... есть способы обойти это:
источник
iptables -m statistic --mode random --probability 0.5
это весело.listen()
подключиться. Скорее всего, вопрос заключается в том, чтобы открыть его в брандмауэре. Здесь слишком много ошибок, и все они исправлены за 7 лет. Ответ также исключает случай привязки к другому локальному адресу с одинаковым номером порта. Это на самом деле совершенно неверно.Да, безусловно . Насколько я помню, начиная с версии ядра 3.9 (не уверен в версии)
SO_REUSEPORT
была введена поддержка.SO_RESUEPORT
позволяет привязку к одному и тому же порту и адресу, если первый сервер устанавливает эту опцию перед привязкой своего сокета.Он работает как для TCP, так и для UDP . Обратитесь к ссылке для более подробной информации: SO_REUSEPORT
Примечание : принятый ответ больше не соответствует действительности, по моему мнению.
источник
Нет. Только одно приложение может связываться с портом за раз, и поведение при принудительном связывании является неопределенным.
С многоадресными сокетами - которые звучат так, как если бы они не были близки к тому, что вы хотите - более одного приложения могут связываться с портом, если SO_REUSEADDR установлен в опциях каждого сокета.
Вы можете сделать это, написав «основной» процесс, который принимает и обрабатывает все соединения, а затем передает их вашим двум приложениям, которым необходимо прослушивать один и тот же порт. Это подход, который используют веб-серверы и тому подобное, поскольку многие процессы должны прослушивать 80.
Помимо этого, мы углубимся в специфику - вы пометили и TCP, и UDP, что это? Кроме того, какая платформа?
источник
Одно приложение может прослушивать один порт для одного сетевого интерфейса. Поэтому вы могли бы иметь:
httpd
прослушивание через удаленно доступный интерфейс, например192.168.1.1:80
127.0.0.1:80
Примером использования может быть использование
httpd
в качестве балансировщика нагрузки или прокси.источник
Другой способ - использовать программу, прослушивающую один порт, который анализирует тип трафика (ssh, https и т. Д.), Который он перенаправляет внутренне на другой порт, который прослушивает «настоящая» служба.
Например, для Linux sslh: https://github.com/yrutschle/sslh
источник
Когда вы создаете TCP-соединение, вы запрашиваете подключение к определенному TCP-адресу, который представляет собой комбинацию IP-адреса (v4 или v6, в зависимости от используемого протокола) и порта.
Когда сервер прослушивает соединения, он может сообщить ядру, что он хочет прослушивать определенный IP-адрес и порт, т. Е. Один TCP-адрес, или на одном и том же порту на каждом из IP-адресов хоста (обычно указывается с помощью IP-адреса).
0.0.0.0
), который эффективно прослушивает много различных «TCP - адреса» (например,192.168.1.10:8000
,127.0.0.1:8000
и т.д.)Нет, два приложения не могут прослушивать один и тот же «TCP-адрес», потому что, когда приходит сообщение, как ядро узнает, какое приложение должно передать сообщение?
Однако в большинстве операционных систем вы можете настроить несколько IP-адресов на одном интерфейсе (например, если у вас есть
192.168.1.10
интерфейс, вы также можете настроить его192.168.1.11
, если его никто не использует в сети), и в этих случаях вы может иметь отдельные приложения, прослушивающие порт8000
на каждом из этих двух IP-адресов.источник
Если хотя бы один из удаленных IP-адресов уже известен, статичен и предназначен для общения только с одним из ваших приложений, вы можете использовать правило iptables (таблица nat, chain PREROUTING) для перенаправления входящего трафика с этого адреса на «общий» локальный порт для любой другой порт, где на самом деле слушает соответствующее приложение.
источник
Да и нет. Только одно приложение может активно прослушивать порт. Но это приложение может завещать свое соединение с другим процессом. Таким образом, вы можете иметь несколько процессов, работающих на одном порту.
источник
Да.
Из этой статьи:
https://lwn.net/Articles/542629/
источник
Если под приложениями вы подразумеваете несколько процессов, то да, но, как правило, НЕТ. Например, сервер Apache запускает несколько процессов на одном и том же порту (как правило, 80). Это делается путем назначения одного из процессов фактическому связыванию с портом, а затем использования этого процесса для передачи обслуживания различным процессам, которые принимают соединения.
источник
Два приложения могут прослушивать один и тот же порт на одном сетевом интерфейсе.
Для указанного сетевого интерфейса и порта может быть только один прослушивающий сокет, но этот сокет может использоваться несколькими приложениями.
Если у вас есть прослушивающий сокет в процессе приложения, и вы
fork
этот процесс, сокет будет унаследован, так что технически теперь будут два процесса, слушающие один и тот же порт.источник
Я пробовал следующее, с
socat
:И хотя я не установил соединение с сокетом, я не могу дважды прослушивать один и тот же порт, несмотря на эту
reuseaddr
опцию.Я получаю это сообщение (что я ожидал раньше):
источник
Просто чтобы поделиться тем, что упомянул @jnewton. Я запустил nginx и встроенный процесс tomcat на моем Mac. Я вижу, как процесс запускается на 8080.
источник
Короткий ответ:
Судя по ответу, приведенному здесь . Вы можете иметь два приложения, прослушивающие один и тот же IP-адрес и номер порта, поэтому один из портов является портом UDP, а другой - портом TCP.
Объяснение:
Концепция порта применима к транспортному уровню стека TCP / IP, поэтому, если вы используете разные протоколы транспортного уровня стека, вы можете иметь несколько процессов, прослушивающих одну и ту же
<ip-address>:<port>
комбинацию.Люди сомневаются в том, что если два приложения работают в одной
<ip-address>:<port>
комбинации, как клиент, работающий на удаленном компьютере, различает эти два? Если вы посмотрите на заголовок пакета уровня IP ( https://en.wikipedia.org/wiki/IPv4#Header ), вы увидите, что биты с 72 по 79 используются для определения протокола, именно так можно провести различие.Однако, если вы хотите, чтобы два приложения использовали одну и ту же
<ip-address>:<port>
комбинацию TCP , ответ - нет (Интересным упражнением будет запуск двух виртуальных машин, присвоение им одинакового IP-адреса, но разных MAC-адресов, и посмотреть, что произойдет - вы заметите, что несколько раз VM1 получит пакеты, а в другой раз VM2 получит пакеты - в зависимости от обновления кэша ARP).Я чувствую, что, запустив два приложения на одном и том же,
<op-address>:<port>
вы хотите добиться некоторой балансировки нагрузки. Для этого вы можете запускать приложения на разных портах и писать правила IP-таблиц для разделения трафика между ними.Также см. Ответ @ user6169806.
источник