Как же работаю сетевые игры?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by НTL, 30 Mar 2010.

  1. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Недавно задумался как работают игры на UDP протоколе, если UDP не отвечает на пакеты и не устанавливает соединение...
    Так же для использование UDP в приложение должна быть серверная часть (как на стороне сервера так и клиента), но компы клиентов могут быть под NAT'ом

    Так как работают игры??? или я может быть не так много знаю о UDP
     
  2. JnK

    JnK Elder - Старейшина

    Joined:
    30 Mar 2007
    Messages:
    125
    Likes Received:
    21
    Reputations:
    0
    #2 JnK, 30 Mar 2010
    Last edited: 30 Mar 2010
  3. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    То есть игры работает не на чистом UDP, так?
     
  4. gold-goblin

    gold-goblin Elder - Старейшина

    Joined:
    26 Mar 2007
    Messages:
    917
    Likes Received:
    174
    Reputations:
    3
    Конечно плохое сравнение но все же. Работа игр схожа с асинхронными сокетами..
     
  5. JnK

    JnK Elder - Старейшина

    Joined:
    30 Mar 2007
    Messages:
    125
    Likes Received:
    21
    Reputations:
    0
    Если слать UDP пакеты, через нат (от клиента) сервер их получать не будет.
    UDP можно использовать только как объявление себя сервером (но всеравно бывают случаи, что не доходят пакеты), остальная часть игры используется в частности TCP протокол.

    Вот еще ссылка по этой теме:
    UDP протокол для Интернета? (проблемы NAT)
     
    #5 JnK, 30 Mar 2010
    Last edited: 30 Mar 2010
  6. Retimiled

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    НЕ ПАРЬТЕСЬ NAT предназначен как для TCP так и для UDP

    они ничем не отличаются .... все так же как с TCP вы прописываете правила NAT SUA и все работает....

    для различных типов роутеров может носить названия Port forwarding , Virtual servers итд

    вы говорить роутеру что все входящие на данный порт пересылать на следующий внутренний IP!

    Другое дело что для UDP нужно настраивать NAT и для клиента(если клиент за NAT) а не только для сервера! :)
     
  7. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    К примеру игра CS реализована полностью на UDP, как же клиенты подключаются и обмениваются информацией в 2 стороны???
     
  8. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    а что тут сложного? Когда кол-во передаваемых данных не большое то всё нормально пашет. Другое дело последовательность пакетов может быть нарушена.
    если в TCP за последовательность отвечает драйвер TCP протокола, то тут уже придется тебе самому чтото придумывать.
    NAT и UDP спокойно работают вместе. банальный пример - DNS протокол. Он спокойно работает в обе стороны. Фишка в том, что когда ты посылаешь на сервак UDP пакет.
    То NAT сервер запоминает адрес и порт отправителя, далее изменяет адрес отправителя и посылает серваку жтот запрос. сервак отвечат. Далее NAT проверят порт кому предназначается пакет, затем по нему определяет кому в сети он предназначался. Система хоть и ненадежная но всёже.
    Для игр всё просто. тут.
     
  9. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    slesh, а если за NATом 2 компа, и для сервера их IP будут одинаковы, сервер отправит пакет на этот IP то кому придет этот пакет?
     
  10. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    ну я же говорю - тут по соответствию портов всё идет.
    там идет связь исходящего запроса со клиентскими данными.
    Образно говоря типа так:
    1) Послал клиент запрос на сервак. Данные отправились с IP1:p1
    2) Послал другой клиент запрос на сервак. Данные отправились с IP2:p2
    3) эти пакеты дошли до NAT сервера. он сделал свой запрос на указанный сервер. Сделав соответствие IP:pORT клиента и порт запроса для сервера.
    Когда сервак отвечает, то NAT смотрит к какому его порту было воответствие. После чего пересылает данный пакет нужному клиенту.
    Чтобы это всё пахало нормально, клиент должен сам инициализировать первый исходящий пакет для того чтобы NAT смог связывать их.
    Мож технически както по другому это устроена но алгоритм примерно такой.
    Для TCP - там еще легче. Он просто тупо в запросе поменяет адрес исходящий. А в ответе просто сверяет со своей таблицей соответствия
     
  11. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,309
    Reputations:
    327
    удп удобен тем что при пакетном провале игра сможет сама восстановить или корректировать соединение без отключения например.

    к вопросу о натах там и тд - удп как и тсп являются надстройкой ip протокола, поэтому никакой разницы в адресации ясное дело нет. удп - это connectionless протокол, те протокол, как уже было сказано слешем, который на уровне системы не создает логического соединения и не контролирует передачу пакетов. тсп же в отличии от него "гарантирует" что пакет будет доставлен пиру и результат операции будет отображен в коде возврата send() WSASend() recv() и тд, также он обладает механизмом ретрансмиссии, это например когда протокол удостоверяется получил ли пир пакет или нет, если нет то отправка повторяется - и все это делается "прозрачно" для разработчика. ну и конечно с упором на эти свойства разрабатываются различные варианты атак, правда последнее время я ничего нового не видел, имхо изжило себя
     
    #11 sn0w, 31 Mar 2010
    Last edited: 31 Mar 2010
    3 people like this.
  12. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Спс слешу за объяснение работы ната с UDP
    Еще вопрос:
    в приложение клиента надо 2 сокета открывать? или с одного можно отправить а потом принять?
     
  13. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    если делаешь всё на winsock то тока 1 сокет
    socket(AF_INET, SOCK_DGRAM, IPPROTO_UPD);
    sendto для посылки
    recvfrom для приема.
    Даже коннект не нужно делать. этим функциям передается структура sockaddr_in с заполненными полями кому слать пакет или получать.