Обзор
Вам нужно то, что обычно называют "NAT Traversal" или ICE . Сегодня в Интернете используются два основных протокола: TCP и UDP. TCP-сокеты несут в себе значительное количество информации о состоянии сеанса; следовательно, для P2P это значительно более сложный протокол, чем UDP.
UDP-туннелирование
В следующем списке приведена упрощенная схема более общего протокола STUN (RFC 5389) , который можно использовать для реализации службы P2P на основе UDP NAT Traversal ...
- Разверните UDP-сервер с публичным адресом и начните прослушивать UDP-пакеты от ваших клиентов. Клиенты будут вставлять свой частный IP-адрес в UDP-пакеты, отправленные на ваш сервер; было бы неплохо реализовать некоторую форму аутентификации, чтобы убедиться, что вы получаете соединения от действительного клиента (вместо какого-либо случайного сканера пакетов).
- Сервер считывает, как их частный IP-адрес был преобразован в общедоступный IP-адрес из дейтаграмм UDP.
- Если вы хотите установить соединения между конкретными пользователями, также вставьте эту информацию в пакеты, отправленные клиентами на ваш сервер; на вашем сервере будет реализована директория имени пользователя, чтобы связать информацию о сокете UDP клиента с именами пользователей (к которым будут пытаться подключиться одноранговые узлы).
- Ваш UDP-сервер должен отправить соответствующую информацию другим соответствующим партнерам.
- Теперь одноранговые узлы могут общаться напрямую, отправляя UDP-датаграммы на эти переведенные адреса; эти пакеты будут проходить через клиентские устройства NAT в пути, пока разрешены рассматриваемые порты UDP, и задержка, введенная этим протоколом, не вызывает таймауты состояния в устройствах NAT.
После того, как вы установили соединение UDP, вы могли бы сформировать UDP SSL VPN между двумя клиентами, используя что-то вроде OpenVPN; это даст вам тривиальный канал для инициации TCP-соединения между клиентами. Однако в этой модели подключения есть нетривиальные проблемы безопасности и доверия; вряд ли это будет полезно для случайных пользователей в Интернете.
TCP
Если требуется подключение по протоколу TCP, я предлагаю ознакомиться с этим черновиком Интернета, MMUSIC-ICE-TCP: Кандидаты TCP с установлением интерактивного подключения (ICE)