Как ОС генерирует случайный порт сокета?

0

Мне интересно, как ОС гарантирует, что клиенты не получат тот же «случайный» (привязывающий сокет, установив порт на 0) порт, как любой другой клиент в сети, поскольку я хочу общаться по протоколу UDP между моим сервером и множеством машин, использующих один и тот же локальный IP-адрес, было бы очень трудно, если бы клиенты получали пакеты друг от друга.

grimgrom
источник
Это хороший вопрос, но это широкая тема, а не c ++, связанный в его нынешнем виде. Вы можете получить лучший ответ на суперпользователя.
Mike
Хорошо, но вы уверены, что ОС не выберет тот же порт, что и любой другой компьютер в той же сети?
Это широковещательные пакеты? Вы говорите об общении через устройство NAT?
Harry Johnston

Ответы:

3

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

Порты не должны быть уникальными в сети, только за соединение. Соединение состоит из

  • IP источника
  • исходный порт
  • IP-адрес назначения
  • порт назначения

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

Fozi
источник
Я не был достаточно ясен, извините. Я использую протокол UDP, который означает, что, если два клиента в одной сети используют один и тот же порт и получают пакет от кого-то за пределами этой локальной сети, оба клиента получат пакет? Я прав?
@grimgrom Нет, если вы используете маршрутизатор, тогда целевой IP будет другим. Если вы используете NAT, то маршрутизатор NAT должен будет назначить разные порты для каждого клиента. Вам нужно будет как-то настроить это (явная переадресация, UPnP, запуск портов, пробивание NAT-дырок, ...). В любом случае клиенты могут использовать один и тот же локальный порт, а NAT - нет.
Хорошо, но как насчет этого случая: две машины в одной сети обмениваются данными с сервером вне сети (например, с использованием публичного IP-адреса 40,40,40,40 и порта 4444). Итак, две машины используют один и тот же порт. Что произойдет, когда сервер отправит пакет на ip: 40,40,40,40: 4444? Кто получает пакет? Помните, что машины используют протокол UDP.
@grimgrom Когда пакет попадает в маршрутизатор NAT, маршрутизатор назначает случайный порт и повторно отправляет сам пакет, когда он получает ответ, он использует созданную им справочную таблицу и перенаправляет пакет тому, кто его первоначально запросил. Таким образом, чтобы ответить на ваш вопрос «ОС роутера обрабатывает это, а не клиент, ни сервер» в вашем случае, если вы говорите о NAT.
Scott Chamberlain
0

как ОС гарантирует, что клиенты не получат тот же «случайный» (привязывающий сокет, установив порт на 0) порт, как любой другой клиент в сети

Это не так. Это гарантирует, что местные приложения получить уникальный порт в текущем хосте , Ничего общего с клиентами или сетью.

было бы очень сложно, если бы клиенты получали друг от друга пакеты.

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

user207421
источник
Хорошо, я понимаю, но как работает SO_REUSEPORT и как его реализовать?
grimgrom
SO_REUSEPORT используется для многоадресных клиентов. Если вы установите его для всех задействованных сокетов дейтаграмм, все они могут использовать один и тот же порт и будут получать многоадресные рассылки на этот порт.
user207421