2015-05-21 4 views
23

Я начал изучать возможность подключения к другому с помощью соединения p2p, поэтому я закодировал простую программу сокетов в JAVA для устройств Android, в которой пользователь, в котором пользователи могут делиться простыми сообщениями p2p (у меня не было никакой идеи о NAT тогда). Я узнал об NAT, поэтому теперь мне нужно установить TCP-соединение с другим пользователем, который использует сервер для обнаружения, но передается полезная нагрузка p2p. Я также посмотрел на XMPP (очень хорошее и подробное объяснение того, как работает протокол: here) и UPnP, но я не знаю, как их реализовать.Подключение P2P через NAT?

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

Я много исследовал, но застрял.

Мои вопросы:

  1. Подробное объяснение BitTorrent (как here, а не как потоки работают), и как она способна работать вокруг NAT?
  2. Есть ли способ сделать вход NAT программным путем?
  3. Является ли программирование сокетов достаточным для p2p?
  4. Насколько сложно создать собственный протокол и как его построить?
  5. Если два устройства D1 и D2 хотят передать p2p, и они знают IP-адрес друг друга. D1 отправляет запрос D2 и не может пройти через NAT D2, но должна быть запись, созданная в NAT D1. Поэтому, когда D2 пытается отправить что-то NAT, D1 должен обнаружить запись с IP-адресом D2. Тогда почему пакет не разрешен?
+0

Bittorrent использует [UDP отверстие штамповки.] (Http://en.wikipedia.org/wiki/UDP_hole_punching) Я не думаю, что есть подробные объяснения того, насколько доступно в сети. – Encombe

+0

@ Encombe Я прочитал про отверстие. 1. Не всегда успешно 2. Сообщения не могут передаваться с использованием UDP, что очень ненадежно. – user3439988

+0

@Encombe Также вы могли бы рассказать мне, как эти протоколы относятся к динамическому IP-адресу, а IP-адрес телефона остается неизменным для одного сеанса или того, что является периодом ожидания? – user3439988

ответ

12

Еще один интересный вопрос, который возникает из BitTorrent, потому что они могут работать на любом устройстве и даже за NAT. Я не могу понять, как работает BitTorrent.

Данное заявление выглядит так, как будто вы предполагаете, что bittorrent нуждается в полной возможности подключения.

Это неверно.

За устройством NAT вы по-прежнему сможете установить исходящие TCP-соединения. Обычно этого достаточно для bittorrent, если в сети есть другие клиенты, не являющиеся NAT (или NATed, но правильно port-forwarded), которые могут принимать входящих соединений.

NAT не влияет на направление потока данных, поскольку соединения являются двунаправленными после их установки. Это только проблематично для начальной настройки соединения.

Это прекрасно работает для bittorrent, потому что bittorent не заботится о том, на каком конкретном узле вы получаете свои данные. Хотя улучшенная связь обычно улучшает производительность.

Если идентификация узла важна или передача один на один является важным прецедентом, тогда другие протоколы p2p обычно сначала пытаются выполнить NAT traversal, и если это не удается, то сторонние узлы ретранслируют трафик между теми узлами, которые не могут подключиться к друг друга напрямую.

Кроме того, поддержка IPv6 станет важным в будущем для поддержания конца в конец соединения, потому что все больше и больше интернет-провайдеры начинают выкатывать carrier-grade NAT для IPv4, а IPv6 будет оставаться не-через NAT

+0

Моя цель для этого утверждения состояла в том, чтобы выяснить, как происходит «начальная настройка соединения». Я знаю, что bittorrents используют DHT для поиска соединения. Предположим, вы знаете IP-адрес получателя, даже тогда вы не можете пройти через NAT. Таким образом, вам понадобится что-то, чтобы создать запись в таблицу переадресации NAT, чтобы данные могли поступать. Вы абсолютно правы в том, что данные выходят, и вы правы, что после того, как начальная установка соединения произошла, данные могут протекать без каких-либо проблем. Не могли бы вы предложить мне что-то для начальной фазы и времени изменения IP-адресов? – user3439988

+0

«Вам потребуется что-то, чтобы создать запись в таблицу переадресации NAT, чтобы данные могли входить». для исходящих подключений локальное устройство NAT создаст их автоматически. Вот почему я сказал, что исходящие соединения будут работать, если удаленный доступ достигнут. Если это не то, что вы имеете в виду, пожалуйста, внесите изменения в свой вопрос с более конкретным сценарием, в котором описывается весь путь между двумя узлами и действия, которые вы хотите выполнить. – the8472

+0

Проблема заключается в том, что в отличие от вызова мы не можем отправлять сообщение непосредственно с одного устройства на другое, даже если мы знали IP-адреса (из-за NAT). Практические: Мы знаем друг друга IP и оба находятся за NAT. Я отправляю вам сообщение, которое удаляется вашим NAT, и поэтому вы не можете. С другой стороны, если мы сделали начальное соединение, и записи существуют, мы можем обмениваться сообщениями без какой-либо внешней помощи. Пожалуйста, также прочитайте мой вопрос 5. Также, если вы хотите, я могу опубликовать код (но его простой сервер сокетов и клиент-сервер в android). – user3439988

3
  1. Последние версии BitTorrent используют µTP, который накладывается над UDP, а не TCP. μTorrent использует личное расширение (ut_holepunch), которое выполняет перфорирование отверстий UDP, большинство других реализаций не беспокоят (за исключением Tixati).

  2. Некоторые маршрутизаторы NAT принимают запросы на пересылку портов, используя либо протокол uPNP, либо протокол PMP. Поддерживается ли это, зависит от конкретной марки маршрутизатора и его конфигурации.

  3. Да, для P2P достаточно программирования сокетов.

  4. Сложно ответить. Я предлагаю вам прочитать wikified and annotated BitTorrent specification для начала.

  5. Да, это принцип, лежащий в основе UDP hole punching.

+0

Все, что я собираю из вашего ответа, заключается в том, что использование обхода NAT - единственное решение, разделенное формой с использованием uPNP и PMP. Все три из них не являются надежным решением на 100%. и UTP работает на UDP, снова ненадежным. BitTorrent создал приложение под названием [Bleep] (http://engineering.bittorrent.com/2014/09/17/how-does-bleep-work/) (чат P2P). Они использовали SIP для инициации. Еще одно решение, которое кто-то предложил, - использовать UDP с обработкой ошибок, чтобы работать как TCP. Есть ли у вас какие-либо идеи о том, как реализовать их? – user3439988

+0

Также вы знаете, где я могу найти образец кода или текст, связанный с отправкой сервером данных клиенту после запуска в android, в котором клиенту НЕ нужно постоянно делать запрос на сервер каждые несколько секунд. – user3439988

+0

IIRC 'ut_holepunch' также поддерживается libtorrent/rasterbar и Tixati – Encombe

5

Необходимо подчеркнуть то, что 100% P2P между всеми типами NAT невозможно сейчас. Практически невозможно установить соединение P2P между ** Symmetric и Symmetric/PRC NAT. В этом случае соединение устанавливается через сервер ретрансляции под названием TURN.

Я отвечаю на ваш второй вопрос, потому что я не знаю много о первом.

2) Да. Вы можете отправить пакет через свой NAT, и будет отображаться соответствие между вашим внутренним IP-портом для внешнего IP-порта вашего NAT: Порт. Вы можете узнать этот внешний IP-порт, отправив запрос на оглушение. Обратите внимание, что этот метод не работает для Symmetric NAT.

3) Да, программирование сокета достаточное для p2p.

4) Зачем нужен протокол, если уже существует несколько. Протокол ICE сегодня лучше всего подходит для обхода NAT, и я не думаю, что его было легко создать. UPnP и NAT-PMP действительно уязвимы с точки зрения безопасности.

5) Я думаю, что происходит, как правило, NAT блокирует неизвестные пакеты, поступающие к нему. Поэтому, когда D1 отправляет пакет в D2, его NAT блокирует все пакеты, входящие из D1s IP: Port. Вот почему соединение не работает. Вы должны использовать технологию перфорации отверстий для D1 и D2, чтобы успешно установить соединение P2P.

** Симметричный NAT Я имею в виду симметричный NAT со случайным распределением портов.

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