Как скайп и все эти другие p2p-программы работают без блокировки?

Я пытался сделать приложение типа p2p. Моя идея заключалась в том, чтобы просто создать программу типа веб-сервера, которая прослушивает определенный сокет. Однако, если я попробую это из любой точки за пределами моей локальной сети, запросы никогда не дойдут до прослушивающего сокета. Как другие программы p2p обходят это? Я использую те же порты, что и скайп и другие программы (8080)


person user491880    schedule 27.04.2011    source источник


Ответы (4)


Есть такое понятие как UPnP, которое используют некоторые приложения. Я думаю, что Skype применяет множество трюков, чтобы упростить его использование с брандмауэрами. Он даже будет использовать порт 80, так как большую часть времени он открыт. Большинство p2p-приложений, которые я видел, требуют правильной настройки брандмауэра/NAT.

person d-_-b    schedule 27.04.2011

Существует множество способов обойти NAT и брандмауэры.

Если обе стороны подключены к внешнему центральному серверу, то они могут обмениваться IP/портами друг с другом через этот сервер в качестве прокси. Если затем сторона A попытается подключиться к стороне B и будет заблокирована, они могут поменяться ролями, а сторона B может попытаться подключиться к стороне A. Это само по себе пройдет через многие ситуации, если только обе стороны не находятся за NAT/брандмауэрами.

Существуют методы на основе UDP и TCP для пробивания дыр через NAT, чтобы разрешить трафик, который обычно блокируется.

Некоторые маршрутизаторы поддерживают uPNP для динамической настройки правил переадресации портов.

person Remy Lebeau    schedule 28.04.2011

Skype возвращается к использованию порта 80 или 4** (не помню), если не может подключиться к порту 8080.

У меня была проблема с этим, когда я пытался запустить локальный экземпляр Apache, когда Skype уже работал.

Skype предоставляет настройку для изменения используемого порта, но тогда вы должны перенаправить этот порт на свой маршрутизатор/брандмауэр/что-то еще.

Может быть, вы могли бы использовать аналогичный подход для своего приложения?

person fr1zle    schedule 28.04.2011
comment
Это странно, потому что, даже запустив веб-сервер на порту 80, я не могу получить доступ к своему веб-серверу с прокси-сервера. - person user491880; 29.04.2011

Эта ссылка более подробно объясняет методы «пробивания отверстий»:

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», блокируя первую конечную точку, которая работает. Порядок и время этих сообщений не имеют решающего значения, если они асинхронны.

person Tom    schedule 05.07.2011