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

 Каким образом узлы в p2p сетях обходят NAT?Возможно ли это при полностью децентрализованном типе p2p сети? 

 Да, конечно, возможно.  

  

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

  

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

  

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

  

Самая большая проблема для децентрализованных сетей - это bootstrap при первом запуске, необходимость найти хотя бы одного участника сети, чтобы узнать адреса других. Для этого обычно бывает какой-то сервер с источником начального списка нод, который пользователь прописывает руками или который опрашивается при первом запуске автоматически. 

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

Это называется техника NAT hole punching.  

A отправляет UDP пакеты Б, а Б отправляет A одновременно.  

В таком случае у обоих узлов в таблице NAT создаётся запись, что, к примеру A ждёт ответа от Б и наоборот, таким образом NAT пропускает их запросы друг к другу.  

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

Успех NAT Hole Punching зависит от типа NAT за которыми сидят узлы.