Получение ответа через UDP - PullRequest
6 голосов
/ 29 ноября 2009

Я видел, как приложения отправляли пакет через UDP на IP-адрес какого-либо порта и получали ответ. На какой порт идет ответ? (Кстати, как маршрутизатор может узнать, что ответ для моего ПК, если нет портов, перенаправленных на мой ПК?)

Привет, Neo_b

Ответы [ 3 ]

9 голосов
/ 29 ноября 2009

Какой порт назначен ответу, зависит от приложения. UDP полностью лишен состояния, поэтому после запуска пакета единственный способ, которым приложение может ожидать ответ, - это если он знает, что другой конец отправит один. В зависимости от приложения UDP, я бы ожидал, что ответ будет поступать на один и тот же порт для простоты - это не относится к протоколам, таким как TCP, которые имеют намеренно случайный (и высокий) порт источника.

Чтобы ответить на ваш второй вопрос, многие маршрутизаторы, даже недорогие домашние маршрутизаторы, проводят проверку пакетов с отслеживанием состояния (SPI). Нечто подобное может произойти, но я готов поправиться, если у меня не получится:

[Установить сцену с клиентом, маршрутизатором, Интернетом, сервером.]

  1. Клиент отправляет пакет UDP.
  2. Маршрутизатор передает UDP-пакет в Интернет.
  3. Маршрутизатор запоминает, что клиент отправил пакет UDP на сервер, и устанавливает сопоставление в своей памяти.
  4. Сервер отправляет пакет UDP, вероятно, на тот же порт.
  5. Маршрутизатор получает пакет и проверяет сопоставление, чтобы обнаружить, что клиент недавно общался с сервером.
  6. Маршрутизатор передает пакет клиенту.

Я полагаю, как это реализовано, зависит от маршрутизатора, но я понимаю, как он работает.

3 голосов
/ 30 ноября 2009

Если я отправлю сообщение на порт UDP на другом компьютере, какой порт, с которого я отправляю сообщение, независимо от того, как он выбран, появится в дейтаграмме UDP. Я бы подумал, что удаленный конец отправит любой ответ на эту дейтаграмму этому порту источника.

Я полагаю, что то же самое применимо, даже если порты изменены брандмауэром или устройством NAT, удаленный конец видит дейтаграмму с определенного порта и отправляет ответ обратно, а устройство брандмауэра / NAT переводит этот порт в исходный порт источника.

2 голосов
/ 29 ноября 2009

Когда вы создаете сокет UDP, вы должны привязать его к номеру порта. Если вы этого не сделаете, операционная система назначит эфемерный порт.

Приложение на другой стороне должно знать этот порт. Когда ответы отправляются обратно, ваш маршрутизатор может не знать, как маршрутизировать. Есть 2 способа решить эту проблему

  1. Вы можете явно настроить маршрут на ваш компьютер на определенном порт.
  2. Вы можете настроить свой маршрутизатор на отслеживать соединение UDP по автоматически открывать маршрут к ваш компьютер, когда определенный пакет отправлен. UPNP протокол основанный на этой концепции.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...