Сеть P2P под каждым NAT

Я делаю какой-то мобильный проект, для которого нужно P2P-соединение с двумя устройствами.
И я столкнулся с проблемой. (потому что это редко, что смартфон имеет публичный IP)

Я нашел несколько ответов. Это "UDP Hole Punching".

Я думаю, что понимаю концепцию "UDP Hole Punching" на 100% и пишу несколько кодов. Но это не работает.

Это моя ситуация.

Device A connected NAT(A) for Wi-Fi.  
Device B connected NAT(B) for Wi-Fi.  
NAT(A) and NAT(B) is different one.  

Relay Server S bind socket and waiting for devices. (S is WebServer but Network Status is good.)  

At the first, A and B send dummy packet to S. Then S save UniqueID(to tell A and B), Public IP, Port.  

And S send information to each device A and B.   

Like this:  
 - IP Address and Port Number about A. -> send to B  
 - IP Address and Port Number about B. -> send to A  

Now A and B send UDP packet to other device based on information(IP Address and Port Number) from S.  
(15 per second. using same socket that used server-device session)  

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

Я думаю, что это не проблемы типа NAT. Я тестировал Южную Корею и 90% NAT в Южной Корее не является симметричным конусом.

1 ответ

  1. В зависимости от реализации NAT, он может вообще не работать. Для пробивки NAT требуется специальная форма реализации NAT: a) Если NAT распознает трафик UDP, он может (но иногда не делает) преобразование NAT путем изменения номера порта отправителя на некоторый случайный номер порта (и изменения IP-адреса отправителя на общедоступный IP-адрес), а затем перенаправляет - в течение некоторого ограниченного периода времени - входящий трафик UDP через этот порт обратно на хост за NAT (изменение номера порта и изменение IP-адреса получателя). Вот где это работает. б) Другая возможность состоит в том, что NAT перенаправляет только трафик со специального хоста на этот открытый порт к хосту за NAT. Вот где это не будет работать. в) не стандартизировано, что "обновляет" тайм-аут для правила входящего трафика. Таймаут может быть продлен входящим трафиком. Но может потребоваться исходящий трафик на один и тот же хост (сервер S), чтобы продлить время ожидания.

  2. Также кажется, что состояние UDP истекает очень быстро для некоторых реализаций (в некоторых случаях в течение 100 мс). Это означает, что вам либо нужно будет продолжать отправлять пакеты поддержки активности на ваш сервер 'S' -ИЛИ- вам нужно, по крайней мере, отправлять пакеты UDP за более короткие периоды, чем 100 мс (например, один раз каждые 50 мс или 20 мс).

Другие вопросы по тегам