Подтвердить что ты не робот

Перфорация отверстий UDP не проходит через 3G

Я пытаюсь реализовать в программном обеспечении функцию пробивки отверстий. Дело в том, что я реализую это с уже сделанным TCP-сервером для связи с Пользователями.

Вот что я до сих пор:

  • "A" отправляет сообщение на UDP-сервер "US" (на порт 9333)
  • "US" отправляет обратно "A" к порту, к которому он подключен (порт 31000 - локальный порт 31005)
  • "A" отправляет сообщение на TCP-сервер "TS", говоря, что он хочет подключиться к B (и передать порт 31000).
  • "TS" отправляет сообщение "B" , давая ему порт "A" (31000) и ip
  • "B" отправляет сообщение "США" (на порт 9333)
  • "US" отправляет сообщение "B" , сообщая ему свой порт 45000 (localport 45005).
  • "B" отправляет сообщение "TS", давая udp-порт (45000)
  • "TS" отправляет сообщение "A" , дающее B udp-порт (45000) и ip
  • "A" начать отправку сообщения udp в B ip на порт 45000 и прослушать локальный порт 31005
  • "B" начать отправку сообщения udp в ip на порт 31000 и прослушивать локальный порт 45005

Конечно, порты 31000, 31005, 45000 и 45005 здесь, например, каждое новое соединение, которое изменяется порт, только 9333 статично.

Я знаю, что много назад и вперед, больше, чем должно быть на самом деле. Дело в том, что я обязан использовать TCP-сервер для взаимодействия с обоими пользователями, udp-сервер находится здесь, чтобы вернуть пользовательский порт себе, чтобы он мог отправить его обратно на TCP-сервер.

Однако сообщения между пользователями не принимаются никакими... У кого-нибудь есть идея, почему?


EDIT:

Я тестировал свой маршрутизатор с http://nattest.net.in.tum.de/test.php, и удары отверстий в отверстиях udp отлично работают, поэтому проблема не возникает из моего маршрутизатора, но из мой протокол...

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


ИЗМЕНИТЬ 2:

Собственно, я сделал это наполовину (И проблема исходила из моего кода, а не протокола... Я подключил 2 пользователя, один в 3G с iPhone, один за моим NAT на Wi-Fi.

Самое смешное (не так много), что только один сокет мог получать и отправлять данные между обоими пользователями. (сокет, инициированный iphone). Согласно протоколу, у меня должно быть 2 хорошо соединенных сокета, я не прав?

Поэтому мне удалось пробить дыру в моем NAT, но на самом деле не в сотовом NAT.

Конечно, я протестировал сразу 2 iphones, подключенных в 3G. И никто не получает сообщение от другого.

Я пропустил что-то про сотовый NAT?

P.S.: Извините за обновление моего вопроса, но поскольку я не получаю ответа, я пытаюсь найти сам...

P.S. 2: Поскольку мне удалось пробить дыру в моем NAT, я изменил заголовок, добавив "на 3G"


РЕДАКТИРОВАТЬ 3: я снова проверил http://nattest.net.in.tum.de/test.php с моим компьютером, подключенным к Интернету через мой iphone 3G соединение.

Здесь результат: UDP HOLE PUNCHING RESULT

По всей видимости, все испытания на ударопрочность отверстий udp были успешными на 9-м испытании.

Далее кажется:

Тест связывания UDP (?): независимая привязка к конечной точке, предсказание порта легко

Таким образом, не должно быть никаких проблем с подключением 2 пэров через 3G-соединение (ну не так много, как за "домашним" NAT). Правильно?


РЕДАКТИРОВАТЬ 4:

Чтобы быть уверенным, теперь я отправляю сообщение на два разных UDP-сервера, чтобы проверить, являются ли порт и локальный порт одинаковыми для 3G.

Короче говоря, порты (локальные и общедоступные) одинаковы при подключении на обоих серверах. поэтому тест, выполненный на EDIT 2, был правильным, udp является независимым от конечной точки, поэтому не должно быть никаких проблем с удалением отверстий, я думаю... (По крайней мере, с моим провайдером)

4b9b3361

Ответ 1

К сожалению, нет 100% надежного способа выполнения перфорации отверстий с UDP. В лучшем случае вы можете сделать некоторые догадки о том, как NAT и брандмауэры, вероятно, будут вести себя большую часть времени. Но всегда будут исключения, и они могут быть не редкостью.

В этом случае кажется, что вы используете центральный сервер, чтобы два одноранговых узла могли определить внешний порт друг друга, а затем начать отправлять данные друг другу. Это довольно хороший алгоритм. Проблема в том, что маршрутизация внешнего порта может варьироваться в зависимости от назначения. Другими словами, если от A до B есть внешний порт 5000, то нет гарантии, что от A до C также поступит от 5000. Таким образом, имея запись центрального сервера, порт, который он видит, может не помочь никому подключить.

Вот несколько связанных вопросов с более подробной информацией.

Ответ 2

Вы находитесь за вами, симметричный или меняющий номер исходящего порта в зависимости от вашего адресата. Отверстие отверстий через симметричный NAT требует другого метода (либо TURN, либо UDP с несколькими отверстиями). Попробуйте сделать это следующим образом: https://drive.google.com/file/d/0B1IimJ20gG0SY2NvaE4wRVVMbG8/view?usp=sharing