Как я могу найти правильный IP-адрес другого компьютера в моей локальной сети, который не является общедоступным? - PullRequest
3 голосов
/ 02 июля 2011

Я пишу распределенное Java-приложение, но сетевая сторона вещей ставит меня в тупик.По какой-то причине это не работает правильно.Я думаю, это потому, что IP-адрес, который я получаю через ipconfig / all, не доступен извне локальной сети.Я ценю любые советы или рекомендации.

Ответы [ 2 ]

3 голосов
/ 02 июля 2011

Обзор

Вам нужно то, что обычно называют "NAT Traversal" или ICE . Сегодня в Интернете используются два основных протокола: TCP и UDP. TCP-сокеты несут в себе значительное количество информации о состоянии сеанса; следовательно, для P2P это значительно более сложный протокол, чем UDP.

UDP-туннелирование

В следующем списке приведена упрощенная схема более общего протокола STUN (RFC 5389) , который можно использовать для реализации службы P2P на основе UDP NAT Traversal ...

  1. Разверните UDP-сервер с публичным адресом и начните прослушивать UDP-пакеты от ваших клиентов. Клиенты будут вставлять свой частный IP-адрес в UDP-пакеты, отправленные на ваш сервер; было бы неплохо реализовать некоторую форму аутентификации, чтобы убедиться, что вы получаете соединения от действительного клиента (вместо какого-либо случайного сканера пакетов).
  2. Сервер считывает, как их частный IP-адрес был преобразован в общедоступный IP-адрес из дейтаграмм UDP.
  3. Если вы хотите установить соединения между конкретными пользователями, также вставьте эту информацию в пакеты, отправленные клиентами на ваш сервер; на вашем сервере будет реализована директория имени пользователя, чтобы связать информацию о сокете UDP клиента с именами пользователей (к которым будут пытаться подключиться одноранговые узлы).
  4. Ваш UDP-сервер должен отправить соответствующую информацию другим соответствующим партнерам.
  5. Теперь одноранговые узлы могут общаться напрямую, отправляя UDP-датаграммы на эти переведенные адреса; эти пакеты будут проходить через клиентские устройства NAT в пути, пока разрешены рассматриваемые порты UDP, и задержка, введенная этим протоколом, не вызывает таймауты состояния в устройствах NAT.

После того, как вы установили соединение UDP, вы могли бы сформировать UDP SSL VPN между двумя клиентами, используя что-то вроде OpenVPN; это даст вам тривиальный канал для инициации TCP-соединения между клиентами. Однако в этой модели подключения есть нетривиальные проблемы безопасности и доверия; вряд ли это будет полезно для случайных пользователей в Интернете.

TCP

Если требуется подключение по протоколу TCP, я предлагаю ознакомиться с этим черновиком Интернета, MMUSIC-ICE-TCP: Кандидаты TCP с установлением интерактивного подключения (ICE)

2 голосов
/ 02 июля 2011

некоторые IP-адреса не маршрутизируются: http://en.wikipedia.org/wiki/IP_address - если у вас есть один из них, вы не сможете получить к нему доступ непосредственно из локальной сети.вы можете получить доступ к другим адресам вашей локальной сети с одного из них на этой локальной сети.

если вы находитесь за пределами локальной сети, вы не можете установить TCP-соединение с определенной машиной на локальной сети, но эта машина может запуститьсяодин с тобой: http://en.wikipedia.org/wiki/Network_address_translator

...