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

2 ответа2

3

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

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

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

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

0

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

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

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

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

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