Как несколько приложений прослушивают один и тот же порт (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
перед привязкой, но то, что это делает, перенаправляет входящее соединение только одному из слушателей.