Недавно задумался как работают игры на UDP протоколе, если UDP не отвечает на пакеты и не устанавливает соединение... Так же для использование UDP в приложение должна быть серверная часть (как на стороне сервера так и клиента), но компы клиентов могут быть под NAT'ом Так как работают игры??? или я может быть не так много знаю о UDP
Если слать UDP пакеты, через нат (от клиента) сервер их получать не будет. UDP можно использовать только как объявление себя сервером (но всеравно бывают случаи, что не доходят пакеты), остальная часть игры используется в частности TCP протокол. Вот еще ссылка по этой теме: UDP протокол для Интернета? (проблемы NAT)
НЕ ПАРЬТЕСЬ NAT предназначен как для TCP так и для UDP они ничем не отличаются .... все так же как с TCP вы прописываете правила NAT SUA и все работает.... для различных типов роутеров может носить названия Port forwarding , Virtual servers итд вы говорить роутеру что все входящие на данный порт пересылать на следующий внутренний IP! Другое дело что для UDP нужно настраивать NAT и для клиента(если клиент за NAT) а не только для сервера!
К примеру игра CS реализована полностью на UDP, как же клиенты подключаются и обмениваются информацией в 2 стороны???
а что тут сложного? Когда кол-во передаваемых данных не большое то всё нормально пашет. Другое дело последовательность пакетов может быть нарушена. если в TCP за последовательность отвечает драйвер TCP протокола, то тут уже придется тебе самому чтото придумывать. NAT и UDP спокойно работают вместе. банальный пример - DNS протокол. Он спокойно работает в обе стороны. Фишка в том, что когда ты посылаешь на сервак UDP пакет. То NAT сервер запоминает адрес и порт отправителя, далее изменяет адрес отправителя и посылает серваку жтот запрос. сервак отвечат. Далее NAT проверят порт кому предназначается пакет, затем по нему определяет кому в сети он предназначался. Система хоть и ненадежная но всёже. Для игр всё просто. тут.
slesh, а если за NATом 2 компа, и для сервера их IP будут одинаковы, сервер отправит пакет на этот IP то кому придет этот пакет?
ну я же говорю - тут по соответствию портов всё идет. там идет связь исходящего запроса со клиентскими данными. Образно говоря типа так: 1) Послал клиент запрос на сервак. Данные отправились с IP11 2) Послал другой клиент запрос на сервак. Данные отправились с IP22 3) эти пакеты дошли до NAT сервера. он сделал свой запрос на указанный сервер. Сделав соответствие IPORT клиента и порт запроса для сервера. Когда сервак отвечает, то NAT смотрит к какому его порту было воответствие. После чего пересылает данный пакет нужному клиенту. Чтобы это всё пахало нормально, клиент должен сам инициализировать первый исходящий пакет для того чтобы NAT смог связывать их. Мож технически както по другому это устроена но алгоритм примерно такой. Для TCP - там еще легче. Он просто тупо в запросе поменяет адрес исходящий. А в ответе просто сверяет со своей таблицей соответствия
удп удобен тем что при пакетном провале игра сможет сама восстановить или корректировать соединение без отключения например. к вопросу о натах там и тд - удп как и тсп являются надстройкой ip протокола, поэтому никакой разницы в адресации ясное дело нет. удп - это connectionless протокол, те протокол, как уже было сказано слешем, который на уровне системы не создает логического соединения и не контролирует передачу пакетов. тсп же в отличии от него "гарантирует" что пакет будет доставлен пиру и результат операции будет отображен в коде возврата send() WSASend() recv() и тд, также он обладает механизмом ретрансмиссии, это например когда протокол удостоверяется получил ли пир пакет или нет, если нет то отправка повторяется - и все это делается "прозрачно" для разработчика. ну и конечно с упором на эти свойства разрабатываются различные варианты атак, правда последнее время я ничего нового не видел, имхо изжило себя
Спс слешу за объяснение работы ната с UDP Еще вопрос: в приложение клиента надо 2 сокета открывать? или с одного можно отправить а потом принять?
если делаешь всё на winsock то тока 1 сокет socket(AF_INET, SOCK_DGRAM, IPPROTO_UPD); sendto для посылки recvfrom для приема. Даже коннект не нужно делать. этим функциям передается структура sockaddr_in с заполненными полями кому слать пакет или получать.