Вопрос

Я знаю, что слово "соединение" на самом деле неуместно, когда речь идет об UDP, но...

Как сервер (тот, у которого известен IP) передает свои UDP-пакеты через Интернет клиенту, который находится за NAT?

Например:допустим, клиент подключается и проходит аутентификацию к серверу, используя какой-либо обмен сообщениями по протоколу TCP.На этом этапе сервер готов начать потоковую передачу данных клиенту по протоколу UDP, но как сервер узнает, куда адресовать UDP-пакеты, чтобы они попадали к клиенту через любые маршрутизаторы NAT?

Если клиентский кулак отправляет сообщение "Я готов к потоковой передаче, пожалуйста" по UDP, будут ли маршрутизаторы NAT поддерживать порт открытым, чтобы сервер мог отвечать своим потоком данных UDP?

Или я здесь немного сбился с пути?

Это было полезно?

Решение

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

Я думаю, вы правы, предполагая, что в вашем случае клиент не сможет получать UDP-поток в information.В вашем случае ваш клиент должен будет отправить свой WAN IP на ваш сервер, чтобы инициировать UDP-соединение.Найти IP-адрес WAN ваших клиентов может быть непросто, но есть веб-сайты, которые помогут вам определить ваш IP-адрес WAN, вернув его на текстовой странице.

Если UDP-соединение создается после TCP-соединения сервером, открывающим сокет клиенту на известный UDP-порт, тогда, возможно, стоит изучить UPnP, это позволит вам автоматически настроить пересылку вашего порта на ваш NAT, то есть только в том случае, если ваш NAT поддерживает UPnP, как в случае DSL-маршрутизаторов.

Обходной путь заключался бы в том, чтобы клиент открыл для сервера как TCP,так и UDP сокеты.Поскольку клиент, стоящий за NAT, инициировал соединение, состояния обоих TCP- и UDP-соединений будут добавлены в таблицу соединений NAT.

Другие советы

Игнорирование предоставления перевода известного порта (т.е.данные о это порт отправляется в это адрес) в вашем маршрутизаторе (предоставляющем NAT), вы можете использовать Пробивка отверстий UDP.

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

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

Сервер будет отправлять на этот порт, и трафик может доходить до клиента, а может и не доходить, в зависимости от того, перевел ли NAT выбранный клиентом порт на другой номер или нет.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top