UDP hole punching. Как определить порт

Тема в разделе "WASM.NETWORKS", создана пользователем Aids, 24 май 2011.

  1. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Написал простенькие UDP клиент и сервер. Хочу установить прямое соединение между двумя компьютерами через нат. Но вот не совсем понимаю каким образом получить внешние IP и порт, так как за натом у клиента порт изменится.
    Как я представляю это сделать:
    1) нужен 3 хост с статическим IP
    2) на нём должен быть UDP сервер
    3) после принятия пакета от одного из клиентов он должен определить IP и порт его и отправить другому клиенту.

    Если я не правильно расписал пункты то поправте. Так вот в 3м пункте мне не ясно с помощью какой api сервер сможет получить порт и IP клиента?
     
  2. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    И ещё вопрос можно за место 3хоста использовать STUN сервер?
     
  3. eshkinkot

    eshkinkot New Member

    Публикаций:
    0
    Регистрация:
    6 май 2010
    Сообщения:
    73
    Даже нужно использовать. Либо посмотри на уже готовое решение от Microsoft - протокол teredo
     
  4. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    eshkinkot
    teredo на сколько я понял он предназначен для использования пакетов IPv6 в сетях IPv4
     
  5. eshkinkot

    eshkinkot New Member

    Публикаций:
    0
    Регистрация:
    6 май 2010
    Сообщения:
    73
    да. это немного измененная реализация протокола STUN. IPv6-адрес формируется исходя из данных получаемых из протокола stun. просто легче будет реализовать teredo, потому что он встроен в винду. На ХР не пробовал, а на вин7 работает отлично.
     
  6. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Я тут выяснил что у меня дома симметричный NAT. И теперь я вообще ничего понять не могу. Везде описывается что UDP hole punching не работает на таком типе NAT. Я думал что кип, скайп и торрент используют именно UDP hole punching при прямом соединении. Так как они тогда соединяются для передачи файлов?
     
  7. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Aids
    посредник?
     
  8. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    2 Хоста могут соединится друг с другом, если:
    1) У одного есть глобальный IP и другой его знает
    2) Хосты разделены одним или несколькими NAT, но ни один из NAT не является симметричным NAT.(В это случае используется STUN сервер, у которого кстати должен быть глобальный IP)
    3) Хосты разделены симметричным NAT и используют TURN сервер.
     
  9. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    spa
    возможно конечно для кипа и возможно скайпа. Но торренты?
     
  10. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Aids
    у меня крайне плохо раздается за натом. те походу раздаю только тем у кого белый ip и я могу к ним подключится.
     
  11. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    100gold
    TURN сервер это уже будет не прямое соедиение. Весь трафик через него попрёт.
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Aids
    А что ты хотел от симметричного ната? Это самый ограниченный из всех.
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Aids
    STUN-сервер это и есть 3-й хост.

    Если оба клиента сидят за симметричным натом, то алгоритма нет - только последовательный перебор портов. В остальных случаях соединение достаточно просто устанавливается (в зависимости от конфигурации натов), и никакие там STUN-ы и TURN-ы не нужны - в примитивном случае достаточно сервера, состоящего из 10-15 строк кода на C++.
     
  14. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    _DEN_
    а поподрбнее можно, какая последовательность действий должна быть?

    В случае симметричного NAT действия я правильно представляю:
    1) один клиент с IP1 шлёт пакты на IP2 с портом P2, при этом действии откроется на нате порт P1 - этот клиент будет сервером
    2) этот же клиент будет по мимо передачи, слушать ответные пакеты.
    3) второй клиент c IP2 пытается подключится к IP1, и перебирает порты.
    Возможно ли такое?
     
  15. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Взаимодействие через STUN для не симметричных типов NAT

    1) первый клиент отправляет запрос на stun, ответом получает свой порт1 и ip1
    2) второй клиент отправляет на stun запрос, и получает в ответе порт2 и ip2
    3) через какой нибудь зарегистрированный бесплатный http хост они обмениваюстя ip и портами
    4) устанавливают прямое соединение

    Я правильно понимаю алгоритм соединениея? Его можно как то упростить, например исключить http, а обмен портом и ip провести через stun?
     
  16. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    если оба клиента за симметричным натом - надо использовать TURN сервер

    А по-моему изобретение велосипеда не очень полезное занятие. Да и в "10-15 строк кода на Ц++" не получится уложится... Да и реализация полноценного STUN сервера не такая уж и сложная задача)))
     
  17. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    100gold
    Зачем же сервер. Их достаточно в интернете уже готовых. Нужно только клиент реализовать. Да и то там будет пару запросов что бы узнать IP и порт.
     
  18. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    100gold

    Лол, да обычный форвардер трафика нужен :)) Начитаются википедий и кидаются понятиями, не понимая сути :))

    Не расстраивайся. Если будешь продолжать изучать C++, то у тебя со временем начнет получаться.
     
  19. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Ну противно, ей богу)) Дофига уже тем по сети где человек задает элементарный вопрос, а ему вываливают гору умных терминов)) Термины-то никак не помогут понять сути. А суть поможет понять простое объяснение на пальцах. Мол вот эти 4 байтика мы отправим отсюда туда, и это получится потому что там IP и Port видны, а тут уже нет - вот это помогает понять суть.
     
  20. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    _DEN_
    Так где же суть?