@uf0361

Каким образом узлы в p2p сетях обходят NAT?

Каким образом узлы в p2p сетях обходят NAT?Возможно ли это при полностью децентрализованном типе p2p сети?
  • Вопрос задан
  • 635 просмотров
Решения вопроса 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
Да, конечно, возможно.

Часть сети имеет внешние IP и позволяет прямой коннект к ним. При простейшей реализации p2p коннект возможен только между участниками при условии наличия у одного из них внешнего IP. Если узел А хочет установить коннект с узлом Б без внешнего IP (с закрытым портом и прочее, то что в ed2k называлось LowId, в DC - passive mode - и всё такое подобное), то надо, чтобы Б получил информацию об А и установил с ним коннект сам.

Например, в ed2k клиент с полноценным внешним IP и возможностью коннекта к нему получает HighId, одинаковый на всех серверах, а неполноценный клиент получает непостоянный уникальный в пределах сервера LowId. Чтобы установить коннект между собой, клиенты А и Б должны находиться на одном сервере, а дальше А просит сервер передать Б просьбу установить коннект. Совсем бессерверно (используя DHT) ed2k может работать только с HighId-клиентами.

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

Самая большая проблема для децентрализованных сетей - это bootstrap при первом запуске, необходимость найти хотя бы одного участника сети, чтобы узнать адреса других. Для этого обычно бывает какой-то сервер с источником начального списка нод, который пользователь прописывает руками или который опрашивается при первом запуске автоматически.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
kovalensky
@kovalensky
Будущий инженер / UPD 2020: Будущий бомж
Если узлы знают IP адреса и порты друг друга, то если они оба за NAT, им не доставит труда подключиться друг к другу.
Это называется техника NAT hole punching.
A отправляет UDP пакеты Б, а Б отправляет A одновременно.
В таком случае у обоих узлов в таблице NAT создаётся запись, что, к примеру A ждёт ответа от Б и наоборот, таким образом NAT пропускает их запросы друг к другу.
Правда, ещё бы узнать IP адреса и порты друг друга, для этого используется промежуточный сервер с белым IP, к примеру как торрент трекер.
Успех NAT Hole Punching зависит от типа NAT за которыми сидят узлы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы