UDP, NAT и настройка «соединений» - PullRequest
12 голосов
/ 04 апреля 2009

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

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

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

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

Или я не в курсе?

Ответы [ 3 ]

4 голосов
/ 04 апреля 2009

Игнорируя предоставление известной трансляции порта (т.е. данные на этот порт переходит на этот адрес) в вашем маршрутизаторе (с предоставлением NAT), вы можете использовать UDP Hole Штамповка .

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

1 голос
/ 04 апреля 2009

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

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

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

1 голос
/ 04 апреля 2009

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

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

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

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

...