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

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

  1. _DEN_

    _DEN_ DEN

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

    Если оба компа за натом, то нужен третий комп (сервер), который имеет внешний IP. На этот сервер компы отправляют по пакету. Сервер принимает UDP пакет на UDP-сокет. У сокета можно спросить remote endpoint - то есть IP и порт отправителя. Сервер, узнав IP и порт отправителей (это будут IP:порт снаружи со стороны натов), отвечает "крес-накрест" IP-портом друг друга. То есть клиенту А сообщается IP:порт клиента Б, а клиенту Б аналогично - данные клиента А. С помощью этого сервера клиенты узнали друг про друга, и далее они устанавливают связь по алгоритму, который уже будет зависеть от типов ната. Вот ваш сервер:

    Код (Text):
    1. #include <boost/asio.hpp>
    2.  
    3. struct ep
    4. {
    5.     int ip;
    6.     unsigned short port;
    7. };
    8.  
    9. int main
    10. {
    11.     ep client1, client2;
    12.     char empty[1];
    13.     boost::asio::io_service io_service;
    14.     boost::asio::ip::udp::socket sck(io_service);
    15.     boost::asio::ip::udp::endpoint ep1, ep2;
    16.     sck.receive_from(boost::asio::buffer(empty), ep1);
    17.     sck.receive_from(boost::asio::buffer(empty), ep2);
    18.     client1.ip = ep1.remote_endpoint().address().to_ulong();
    19.     client1.port = ep1.remote_endpoint().port();
    20.     client2.ip = ep2.remote_endpoint().address().to_ulong();
    21.     client2.port = ep2.remote_endpoint().port();
    22.     sck.send_to(boost::asio::buffer(&client1, sizeof(client1)), ep2);
    23.     sck.send_to(boost::asio::buffer(&client2, sizeof(client2)), ep1);
    24.     return 0;
    25. }
     
  2. _DEN_

    _DEN_ DEN

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

    _DEN_ DEN

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

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    100gold
    И в чём профит? TURN протокол позволяет дать внешний адрес, через который будут идти данные. При отсутствии или невозможности использования сервера с внешним адресом всё это идёт лесом. ТURN это так, один из возможных протоколов взаимодействия.

    При чём здесь реализация?

    _DEN_
    Не совсем так. В общем случае STUN возможен только в случает full cone ната, с одной стороны. Или адрес рестриктед с двух. Иначе возникнут непреодолимые проблемы. И никакой перебор портов не поможет.
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster
    Ох мой гат. Совсем так. Внешний сервер нужен только для того, чтобы клиенты узнали друг о друге. Сам же сервер не имеет никакого отношения к тому, каким образом в дальнейшем клиенты будут налаживать связь. Сервер нужен только чтобы познакомить их друг с другом. А как они потом будут налаживать связь исходя из своих типов натов - дело десятое, и сервера оно не касается. Проблемы, в том числе непреодолимые - это проблемы наладки связи, и сервер тут, повторяю, не причем. Сервер нужен только для знакомства. Перебор портов поможет, но отправлять 65536^2 пакетов это слишком долго, поэтому это никто не делает.
     
  6. Aids

    Aids New Member

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

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    При чём здесь гат? Моя реплика не относилась к тому, что сервер нужен не только для знакомства друг с другом. Это и так очевидно. Она относилась к тому, что если хотя-бы один из клиентов за симметричным натом, то другой обязан быть full cone, чтобы иметь возможность принять с любого адреса и порта.

    Повторю цитату.
    Каким образом перебор портов поможет при двухстроннем симметричном нате? Ни один пакет просто не пройдёт.

    З.Ы Да если одни из них симметричный, а другой не full cone, то и в этом случае перебор портов бесполезен, так как нат просто срежет все такие запросы.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster
    Это не верно. Есть алгоритм для связи symmetric <-> port-restricted.

    Поможет. Потом расскажу, сейчас надо отойти от компа.
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Прошу в студию.
     
  10. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    на пхп или питоне это сделать разумнее. можно будет положить на любой сервер их поддерживающий. строк тоже будет немного. даже если устроить авторизацию при обмене адресами.

    // не обращайте внимания. это я о своем. просто тема похожая
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Один публикует "адрес:порт", другой "адрес"? Один начинает долбить по "адрес:все порты", другой по "адрес:порт"? Так? Весёлый способ.
     
  12. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Aids
    И где там оно?
     
  14. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Booster
    Статью ещё не полностью дочитал. Но там похоже изложен принцип соединения symmetric <-> port-restricted. И на основе статьи создана программа Chaply
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Aids
    Ну так прочитайте, а потом пишите. Я ничего такого там не нашёл.
     
  16. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Booster
    Я не собирался Вам ничего доказывать. Указал лишь ссылку по данной проблеме, где рассматривается symmetric <-> port-restricted. Думал возможно заинтересует, не Вас так кого то другого.
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Aids
    Вы же даже не прочитали, а пишите о чём там.
    Механизм работы ната хорошо известен, возможный алгоритм взаимодействия symmetric <-> port-restricted я описал в 31 посту, но это костыль ещё тот, лично я бы его не использовал. Очень маловероятно, что вы найдёте что-то лучше.
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Я был прав, этот костыль и используется:
    Только мне непонятно, нафига отправлять 500 пакетов со случайных портов со стороны symmetric NAT.(Тот кто за симметричным натом, не особо в состоянии что-либо контролировать.) Типо для кучности? Монте Карло алгоритм. :)
     
  19. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster
    Да. 500 пакетов в обе стороны дают вероятность угадать ~97%. Дел на пару-тройку секунд.

    C port-restricted отправляется 500 пакетов на 500 случайных портов. С symmetric в ответ - 500 пакетов со случайных портов на известный порт port-restricted. Чтобы установился тоннель нужно чтобы хотя бы один пакет, отправленный туда совпал с хотя бы одним из тех, который отправлен обратно (совпал по портам со стороны symmetric). При 500 пакетах вероятность этого:

    [​IMG]

    Про STUN и прочие TURN: это все хорошо, только не с этого нужно начинать. Год назад я очень дотошно разбирал тему P2P - я написал несколько десятков различных примеров, проверил десятки различных догадок, попробовал кучу разных трюков, собирал пакеты руками начиная с IP-заголовка, смотрел как реагируют различные NAT-ы, пересмотрел кучу дампов Wireshark-а, и т.д. До этого мне казалось, что все, что выше application-уровня в сети - это потусторонняя магия, которую знает 3 человека на земле. Они не общаются с людьми, живут в пещерах, и даже перед сном дрочат не на Сильвию Сейнт, а на мануалы Gentoo. Но прошло всего несколько месяцев, и я уже сам был таким задротом - я смотрел на дамп пакета начиная с IP-заголовка и все понимал, что это за цифры и откуда они взялись. Теперь я прекрасно понимаю, как именно работает P2P и сам процесс установки тоннеля, какие трюки сработают, какие - нет, и почему, и как это все зависит от типов натов участников. Для того чтобы все это понимать, нужно самостоятельно пошагово разобрать каждое действие отправляя байтики на свои тестовые программки, разбирая дампы и реакции натов. Простым вбросом а-ля "Тебе нужен STUN-сервер" вы просто показываете свое дремучее беспробудное невежество.
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Поздравляю, ты стал четвёртым. Ты гуру. Всем срочно поклоняться великому _DEN_-у. ^)

    В чём невежество? Ты абсолютно всё знаешь? Если нет, значит ты невежда. Про STUN-сервер я кстати не вбрасывал и между прочим я знаю не по наслышке что это такое. Совет на будущее, не стоит всех считать дураками, иначе будет тяжело в жизни.


    Объясни нам о великий гуру, каким образом клиент за симетричным натом может быть уверен, что маппинг будет всегда на разные порты? Сколько времени нат будет ждать, пока не закроет udp маппинг? Все ли симметричные наты вообще дружелюбны к udp? Вероятности кстати мы посчитать можем, не школота чай.

    Молодец, возьми с полки пирожок. Думаешь все тут только вчера начали работать с сетью? Только ничего в этом сложного и элитого нету. Тут уже приходили элитные товарищи. ^) Вот если ты был Стивом Джобсом или на худой конец Робертом Эллиотом, тогда ты был-бы элито. ^) А так гордится задротством, могут только именно задроты. ^)

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