2009-10-08 5 views
31

Я разрабатываю приложение p2p, которое работает на порте 30000. Мой маршрутизатор не UPnP, поэтому мне необходимо переслать порт на маршрутизатор. Но Skype другое приложение p2p работает без переадресации портов на моем компьютере. Когда я проанализировал его с помощью wirehark, я нашел его используя порт UDP 48980, 58544. Я использую C++.Как работает Skype без переадресации портов?

Существует библиотека в python here, которая делает это для Nat PnP routers. Возможно ли программно перенаправить порт на маршрутизатор независимо от типа маршрутизатора и операционной системы. Каким должен быть подход, чтобы сделать это на C++ или на любом другом языке.

ответ

20

Skype работает очень интересным способом. Из того, что я прочитал (а это некоторое время назад) работает следующим образом:

  • сервер Skype поддерживает список всех пользователей и IP-адресов.
  • Skype пользователь A хочет разговаривает с пользователем B Пользователь Skype A отправляет сетевой пакет пользователю IP-адрес B-адреса и ждет ответа. (пользователь B никогда не получает этот пакет).
  • Skype пользователь А уведомляет сервер IP/порт комбинации, на котором она ожидает ответа
  • Сервер уведомляет пользователя B , чтобы отправить ответ на
  • пользователя А на указанный порт соединение осуществляется ,

Возможно, это было упрощено, но в последний раз я проверил, как это работает. (Кто-то исправит меня, если я ошибаюсь).

+0

, но вопрос в том, что IP-адреса клиентов PUBLIC? см. например, A нужно связываться с B, а сервер знает IP-адрес B, но какой IP-адрес он использует? если это так, вы можете ping anyones ip? извините, если это глупо. –

+4

В этом ответе просто описывается A и не удается связаться с B и сервером, отправляющим правильную комбинацию IP/Port пользователю B. Отсутствует основная точка, которая называется перфорацией отверстий, и она очень хорошо описана в ссылке предоставленный @MartinBeckett. Я бы просто добавил, что также можно пересылать порт независимо от типа маршрутизатора и операционной системы, если маршрутизатор поддерживает UPnP. – Igor

+1

@rein, а что относительно симметричного NAT? – onmyway133

18

UDP hole punching (один) способов прохождения через NAT.

+0

Я не в состоянии понять разницу между маршрутизатором и NAT? Переводим ли мы порт на маршрутизатор или NAT? Не является ли перфорация отверстий эквивалентной отправке данных с обеих сторон одновременно, что не работает, когда мы работаем на другом порту. Спасибо – Xinus

+1

Маршрутизатор передает информацию из одной сети в другую. NAT - это процесс определения диапазона внутренних адресов во внутренней сети и наличие только одного маршрутизатора в другой сети. Маршрутизатор - это физическое устройство, NAT - это то, что вы делаете. – rein

3

Вы должны использовать промежуточный сервер и инициировать связь со стороны клиента. Как упоминал Йоссариан, с этого момента одна из возможностей - пробивка отверстий UDP. В зависимости от типа приложения (и действительно ли это P2P или нет) вы могли бы поддерживать промежуточный сервер на месте все время.

0

Skype использует другую точку доступа как промежуточную точку, когда прямое соединение невозможно.

i.eer Peer A хочет подключиться к одноранговому узлу B, но сверст B имеет все порты, закрытые, тогда связь инициируется через одноранговую сеть C с открытыми портами.

0

Есть некоторый опыт в реализации P2P-приложений и заставить их работать за NAT маршрутизаторы.

Skype использует перфорирование отверстий UDP для работы за NAT-маршрутизаторами. Я написал статью и сделал демо-ролик, чтобы помочь другим реализовать аналогичные приложения. Здесь также приводятся ссылки на полезные библиотеки, которые выполняют большую часть работы на местах, например, libutp.

>>> UDP hole punching Demo video and useful Libs.

Смежные вопросы