как получить внешний порт NAT при создании соединения с внешним хостом и как реализовать STUN в Java - PullRequest
1 голос
/ 13 ноября 2011

Я изучаю протоколы NAT и STUN, но я не понял их, поэтому я попытался реализовать STUN в Java.

Допустим, у меня есть 2 компьютера, которые подключены к Интернету двумя соответствующимиустройства NAT с полным конусом, и я пытаюсь реализовать протокол STUN в Java, и я просто реализую часть, когда 2 узла знают внешний IP и порт друг друга, и одно из них (назовем этого участника "клиент")пытается отправить сообщение другому (и этот узел является "сервером").И я сделал что-то вроде этого:

  • На сервере я открыл сокет с помощью:

    ServerSocket sv = new ServerSocket(0);
    

    Затем я получаю IP-адрес серверапо этому сайту http://www.whatismyip.com, и получить порт, который открывается:

    System.out.println(sv.getLocalPort());
    
  • На клиенте я отправляю сообщение на сервер по:

    Socket sk = new Socket(serverIP, serverPort);
    PrintWriter pw = new PrintWriter(sk.getOutputStream(), true);
    pw.print("Hello there");
    pw.close();
    sk.close();
    

Но сервер не может ничего получить, поэтому у меня есть несколько вопросов:

  1. Я думаю, что внешний порт сервера я получилВышеуказанный способ не является внешним портом, который будет использоваться другим узлом для отправки сообщения на сервер, так как правильно получить его в Java?

  2. Способ, которым я это сделал, -правильный способ реализовать часть STUN, когда 2 пира знают внешний ip и порт друг друга после обмена с сервером STUN?если это не так, каков правильный путь?

Надеюсь, вы все объясните мне, спасибо всем!

Ответы [ 2 ]

0 голосов
/ 06 декабря 2011

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

Наиболее близкими характеристиками являются:

Что касается реализации Java, я нахожу стек оглушения littleshoot в довольно хорошей форме.

0 голосов
/ 13 ноября 2011

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

Из того, что я могу прочитать о STUN RFC , он появляется , чтобы сделать предположение, что порт использовался дляСвязь с сервером координации STUN будет осуществляться через тот же порт, который клиент может использовать для подключения к первому узлу STUN.Это выглядит как удивительное предположение для RFC, поскольку это накладывает на маршрутизатор NAT невероятную нагрузку на повторную передачу одного и того же порта одному и тому же клиенту, что значительно усложняет правила доставки пакетов NAT.Надеюсь, я ошибаюсь.

...