В настоящее время я работаю над проектом, который требует обхода NAT, но, похоже, у меня возникают трудности. У меня для тестирования запущена следующая установка:
Введение в описание сервера и клиента:
Когда A и B запускают своего клиента, клиент отправляет «HelloPacket» на внешний адрес R1 (72.82.59.10) через порт 6666.
После получения HelloPacket сервер сначала проверяет, видел ли он ранее адрес источника и идентификатор порта источника.
После того, как клиент изначально отправляет HelloPacket на сервер Intro, он может ожидать получения от сервера пакетов, называемых IntroPackets, если есть одноранговые узлы, которые уже представились серверу. Эти IntroPackets содержат как внешний, так и внутренний IP / порт однорангового узла.
Теперь, когда одноранговый узел знает о существующих одноранговых узлах, он должен отправить HelloPacket существующим одноранговым узлам, чтобы сообщить им о его существовании. Вот где у меня проблемы.
У меня недостаточно репутации, чтобы публиковать изображения, но вот диаграмма, которую я нарисовал: http://i.stack.imgur.com/7E5I8.png
Вот порядок событий и проблема, с которой я столкнулся:
Партнер A: 72.82.59.10, 1024
Партнер B: 72.82.59.10, 1025
Шаг 6 - вот где мой дизайн терпит неудачу. Одноранговый узел A никогда не получает HelloPacket от узла B. Насколько я понимаю, когда маршрутизатор получает пакет с портом назначения 1024, он сопоставляет его с внутренним адресом и портом, используя его NAT. Это верно?
Я пробовал запустить внешнюю программу, которая просто отправляет дейтаграммы на внешний адрес и порт, сопоставленные с клиентом A, но они, похоже, не проходят, поэтому я не думаю, что это проблема тайм-аута.
Я также знаю, что мне следует попытаться подключиться к внутреннему адресу и порту, чтобы увидеть, находятся ли клиенты за одним и тем же NAT, и планирую реализовать это в будущем.
Кроме того, вся связь осуществляется надежно с использованием Go-Back-N как в клиентском, так и в серверном коде.
Вопросы:
Любой вклад очень ценится !! Спасибо!