3

В общем, временные порты используются клиентами при установлении соединения с сервером.

Например:

  1. Сервер прослушивает порт 80
  2. Клиент (браузер, FTP-клиент, клиент bittorent) отправляет запрос на сервер, включая временный порт, назначенный ОС
  3. Сервер отвечает, используя предоставленный эфемерный порт в качестве порта назначения

А теперь вопрос:

Я написал серверное приложение, которое я хотел бы запускать на произвольном свободном порте каждый раз, когда оно запускается (чтобы не задавать этот вопрос, я не буду объяснять, почему мне нравится такое поведение). Теперь мой вопрос: какие последствия это имело бы, если бы я использовал один из эфемерных портов для сервера для прослушивания. Есть ли какие-либо недостатки (также с точки зрения безопасности) в этом?

Может быть, вы знаете какой-нибудь пример сервера, который также использует эфемерные порты на практике?

Одной из моих проблем является также заявление из Руководства по TCP/IP: всеобъемлющая иллюстрированная справка по интернет-протоколам (стр. 705):

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

2 ответа2

1

Если вы прослушиваете эфемерный порт, вы можете рискнуть самостоятельно подключиться по TCP.

1

В качестве справки на странице Википедии в Ephemeral Port приведена дополнительная информация о номерах портов, фактически используемых ОС.

Из этого сразу видно, что доступно много портов, которые обычно не используются сервером (процессами) и не находятся в эфемерном диапазоне.

Таким образом, очевидным решением будет случайный выбор одного из этих других портов. Это позволяет избежать необходимости делать предположения о том, как ОС выделяет из эфемерного диапазона: проверяет ли она фактическое использование или только свои распределения, чтобы избежать коллизий для новых распределений?

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .