Назад | Перейти на главную страницу

Не уверен, что IIS использует временные порты

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

Неужели это действительно так? Все, что я видел, упоминает, что для клиентов используются эфемерные порты, но сервер по-прежнему будет просто портом 80. Таким образом, вы никогда не должны сталкиваться с исчерпанием портов на сервере таким образом, только возможно на клиенте.

Я видел упоминания о серверах, использующих этот подход для FTP (https://en.wikipedia.org/wiki/Ephemeral_port). Хотя никогда ничего для HTTP-запросов.

Любое разъяснение было бы замечательно. Спасибо!

Насколько я помню, при разработке сокетов TCP (было какое-то время, может быть, немного не так), у серверов есть один вызов сокета слушателя: bind, listen и accept и будет ждать. Как только будет входящее соединение, accept разблокирует и вернет другой объект сокета. Этот объект второго сокета будет похож на дескриптор фактического соединения и может выполнять сетевой ввод-вывод, в то время как исходный сокет может возвращаться для приема сетевых подключений. Эта операция не использует временный порт.

Я не уверен в точной внутренней работе ОС в отношении управления подключениями, но для меня сетевой драйвер может просто связывать подключения из удаленной комбинации IP / порта с определенным идентификатором дескриптора при вызове accept. Это позволяет сетевому драйверу успешно направлять сетевой ввод-вывод на правильный дескриптор сокета, позволяя при этом устанавливать новые протоколы TCP с того же локального порта, но другой удаленный IP / порт обрабатывать слушателем без необходимости в дополнительном порту. Слушатель снова вызовет accept и создаст новый дескриптор сокета для ввода-вывода для следующего входящего соединения и так далее.

Вот пример сокета сервера WinSock: ссылка на сайт. Вот описание и возвращаемое значение функции accept: ссылка на сайт.