Как несколько приложений прослушивают один и тот же порт (80)?

У многих вопросов, связанных с используемым портом 80, есть ответы, говорящие, что существует много программ, которые используют его как порт по умолчанию. В этом сообщении упоминаются некоторые: Skype, IIS, Apache...

Поскольку только одно приложение может прослушивать любой порт за раз - как это может быть? И если ответ заключается в том, что только порт по умолчанию - как приложение будет знать, что оно должно отправлять информацию на другой порт? Например, если iis будет прослушивать порт 81, потому что Skype прослушивает 80 - как кто-нибудь, кто запросит веб-страницу, узнает, что отправит запрос на theip: 81, в отличие от theip: 80?

Моя цель состоит в том, чтобы иметь надежный способ настройки соединения между программами, когда любой жестко закодированный порт может выйти из строя из-за того, что какое-то приложение уже прослушивает его. Порт нужно будет использовать только один раз, чтобы сообщить, какой динамический порт будет использоваться для остальной части сеанса. Это проблема как для сетевых подключений, так и для подключения нескольких приложений на одном компьютере.

Регистрация с помощью IANA не всегда возможна и даже не обязательно решит проблему - кто-то все еще может прослушивать зарегистрированный порт. И, очевидно, решение "надежды на отсутствие столкновений" - просто не режет.

(Я понимаю, что соединение имеет два сокета (и протокол), и поэтому один сокет может иметь несколько подключений. Мой вопрос заключается в прослушивании сокета, чтобы установить соединение.)

Что бы я ожидал, существует ли какая-то служба в ОС (Windows), с которой я мог бы регистрировать свое приложение и получать весь входящий трафик с некоторой подписью, даже если это просто какая-то магическая строка. Или, возможно, какой-то порт, где несколько приложений могут прослушиваться одновременно - и все получат каждое входящее сообщение. Но пока я не нашел ничего подобного.

Ответ 1

Как это может быть? Просто... это не так. На каждом порту будет прослушиваться только одно приложение. - Адриано Репетти

Правильно. Когда Skype прослушивает эти порты до того, как я запустил свой веб-сервер, сервер терпит неудачу. Мне потребовалось некоторое время, чтобы узнать, почему.

Только одно приложение может прослушивать сокет разумным способом. ОС позволяет нескольким приложениям прослушивать один и тот же порт, если вы укажете специальные параметры, но это безумие. Принятые соединения затем отправляются в разные приложения по неуказанному (т.е. случайному) способу.

IIS может запускать несколько веб-приложений на одном и том же порту, потому что он открывает порт один раз в режиме ядра и отправляет соединения своим рабочим процессам.

Ответ 2

Я не верю, что когда-либо несколько сокетов могут прослушивать один и тот же (TCP) порт. Если вы попытаетесь связать сокет с уже открытым портом, вы получите сообщение об ошибке.

Я считаю, что Skype обошел проблему, которую вы описываете, используя свои собственные серверы в качестве точки рандеву. Простое объяснение:

  • Алиса начинает свой клиент, подключается к центральному серверу и сообщает ему, в каком порту она слушает.
  • Боб начинает свой клиент и также сообщает центральный сервер.
  • Теперь Алиса хочет подключиться к Бобу, но не знает, к какому порту отправлять пакеты.
  • Затем Алиса запросит центральный сервер для номера порта Боба.
  • С помощью этой информации после этого Боб использует прямое соединение с этим портом.

Разумеется, логика может распространяться на изучение IP-адреса другой стороны, а также на получение открытых ключей.

Обратите внимание, что на самом деле немного больше связано с большинством современных одноранговых приложений, поэтому Skype не является исключением. Проблема в том, что большинство компьютеров теперь отстают хотя бы от одного NAT-маршрутизатора. Получение двух устройств позади своего собственного маршрутизатора для соединения друг с другом известно как обход NAT - наиболее распространенный метод, имеющий центральный координирующий сервер, обязывает обоих клиентов одновременно подключаться друг к другу. Для получения дополнительной информации об этом, я рекомендую Steve Gibson Security Now! , эпизод № 42

Ответ 3

  • Для TCP вы можете одновременно прослушивать только одно приложение на одном порту. Теперь, если у вас есть две сетевые карты или созданный виртуальный интерфейс, одно приложение может прослушивать первый IP-адрес, а второй - на втором IP-адресе, используя тот же номер порта.
  • Для UDP (многоадресной рассылки) несколько приложений могут подписаться на один и тот же порт.

one application listening on a single port что причина, по которой существуют порты. Чтобы позволить нескольким приложениям совместно использовать сеть без конфликтов.

Но есть способы сделать то, что вы просили:

  • Вы можете написать master процесс, который имеет порт и уведомляет slave процессы, используя некоторую логику разделения.
  • В Linux и BSD вы можете настроить правила переназначения, которые перенаправляют пакеты из visible порта на разные (например, приложение-слушатель), снова используя некоторую логику разделения (например, перенаправление в соответствии с происхождением сети и т.д.).

Примечание. Для TCP несколько приложений могут прослушиваться в одном и том же сокете с использованием опции SO_REUSEADDR перед привязкой, но то, что это делает, перенаправляет входящее соединение только одному из слушателей.