Как работает peer-to-peer через Интернет?

17781
Pacerier

Из того, что я понимаю, нет способа отправить пакет на компьютер в локальной сети извне сети, если мы не знаем механизм маршрутизации, используемый маршрутизатором.

Предполагая, что у нас есть установка, которая выглядит следующим образом:

  1. Компьютер-A, IP 192.168.1.2 (шлюз по умолчанию 192.168.1.1)

  2. Компьютер-B, IP 192.168.1.3 (шлюз по умолчанию 192.168.1.1)

  3. Маршрутизатор-C, IP 192.168.1.1 (внешний IP 1.1.1.1)

  4. Router-D (внешний IP 2.2.2.2)

Компьютер-A, компьютер-B и маршрутизатор-C принадлежат к одной локальной сети. Маршрутизатор-D хочет отправить данные на компьютер-A, но он не может сделать это без прохождения через маршрутизатор-C.

Теперь маршрутизатор-C будет пересылать пакеты на компьютер-A, если порт назначения равен 1000, и будет пересылать пакеты на компьютер-B, если порт назначения - 2000. Но, безусловно, единственным устройством, которое знает этот механизм маршрутизации, является сам маршрутизатор-C! Даже Компьютер-А и Компьютер-Б не узнают об этом, верно?

Таким образом, Маршрутизатор-D может отправлять пакет на Компьютер-А, если он отправляет пакет на Маршрутизатор-С через порт 1000, но как маршрутизатору-Д узнать, как отправлять пакеты через порт 1000, а не сказать порт 1001?

Как одноранговым программам, таким как Bittorrent, пройти эту проблему? Единственное решение, которое я могу придумать, - это для маршрутизатора-D отправить пакет на маршрутизатор-C через все порты, чтобы он был перенаправлен на компьютер-A, но есть ли лучшее решение?

13

3 ответа на вопрос

6
Synetech

Ваша путаница проистекает из некоторых неверных предположений.

Но, конечно же, единственным устройством, которое знает этот механизм маршрутизации, является сам Router-C! Даже Компьютер-А и Компьютер-Б не узнают об этом, верно?

Что, почему… Тогда почему маршрутизатор был настроен на переадресацию этих портов на эти IP-адреса? Вы должны настроить P2P-клиент для использования определенного порта, а затем настроить маршрутизатор для соответствия.

но как Router-D знать, что нужно отправлять пакеты через порт 1000, а не как порт 1001?

Потому что вы настраиваете P2P-клиент для использования определенного порта (стандартного или нестандартного для этого протокола).

Единственное решение, которое я могу придумать, - это для маршрутизатора-D отправить пакет на маршрутизатор-C через все порты, чтобы он был перенаправлен на компьютер-A, но есть ли лучшее решение?

Это намного проще, чем это. Когда клиент устанавливает соединение с одноранговым узлом, он указывает, какой порт он хочет использовать, поэтому одноранговый узел отправляет данные на этот порт.

Хм, но Bittorrent не меняет поведение маршрутизатора, верно? Поскольку какой-то механизм маршрутизации мог бы быть динамичным, как продемонстрировано в superuser.com/a/187190/78897, как Computer-A может узнать об этом?

Клиент напрямую не влияет на маршрутизатор, но маршрутизатор может быть настроен / достаточно интеллектуален, чтобы адаптироваться к поведению клиента. Вы можете включить UPnP как на маршрутизаторе, так и на клиенте для автоматической настройки соединения, и большинство маршрутизаторов имеют возможность проверки состояния в рамках своего механизма переадресации портов .

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

Проблема возникает, когда у вас есть несколько систем, использующих одну и ту же программу. Если несколько систем подключены к одному и тому же маршрутизатору, имеют один и тот же IP-адрес и используют динамические порты, это быстро становится неуправляемым, и даже при проверке с сохранением состояния трудно, если не невозможно, заставить его работать правильно. В этом случае необходимо использовать статические порты (по умолчанию или иначе).


Если вы используете такую ​​программу, как SmartSniff или TCPView для мониторинга ваших соединений, вы заметите, что P2P-соединения обычно имеют настроенный вами порт (или порт по умолчанию для клиента) в качестве места назначения для входящих соединений и либо по умолчанию, либо пользовательский / случайный порт для источника и наоборот для исходящих соединений.

Хм, но Bittorrent не меняет поведение маршрутизатора, верно? Поскольку какой-то механизм маршрутизации мог бы быть динамичным, как показано в http://superuser.com/a/187190/78897, как Computer-A может узнать об этом? Pacerier 11 лет назад 0
Перенаправление порта. Вы настроили это заранее. UtahJarhead 11 лет назад 0
@Pacerier Если и маршрутизатор, и приложение p2p используют [UPnP] (http://en.wikipedia.org/wiki/Upnp#NAT_traversal), переадресация портов может выполняться динамически. В этом случае yes Bittorrent __does__ меняет поведение маршрутизатора. zero2cx 11 лет назад 0
@ zero2cx, есть ли способ сделать одноранговый без изменения поведения маршрутизатора? Pacerier 11 лет назад 0
@Pacerier, если вы хотите иметь NAT (несколько систем, совместно использующих соединение), то вы * должны * каким-то образом настроить маршрутизатор так, чтобы он знал, где устанавливать соединения (ну, технически, вы * могли бы * просто сделать так, чтобы все извергали каждое соединение на все порты, такие как Вы предложили, но это было бы в лучшем случае ужасно). Вы можете сделать это статически (настроить IP-адреса и порты) или динамически (UPnP). Synetech 11 лет назад 0
@Pacerier Да, но тогда входящие запросы на соединение останавливаются на маршрутизаторе. Исходящие запросы соединения Bittorent не будут затронуты, и многие пользователи bittorrent настроены именно таким образом. zero2cx 11 лет назад 0
3
John

Ваш вопрос затрагивает сердце Интернета и само определение маршрутизации. В вашем примере маршрутизатор D отправляет данные на компьютер A на основе двух предпосылок:

  • Было сказано отправить данные на компьютер А.
  • Это уже обработанные данные с компьютера А.

Похоже, ваш сценарий предполагает первый вариант - маршрутизатор D хочет отправить на компьютер A. Но как он туда попадает? Это достигается за счет использования таблиц маршрутизации, которые совместно используются маршрутизаторами друг для друга.

Маршрутизатор C регулярно отправляет обновления всем маршрутизаторам, которые знают, включая маршрутизатор D, о том, что он «знает» сеть «192.168. *» (На самом деле - этого не произойдет, потому что эта сеть не маршрутизируется - она ​​считается частной). игнорируйте это.) Итак, маршрутизатор D уже знает, что маршрутизатор C знает эту сеть.

Поэтому, когда данные предназначены для компьютера А, они в первую очередь адресуются сетью. Итак, Маршрутизатор D спрашивает: «Мне нужно найти сеть 192.168. *. Знаю ли я это? Нет. Знаю ли я кого-нибудь еще, кто знает? Да. Маршрутизатор C знает. Как добраться до маршрутизатора C? Через мой 2.2. 2.2 интерфейс. "

Затем маршрутизатор D отправляет данные на маршрутизатор C. Маршрутизатор C получает их и говорит: «О, у меня есть данные от маршрутизатора D, но они предназначены для сети 192.168. Я знаю эту сеть? Да, через мою сеть 192.168.1.1» направляет это.

Еще предстоит проделать определенную работу по разрешению IP и MAC-адресации, но я рассматриваю маршрутизацию как таковую, а не ARP и локальные сети.

Вы заметите, что ваше первое предположение - удаленный маршрутизатор должен знать механизм маршрутизации - здесь не используется. Маршрутизатор D не заботится, использует ли маршрутизатор C EIGRP, RIP, RIPv2, OSPF или что-то еще. Все, что его волнует, это то, что он получил обновление. (Конечно, то, как он получил обновление, важно, чтобы они оставались синхронизированными. Но, опять же, это другая проблема.)

Ваше второе предположение - номер порта является фактором маршрутизации - также неверно. Маршрутизаторы (как правило) не нуждаются в информации о порте для принятия решений о маршрутизации. (Это немного изменилось из-за некоторых новых сетевых технологий и применяется в основном к брандмауэрам и прокси, но все же более широкое предположение все еще применяется к «истинным» маршрутизаторам.)

Продолжая ваш пример, маршрутизатор C будет пересылать данные на порт 1000 (в соответствии с вашим сценарием), поскольку на компьютере A существует служба, ожидающая данные на этом конкретном порту. Но он знает об этом только потому, что маршрутизатор D отправил его на порт 1000. А маршрутизатор D отправляет его только на этот порт, потому что отправитель данных отправил его на маршрутизатор D на этот порт.

Я не понимаю, что вы включили программы bittorrent или P2P как отражение вопроса, который вы задаете. Те же объяснения применимы. Маршрутизаторы также могут быть настроены на запуск портов, который связывает конкретное устройство (или IP) с конкретным портом. Таким образом, когда трафик поступает в порт 1234, маршрутизаторы знают, как отправлять данные на устройство ABCD. Обычно это связано с исходящим портом TCP. т.е. если я отправлю трафик через порт 7890, маршрутизатор узнает, что входящий трафик будет через порт 1234 и отправит его мне.

Но запуск порта не связан с (удаленными) решениями о маршрутизации - он относится к внутренней таблице MAC / IP, которую маршрутизатор использует для локальной сети.

Обновление / редактирование : для дальнейшего ответа и уточнения после вашего комментария. Маршрутизатор D знает компьютер A только по его IP-адресу (192.168.2.2). Но Маршрутизатор C знает Компьютер A по его IP-адресу и по MAC-адресу. MAC (Media Access Control) - это уникальный (обычно ...) 48-битный идентификатор, который определяется международным стандартом. Предполагается, что каждое устройство, подключенное к локальной сети (проводное и беспроводное), имеет уникальный MAC-адрес.

Маршрутизатор (Маршрутизатор C) связывает IP-адрес и MAC-адрес вместе в таблице (таблица MAC-адресов). Поэтому, когда трафик поступает в маршрутизатор C, и маршрутизатор понимает его «локально» для него, он выполняет поиск в таблице MAC-адресов. Затем маршрутизатор буквально изменяет информацию адресации кадра.

Он реконструирует (переписывает) информацию о назначении уровня 2, чтобы получить MAC-адрес назначения компьютера A, но сохраняет информацию об IP-адресе (уровень 3) одинаковой.

Если маршрут НЕ знает MAC-адрес. Или не имеет отношения IP-MAC в своей таблице, он делает что-то под названием ARP (протокол разрешения адресов), чтобы спросить: «ЭЙ, все в этой сети. У вас есть этот MAC-адрес?» Или иногда - «Все, каков ваш MAC-адрес?»). Соответствующее устройство / устройства отвечает, и маршрутизатор создает свою таблицу IP-MAC.

Таким образом, Router-D отправляет пакет на Router-C через порт 60000 (предварительно настроенный), Router-C принимает пакет, но как он узнает, что этот пакет должен быть перенаправлен на компьютер-A? Pacerier 11 лет назад 0
Маршрутизатор D уже знает конечный пункт назначения - компьютер A. Он (маршрутизатор D) знает компьютер A только по его IP-адресу: 192.168.2.2. Но маршрутизатор C знает, что знает компьютер A двумя способами: IP-адрес (192.168.2.2) и то, что называется его MAC-адресом. Я обновлю ответ с дополнительной информацией. John 11 лет назад 1
2
UtahJarhead

Порт запуска. Как веб-сервер отправляет вам веб-страницу после того, как вы ее запросили? Потому что вы просили это. Когда вы запрашиваете его, маршрутизатор знает, что ожидать ответа, а когда он его получает, он перенаправляет его на соответствующий ПК. Некоторые программы написаны так, чтобы инициировать открытие в ожидании сигнала от определенного ПК, даже если на самом деле он не в пути.

В некоторых моделях центральный сервер используется для базовой связи. Например:

  • Клиент1 входит в систему с сервером для двусторонней связи.
  • Client2 входит в систему для того же.

Сервер теперь знает все файлы, которые есть у Client1 и Client2.

  • Client2 говорит «Я хочу файл X из Client1» на сервер.
  • Сервер сообщает Client1 «Клиент2 хочет X файл».
  • Клиент 1 отправляет ненужную информацию на общедоступный IP-адрес Client2, отключая функцию Port Triggering, чтобы открыть порт для ответа от Client2.
  • Client2 отправляет свой начальный сигнал на общедоступный IP-адрес Client1.

Клиент1 просто обманул маршрутизатор, чтобы открыть этот порт для Клиента2.

В некоторых случаях, таких как BitTorrent или оригинальный Napster (iirc), вы должны перенаправить порт на маршрутизаторе для его оптимальной работы.

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

Насколько они знают, какие порты использовать ... вы настраиваете клиента на прослушивание определенного порта. Ваш клиент сообщает рою (как в случае с BitTorrent), какой порт вы используете, чтобы другие клиенты знали, к чему подключаться. Ваш компьютер сказал им. UtahJarhead 11 лет назад 0
Я думаю, что вы ответили, когда было написано мое первое дополнение. Правильный? UtahJarhead 11 лет назад 0
но как ПК узнать механизм маршрутизации, когда это делает маршрутизатор? Какой-то механизм мог бы быть динамичным, как продемонстрировано в http://superuser.com/a/187190/78897 Pacerier 11 лет назад 0
Нет, ему не нужно знать маршрутизацию. Для правильной работы большинства клиентов P2P необходимо правильно настроить переадресацию портов на маршрутизаторе. Без этого вы можете общаться только с другими клиентами, с которыми вы впервые общаетесь. Они не могут начать разговор. Я кратко коснулся этого в своем ответе (второй к последнему абзацу) UtahJarhead 11 лет назад 0
Но переадресация портов возможна только в том случае, если администратор предварительно настроил ее. Вы хотите сказать, что Bittorrent * перенастраивает * наши маршрутизаторы? Pacerier 11 лет назад 0
@Pacerier Просто маршрутизатор с поддержкой UPnP. Я думаю, что маршрутизаторы, как правило, не поставляются с поддержкой UPnP. Переконфигурирование (настройки порта переадресации порта) происходит только тогда, когда маршрутизатор уже дал внутреннему клиенту разрешение на это. UPnP! zero2cx 11 лет назад 0