Я пытался сделать приложение типа p2p. Моя идея заключалась в том, чтобы просто создать программу типа веб-сервера, которая прослушивает определенный сокет. Однако, если я попробую это из любой точки за пределами моей локальной сети, запросы никогда не дойдут до прослушивающего сокета. Как другие программы p2p обходят это? Я использую те же порты, что и скайп и другие программы (8080)
Как скайп и все эти другие p2p-программы работают без блокировки?
Ответы (4)
Есть такое понятие как UPnP, которое используют некоторые приложения. Я думаю, что Skype применяет множество трюков, чтобы упростить его использование с брандмауэрами. Он даже будет использовать порт 80, так как большую часть времени он открыт. Большинство p2p-приложений, которые я видел, требуют правильной настройки брандмауэра/NAT.
Существует множество способов обойти NAT и брандмауэры.
Если обе стороны подключены к внешнему центральному серверу, то они могут обмениваться IP/портами друг с другом через этот сервер в качестве прокси. Если затем сторона A попытается подключиться к стороне B и будет заблокирована, они могут поменяться ролями, а сторона B может попытаться подключиться к стороне A. Это само по себе пройдет через многие ситуации, если только обе стороны не находятся за NAT/брандмауэрами.
Существуют методы на основе UDP и TCP для пробивания дыр через NAT, чтобы разрешить трафик, который обычно блокируется.
Некоторые маршрутизаторы поддерживают uPNP для динамической настройки правил переадресации портов.
Skype возвращается к использованию порта 80 или 4** (не помню), если не может подключиться к порту 8080.
У меня была проблема с этим, когда я пытался запустить локальный экземпляр Apache, когда Skype уже работал.
Skype предоставляет настройку для изменения используемого порта, но тогда вы должны перенаправить этот порт на свой маршрутизатор/брандмауэр/что-то еще.
Может быть, вы могли бы использовать аналогичный подход для своего приложения?
Эта ссылка более подробно объясняет методы «пробивания отверстий»:
http://www.brynosaurus.com/pub/net/p2pnat/
Выдержка:
3.2. Установление одноранговых сеансов
Предположим, что клиент «А» хочет установить сеанс UDP напрямую с клиентом «Б». Пробивка отверстий происходит следующим образом:
«А» изначально не знает, как связаться с «Б», поэтому «А» просит у «С» помощи в установлении сеанса UDP с «Б».
«S» отвечает «A» сообщением, содержащим общедоступную и частную конечные точки «B». В то же время «S» использует свой сеанс UDP с «B», чтобы отправить «B» сообщение с запросом на подключение, содержащее общедоступную и частную конечные точки «A». Как только эти сообщения получены, «A» и «B» узнают общедоступные и частные конечные точки друг друга.
Когда «A» получает общедоступную и частную конечные точки «B» от «S», «A» начинает отправлять пакеты UDP на обе эти конечные точки, а затем «блокируется» в зависимости от того, какая конечная точка первой получит действительный ответ от «B». Точно так же, когда «B» получает общедоступную и частную конечные точки «A» в запросе на переадресацию соединения, «B» начинает отправлять пакеты UDP «A» на каждой из известных конечных точек «A», блокируя первую конечную точку, которая работает. Порядок и время этих сообщений не имеют решающего значения, если они асинхронны.