За 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, а другой подключается к нему.