На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Как создать прямое соединение
    Есть сервер и два клиента. Клиент 1 подключается к серверу по порту 1, клиент 2 также подключается к этому порту. Сервер сообщает клиенту 1 что извне 10.1.1.2:52000, а клиент 2 10.3.4.2:54000. Клиент 2 получает данные соответственно, теперь они по идее должны разорвать соединение, один прикинуться сервером, а другой коннектиться, вообщем не совсем мне понятен алгоритм.
      Цитата ter_nk_ @
      вообщем не совсем мне понятен алгоритм.

      Какое конкретное слово вам не понятно?
        Мне непонятно что делать дальше. Прервать соединение и например клиенту 1 создать сервер для прослушки на 192.168.1.10 порт 52000, но в сети извне видимым 10.1.1.2:52000 я все равно не буду.
          ter_nk_
          Я так понимаю, что речь о случае, когда оба клиента за NAT? Тогда в общем случае нет возможности исключить из схемы внешний прокси-узел и установить прямое соединение. Более того - если это возможно, то безопасность Вашей системы под большим вопросом...
            Цитата Akina @
            ter_nk_
            Я так понимаю, что речь о случае, когда оба клиента за NAT? Тогда в общем случае нет возможности исключить из схемы внешний прокси-узел и установить прямое соединение. Более того - если это возможно, то безопасность Вашей системы под большим вопросом...


            Можно задействовать свой сервер или STUN, вот как раз и пытаюсь понять как это сделать на практике. А насчет безопасности вообще не проблема.
              Цитата ter_nk_ @
              Можно задействовать свой сервер ... пытаюсь понять как это сделать на практике.

              Да чего тут понимать-то? клиенты общаются только с сервером, и всё.
                Цитата Akina @
                Да чего тут понимать-то? клиенты общаются только с сервером, и всё.


                p2p соединение сервер использует для соединения, дальше данные идут не через сервер.
                Сообщение отредактировано: ter_nk_ -
                  ter_nk_
                  Ну если у тебя NAT-ы настолько тупы, причём оба (хотя, как не прискорбно признавать - обычное дело) - посмотри вот это, ну и вообще вот это.
                    NATы обычные, я тупой. Что мне дает мой внешний IP с портом тому клиенту, который будет сервером? Я же не могу создать это внешнее соединение с этим IP и не понимаю как оно например роутером пробрасываться будет.
                      Цитата ter_nk_ @
                      Что мне дает мой внешний IP с портом тому клиенту, который будет сервером? Я же не могу создать это внешнее соединение с этим IP

                      По-моему, там всё вполне вменяемо разъяснено.

                      Тебе для установления соединения нужны только адрес и порт назначения. Их тебе сообщили. Чтобы и собеседник установил соединение, ему нужны твои адрес и порт. Т.е. ты должен не только обратиться по тому адресу и порту, который тебе передал соединяющий вас сервер, но и сделать это с того порта, с которого общался с этим сервером. И при этом ты должен игнорировать тот факт, что требуется процесс установления соединения. Ну и всё, собсно...
                        Ни tcp ни udp у меня не проходит через NAT. На внешнем сервере у tcp порт другой, у udp он такой же. Локально работает, извне нет.
                          ter_nk_
                          0. Есть то что нельзя рассказывать см http://fstec.ru/component/attachments/download/289 стр 37
                          1. Вам хорошенько надо изучить процесс установки соединения. Для UDP и TCP он отличает.
                          В. Олифер, Н. Олифер Компьютерные сети. Принципы, технологии, протоколы Учебник для вузов
                          2. Изучить разные NAT http://www.cyberguru.ru/networks/network-s...at-details.html
                          3. У вас 2 клиента 4 вида NAT и того вы должны предусмотреть 16 веток алгоритма
                          Вот тут кейсы https://en.wikipedia.org/wiki/STUN
                          4. Исходники торрента https://github.com/arvidn/libtorrent/blob/m..._connection.cpp
                          5. Если посмотреть исходники, то установка соединения носит случайный характер. Надо посылать не 1 пакет, а целую кучу.
                          6. Есть такие случае когда установка p2p соединения невозможно и тогда передача идёт через публичные сервера.

                          "дополнительные матерьялы"
                          teamviewer работает через сервер.
                          TCP - всегда двунаправленный протокол.
                          UDP - хотя и однонаправленный, но все межсетевые экраны создают правила для так называемого возвратного канал. Он временный.

                          Можно вежливо попросить роутер открыть порт.
                          https://ru.wikipedia.org/wiki/UPnP
                          https://en.wikipedia.org/wiki/Portmap
                          https://en.wikipedia.org/wiki/NAT_Port_Mapping_Protocol
                          и др.

                          Если это не помогает, то начинают пробовать пробить защиту.
                          Возвратный канал UDP и TCP имеют уязвимости если сервер с белым IP будет генерировать исходящие пакеты с подменённым Dest.IP то он сможет выдавать себя за пиры закрытые натом, но при этом для второго пира и его защиты всё будет выглядеть так как будто первые пиры находятся в глобальной сети. После установления связи общение продолжается без сервера. Сервер с белым IP участвует только на этапе соединения.

                          Torrent и Skype - это сети в них много компьютеров и всегда найдётся такой пир который не закрыт защитой. Вот он и будет выступать сервером.

                          Подробнее про пробивание защиты можно прочитать в протоколе STUN.
                          http://www.cyberguru.ru/networks/network-s...at-details.html
                          https://en.wikipedia.org/wiki/UDP_hole_punching
                          http://www.brynosaurus.com/pub/net/p2pnat/
                          http://www.ds.ewi.tudelft.nl/reports/2010/PDS-2010-007.pdf

                          А вообще проще посмотреть исходники тех же торрентов
                          http://sourceforge.net/projects/delphibt/ - компонент для работы с BitTorrent
                          http://sourceforge.net/projects/torrenttorque/ - торрент-клиент на Delphi
                          http://sourceforge.net/projects/azureus/ - исходники Vuse (Azureus)
                          http://sourceforge.net/softwaremap/trove_l...sc&form_cat=265 - много чего полезного


                          Если пробить защиту не удаётся, то работа идет через сервера с белыми IP. А если в сети и их не оказывается тогда облом.
                          Веб-сокеты и прокси.
                          Сообщение отредактировано: Pavia -
                            Ну нагрузил :) разбираться и разбираться.

                            Добавлено
                            Цитата Pavia @
                            0. Есть то что нельзя рассказывать см http://fstec.ru/component/attachments/download/289 стр 37


                            Не понял, что тут нельзя рассказывать?
                              ter_nk_
                              На картинке же все нарисовано:
                              user posted image
                                Цитата ^D^ima @
                                На картинке же все нарисовано:


                                Не получается!
                                  ter_nk_
                                  В течении какого времени у тебя устанавливается прямое соединение , после установки соединения с сервером и на какие порты\адреса?
                                    Цитата Pavia @
                                    1. Вам хорошенько надо изучить процесс установки соединения. Для UDP и TCP он отличает(ся).

                                    Уточню. Для UDP понятие установки соединения отсутствует вообще. :) UDP-датаграмма шлется на авось на деревню к дедушке.
                                    Могет дойдет. А могет - нет. И никаких сведений о том что было...

                                    Добавлено
                                    Цитата ter_nk_ @
                                    Есть сервер и два клиента. Клиент 1 подключается к серверу по порту 1, клиент 2 также подключается к этому порту. Сервер сообщает клиенту 1 что извне 10.1.1.2:52000, а клиент 2 10.3.4.2:54000. Клиент 2 получает данные соответственно, теперь они по идее должны разорвать соединение, один прикинуться сервером, а другой коннектиться, вообщем не совсем мне понятен алгоритм.

                                    Непонятность заключается в том, что
                                    1. Клиентам разорвать соединение с сервером - да, можно, но это означает полный крах идеи.
                                    2. Один прикинуться сервером...такой технологии нет. Клиент за натом никак не может прикинуться сервером.
                                    3. Т.е. без посредника два занатовских клиента не могут стать самостоятельной парой клиент-сервер и никогда не смогут работать самостоятельно.
                                    Сообщение отредактировано: Oleg2004 -
                                      Цитата ^D^ima @
                                      В течении какого времени у тебя устанавливается прямое соединение , после установки соединения с сервером и на какие порты\адреса?



                                      Клиент 1, внутренний адрес 192.168.1.10, внешний допустим 10.10.10.10, порт 1000 например.
                                      Клиент 2, внутренний адрес 192.168.1.11, порт 1000 например.

                                      Внешний порт первого 61000, второго 62000.

                                      Клиент 1 становится сервером (тут же после разрыва соединение) соответственно с адресом 192.168.1.10 и портом 61000. Клиент 2 обращается на адрес 10.10.10.10 к порту 62000. И ничего, ну я понял что так просто работать не станет.

                                      Цитата Oleg2004 @
                                      3. Т.е. без посредника два занатовских клиента не могут стать самостоятельной парой клиент-сервер и никогда не смогут работать самостоятельно.


                                      Ну как-то же работает, что сервер для соединения нужен только в начальный момент.

                                      Я вот подумал, если я комп подключю без роутера, то может..
                                        Кстати, друзья, а для IPv6 такой проблемы нет?


                                        ter_nk_
                                        Цитата ter_nk_ @
                                        Клиент 2 обращается на адрес 10.10.10.10 к порту 62000


                                        Цитата ter_nk_ @
                                        порт 1000 например


                                        Должен обращаться к порту с которого ушел внешний запрос
                                          Цитата ^D^ima @
                                          Должен обращаться к порту с которого ушел внешний запрос


                                          В смысле? 1000 - это порт тестирование, он же нигде не участвует больше.
                                            Цитата ter_nk_ @
                                            Клиент 1 становится сервером (тут же после разрыва соединение) соответственно с адресом 192.168.1.10 и портом 61000. Клиент 2 обращается на адрес 10.10.10.10 к порту 62000. И ничего, ну я понял что так просто работать не станет.

                                            Я что-то совсем не догоняю :)
                                            Клиент 1 становится сервером.
                                            Ладно, на клиенте может работать и серверная программа, согласен. Но с этим сервером теперь надо создавать новое соединение. Т.е. он должен получить TCP-сегмент с флагом SYN. На какой адрес клиент 2 шлет свою заявку на соединение (тоже SYN)с серверным клиентом 1 ??? И как она до него может дойти? :(
                                              Цитата Oleg2004 @
                                              Ладно, на клиенте может работать и серверная программа, согласен. Но с этим сервером теперь надо создавать новое соединение. Т.е. он должен получить TCP-сегмент с флагом SYN. На какой адрес клиент 2 шлет свою заявку на соединение (тоже SYN)с серверным клиентом 1 ??? И как она до него может дойти? :(


                                              Ну вот и не доходит, так как я слабо в теме. Клиент 1 192.168.1.10. А клиент 2 должен послать естественно на внешний 10.10.10.10. Не работает и не будет работать, понял.
                                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                              0 пользователей:


                                              Рейтинг@Mail.ru
                                              [ Script execution time: 0,0472 ]   [ 16 queries used ]   [ Generated: 29.03.24, 10:47 GMT ]