За NAT к подключению за NAT

Я столкнулся с интересной проблемой. В основном у меня есть 2 мобильных телефона, которые оба находятся за NAT. Я хочу общаться напрямую между двумя устройствами, используя UDP.

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

Однако я бы предпочел просто использовать сервер, чтобы направить 2 устройства друг на друга, а затем позволить им общаться напрямую. Как бы я поступил так? Возможно ли это без использования чего-то вроде uPnP?

Любая помощь будет очень ценится!

Изменить: я нашел этот документ http://www.brynosaurus.com/pub/net/p2pnat/ Похоже, перевод шпильки это то, что я ищу, но он не выглядит широко поддержанным. Интересно, насколько хороша поддержка интернет-провайдера для UPnP?

2 ответа

Решение

То, что вы ищете, это пробивание отверстий UDP, см., Например, http://en.wikipedia.org/wiki/UDP_hole_punching

Основная идея проста: вы указываете каждой конечной точке используемые порты, и они начинают отправлять пакеты udp. Устройства NAT устанавливают правило обхода, когда они видят первый исходящий пакет, а затем следующая попытка с другого конца будет соответствовать этому правилу обхода.

Вам нужен посреднический сервер, чтобы клиенты могли определить, где они находятся. Затем один открывает сервер с помощью uPNP, а другой подключается к нему.

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