четверг, 15 апреля 2021 г.

P2P связь по UDP между 2-мя хостами, находящимися за NAT

Установить P2P связь по UDP между 2-мя хостами, находящимися за NAT-ами, без вмешательства в клиентские / провайдерские маршрутизаторы (UPnP, port forwarding, NAT-PMP) как оказывается, вполне возможно.

При этом на одной стороне у клиентского роутера нет белого IP-адреса, у провайдера Port Restricted Cone NAT (номер внешнего порта на внешнем IP при посылке UDP-датаграммы непредсказуем). На другой стороне клиентский роутер с белым IP и Port Full Cone NAT (номер внешнего порта на внешнем IP при посылке UDP-датаграммы предсказуем).

Упрощенно это работает так:

1) Пиры A и B посылают на STUN-сервер UDP-датаграмму с запросом BindingRequest. В ответ получают свой внешний IP:port

2) Теперь пиры надо "познакомить", т.е. сообщить адрес визави посредством внешнего канала связи.

   Например, вручную введя адрес, или через некий "трекер" или через DHT, как это делают торрент-пиры.

3) Далее пирам надо периодически посылать друг-другу "привет", до тех пор пока не придет ответ.

Как правило, после второй попытки "приветсвия" удается пробиться, за исключением случая Symmetric NAT.

4) NAT может закрыть порт по таймауту, поэтому периодически надо что-то посылать, например пустую датаграмму.


Статья с обзором видов NAT и методов как их пробивать, включая Symmetric NAT: 

1. A New Method for Symmetric NAT Traversal in UDP and TCP

Комментариев нет:

Отправить комментарий