Какой протокол используют онлайн игры
Какой сетевой протокол выбрать для игры?
Собственно, сабж. Необходимо связать два клиента одной игры на разных частях света. какой протокол выбрать? UDP, TCP или что-то другое? В RT-games в основном используется UDP, но мне не нравится, что он по дороге может потерять пакеты или продублировать их.
- Ссылка
В quake можно было выбирать. Так что реализуй оба. Я настаиваю.
- Показать ответ
- Ссылка
В принципе мысль. В чем еще различие, кроме дублированияпотери?
- Ссылка
Интересно, как Вы пишете игры, если спрашиваете такие ответы? Можно не отвечать.
- Показать ответы
- Ссылка
А Вы не знаете, что люди еще могут учиться в процессе разработки?
- Показать ответ
- Ссылка
Игроки взаимодействуют между собой напрямую или через сервер?
ЕМНИП, UDP не пройдут через роутер внутрь интрасети.
- Показать ответы
- Ссылка
какого рода игра? какой объем трафика будет передаваться?
- Показать ответ
- Ссылка
Это называется опыт. В любом случае должна быть база.
- Ссылка
Я никогда не писал общение с сетью. В основном я изучал API и внутреннее устройство ОСей.
- Показать ответ
- Ссылка
Пока планируется напрямую, но, думаю, что впоследствии (возможно) будет сервер.
- Ссылка
Двухмерная бродилка по типу напоминающая Terraria, только с бОльшей геологической составляющей. Взаимодейтвие с почвой, предметами, мутирование жизненных форм.
Передача данных, думаю будет примерно такой ширины:
Просто передача данных управления (около 10 кнопок) + данные о взаимодействии (где-то 100 байт) + Данные об изменении окружения (тоже оокло 100 байт).
- Ссылка
Чтоб основы понять тебе максимум 3 дня потребуется. Что по сетевому программированию смотреть на ЛОРе 1000 раз обсуждалось. Вопросы отпадут сами. Удачи.
- Показать ответ
- Ссылка
Если вы не заметили, я не спрашивал, что почитать по сетевому программированию. Я спрашивал, какой конкретно протокол лучше для поставленной задачи. Что почитать по протоколу я сам найду. Меня интересует личный опыт других и трудности, с которыми возможно я столкнусь. Так, например, ответ trex6 был в тему:
ЕМНИП, UDP не пройдут через роутер внутрь интрасети.
В справочнике такого не найдешь.
А вы, товаrищь, просто тролль.
- Показать ответы
- Ссылка
Начать можно с TCP, потом поймёшь что не так с таким подходом, прочувствуешь на «шкуре». Или может даже всё будет нормально.
А поднять с нуля свой протокол через UDP сразу не получится, нужно хорошо понимать как обрабатывать потери пакетов в приложении и т.п. Без твёрдого понимания необходимости UDP лучше по этому пути не ходить.
- Показать ответ
- Ссылка
В справочнике такого не найдешь.
да это чушь, существует 100500 методов преодоления такой неприятности
- Показать ответ
- Ссылка
TCP: потом поймёшь что не так с таким подходом
UDP: лучше по этому пути не ходить.
Вы «опустили» оба протокола. Так что же выбрать?
- Показать ответ
- Ссылка
да это чушь, существует 100500 методов преодоления такой неприятности
Я имел в виду наличие в справочнике не метода «обхода», а наличие самой проблемы.
- Показать ответ
- Ссылка
Вы «опустили» оба протокола. Так что же выбрать?
почему это опустил? Ясно же написал – начать лучше с TCP. Т.к. он из коробки решает множество проблем о которых ты ещё не догадываешься, я так думаю.
От UDP в твоей задаче тоже можно получить профит и потенциально сделать лучше чем через TCP. Но для этого нужно знать многие нюансы и проблемы передачи данных через датаграмы.
Просто наблюдение из жизни. Можно найти достаточно много продуктов с реализациями протокола приложения через TCP и UDP. И мало кому удавалось с помощью UDP существенно лучше решать задачи несмотря на значительно бОльшие затраты ресурсов на разработку варианта протокола поверх UDP.
- Показать ответ
- Ссылка
Я имел в виду наличие в справочнике не метода «обхода», а наличие самой проблемы.
в справочнике под названием гугл найдутся все ответы на такие вопросы, буквально за несколько секунд.
- Ссылка
От UDP в твоей задаче тоже можно получить профит и потенциально сделать лучше чем через TCP. Но для этого нужно знать многие нюансы и проблемы передачи данных через датаграмы.
Я так понимаю, что надо (я это все в свой фреймворк засуну, на котором и игра висит и все остальное) : 1) Сделать сетевые соединения и передачу данных через TCP. 2) Заставить пункт 1 работать. 3) Посмотреть на результат. Если работает криво иили медленно, идем дальше 4) Разработать алгоритм получения данных с допущением дублированияпотери пакетов. 5) На его основе сделать UDP-обертку.
- Показать ответы
- Ссылка
- Ссылка
Только между пунктом 3 и 4 нужно добавить пункт 3а: разобрать проблему по кусочкам, понять почему не достигается нужный результат.
Некоторые проблемы можно решить тюнингом TCP сокетов. Например, опциями TCP_CORK/TCP_NODELAY. И когда уже будет ясное понимание, что в рамках TCP проблема неустранима, то переходить к пункту 4. В процессе разборов полёта появится понимание как можно сделать лучше поверх UDP.
- Ссылка
Да всё там есть. Про маршрутизацию и всякие там NATы написаны целые главы. Я точно знаю, читал неделю назад. Еще есть подробнейшие примечания про подводные камни и прочие тонкости. Информации очень много. Остальные по вашему откуда информацию берут? Читают книжки.
Сетевое программирование для разработчиков игр. Часть 1: UDP vs. TCP
От переводчика: Это перевод первой статьи из цикла «Networking for game programmers». Мне очень нравится весь цикл статей, плюс всегда хотелось попробовать себя в качестве переводчика. Возможно, опытным разработчикам статья покажется слишком очевидной, но, как мне кажется, польза от нее в любом случае будет.
Привет, меня зовут Гленн Фидлер и я приветствую вас в первой статье из моей онлайн-книги “Сетевое программирование для разрабочиков игр”.
В этой статье мы начнем с самых базовых аспектов сетевого программирования — приема и передачи данных по сети. Прием и передача данных — это основная и наиболее простая часть из всего круга задач, которыми занимаются сетевые программисты, но часто бывает сложно определить, каким путем лучше двигаться. Уделите этой части достаточно внимания — если у вас останется непонимание, то это может привести к ужасным последствиям для вашей многопользовательской игры в дальнейшем!
Вы, скорее всего, уже что-нибудь слышали о сокетах, и, возможно, знаете, что они делятся на два основных типа — TCP и UDP. Первое, что нужно решить при разработке многопользовательской игры — это какой тип сокетов использовать — TCP, UDP, или оба?
Выбор типа сокетов полностью зависит от жанра игры, которую разрабатываете. В данном цикле статей я буду считать, что вы пишете игру в стиле action — наподобие Halo, Battlefield 1942, Quake, Unreal, CounterStrike, Team Fortress и т.п.
Теперь мы более подробно рассмотрим свойства каждого типа сокетов (учитывая тот факт, что мы разрабатыватаем игру в стиле action), и немного углубимся в детали работы сети интернет. После подробного обзора правильный вариант станет очевиден!
TCP расшифровывается как “transmission control protocol” (протокол контроля передачи), а IP — как “internet protocol”. Вместе они лежат в основе практически всего, что вы делаете в сети, начиная от просмотра веб-страниц и кончая общением в IRC и электронной почтой — все это работает на основе TCP/IP.
Если вы когда-либо уже использовали TCP сокеты, то вы должны знать, что TCP — это протокол, использующий принцип надежного соединения. Это означает, что вы устанавливаете соединение между двумя компьютерами, и затем пересылаете данные между ними подобно тому, как если бы вы записывали информацию в файл на одном компьютере, а на другом — считывали бы ее из того же файла.
При этом соединение считается надежным и последовательным — то есть, вся информация, которую вы посылаете, гарантированно должна дойти до получателя в том же порядке, в каком была отправлена. Также TCP соединение можно считать непрерывным потоком данных — протокол сам заботится о разбивке данных на пакеты и пересылке их по сети.
Еще разок — все просто, как обычная запись или чтение из файла. Элементарно, Ватсон!
Но такая простота в обращении совершенно отличается от того, что на самом деле происходит «под капотом», на более низком уровне — уровне протокола IP.
На этом уровне нет понятия соединения — вместо этого отдельные пакеты передаются от одного компьютера к другому. Можно представить этот процесс как передачу записки от одного человека к другому в комнате, полной народу: в конце концов записка попадает к кому надо, но при этом пройдя через множество рук.
При этом нет никакой гарантии того, что записка дойдет до адресата. Отправитель просто отправляет записку в надежде, что она дойдет, но при этом даже не знает, дошло ли послание или нет — до тех пор, пока получатель не решит написать в ответ.
Естественно, в реальности все немного сложнее, поскольку компьютер-отправитель не знает точную последовательность компьютеров в сети, через которые надо передать пакет, чтобы он добрался как можно быстрее. Иногда IP передает несколько копий одного и того же пакета, которые могут идти до адресата разными путями — и, скорее всего, дойдут в разное время.
Так происходит потому, что сеть интернет — это самоорганизующаяся и самовосстанавливающаяся система, которая может “обходить” проблемные участки в сети. На самом деле, то, что происходит на таком низком уровне в сети — реально круто. Вы можете почитать об этом более подробно в уже ставшей классикой книге — “TCP/IP Illustrated”.
А что, если мы захотим пересылать информацию между компьютерами не в стиле чтения/записи в файл, а непосредственно отправляя и получая отдельные пакеты?
Что ж, мы можем сделать это, используя UDP. UDP расшифровывается как “user datagram protocol” (протокол пользовательских датаграмм), и он работает поверх IP (как и TCP), но вместо добавления кучи функциональности он представляет собой лишь небольшую надстройку над IP.
Используя UDP, мы можем отослать пакет по определенному IP адресу (к примеру, 112.140.20.10) и порту (к примеру, 52423), и он будет передаваться от компьютера к компьютеру, пока не достигнет цели (или не потеряется по пути).
При этом, на стороне приемника мы просто сидим и ждем, прослушивая определенный порт (52423 в нашем случае), и, когда на него приходит пакет от кого-либо (помним, что соединения не используются), мы получаем об этом уведомление с адресом и портом компьютера-отправителя, размером пакета, и после этого можем прочитать данные из этого пакета.
Протокол UDP не гарантирует доставку данных. На практике большинство пакетов, конечно, доходят, но всегда имеются потери около 1-5%, а иногда бывают периоды времени, в которые пакеты вообще не доходят (помните, что между отправителем и получателем могут находиться тысячи компьютеров, на любом из которых что-то может отказать или сломаться).
Также UDP не гарантирует порядок доставки пакетов. Вы можете отправить пять пакетов по порядку — 1, 2, 3, 4, 5 — а прийти они могут совершенно в другом порядке — к примеру, 3, 1, 2, 5, 4. Опять же, на практике, они скорее всего придут в правильном порядке в большинстве случаев, но полагаться на это нельзя!
Наконец, хоть UDP и ничего особо не добавляет к IP, одну вещь он все-таки гарантирует. Если вы пересылаете пакет, то он либо дойдет полностью, либо не дойдет вообще. Так, если вы пересылаете пакет в 256 байт другому компьютеру, то он не может получить только первые 100 байт от пакета — он обязательно должен получить все 256 байт. Это реально единственная вещь, которую гарантирует протокол UDP — все остальное ложится на ваши плечи.
Итак, нам нужно решить — использовать TCP или UDP сокеты? Давайте взглянем на их свойства:
TCP:
- Использует принцип соединений
- Гарантирует доставку и очередность
- Автоматически разбивает информацию на пакеты
- Следит за тем, чтобы не пересылать данные слишком интенсивно (контроль потока данных)
- Легко использовать — как запись/чтение из файла
UDP:
- Не использует принцип соединений — придется реализовывать это вручную
- Не гарантирует доставку и порядок доставки пакетов — они могут дойти в неправильном порядке, с дубликатами, или вообще не дойти!
- Нужно вручную разбивать данные на пакеты и отправлять их
- Нужно следить за тем, чтобы не пересылать данные слишком интенсивно
- Если пакет потеряется, то нужно как-то это отследить, и в случае необходимости переслать его заново
С таким списком решение кажется очевидным — TCP реализует всю необходимую нам функциональность и его проще использовать, тогда как использование UDP обещает геморрой с написанием всего на свете вручную, с нуля. Значит, используем TCP, да?
Использовать TCP — это наверное, худшая ошибка, которую можно совершить, разрабатывая многопользовательскую игру. Чтобы понять почему, давайте разберемся, что делает TCP таким простым в использовании!
Как работает TCP
TCP и UDP оба работают поверх IP, но по факту они совершенно разные. UDP ведет себя очень похоже на IP, в то время как TCP абстрагирует пользователя от всех проблем с пакетами, делая взаимодействие с ним похожим на чтение/запись в файл.
Итак, как же он это делает?
Во-первых, TCP использует абстракцию потока данных — вы можете просто записывать байты данных в этот поток, и TCP позаботится о том, чтобы они дошли до адресата. Так как протокол IP передает данные пакетами, а TCP работает поверх IP, TCP должен разбивать поток входных данных пользователя на отдельные пакеты. Таким образом, внутри TCP некоторая логика собирает данные в очередь, и, когда их накапливается достаточно много, она формирует пакет и отправляет его адресату.
Такое поведение может стать проблемой для нашей многопользовательской игры, если нужно передавать очень маленькие пакеты. Может случиться так, что TCP решит не передавать наши данные, пока их не накопится достаточно, чтобы сформировать пакет определенного размера (скажем, больше ста байт). И это — большая проблема, потому что необходимо передавать данные с клиента (нажатия клавиш игрока) на сервер как можно быстрее, и если при этом будут возникать задержки из-за буферизации данных протоколом, то для игрока на клиентской стороне игра будет происходить далеко не самым приятным образом. При этом обновление объектов игры будет происходить с задержкой и редко — тогда как нам нужно делать обновление объектов вовремя и часто.
В TCP есть опция, призванная исправить это — “TCP_NODELAY”. Она говорит протоколу, чтобы он не ждал накопления данных в очереди на отправку, а отсылал их сразу.
К сожалению, даже с установленной данной опцией, у TCP наблюдается множество проблем при использовании его в сетевых играх.
Корень всех проблем заключается в том, каким образом TCP обрабатывает пакеты, потерянные или пришедшие вне очереди, создавая иллюзию надежного и последовательного соединения.
Как TCP обеспечивает надежность соединения
При передаче TCP разбивает поток данных на отдельные пакеты, пересылает их по сети, используя ненадежный протокол IP, и затем на принимающем компьютере восстанавливает из принятых пакетов первоначальный поток.
Но что будет, если один из пакетов не дойдет? Или если пакеты придут не по порядку, или с дубликатами?
Если особо не углубляться в детали работы TCP (а это реально очень сложная тема — можете почитать в TCP/IP Illustrated), процесс выглядит так: TCP отправляет пакет, определяет, что пакет не дошел, и заново отправляет тот же пакет адресату. Дублирующиеся пакеты отсеиваются на стороне адресата, а пакеты, пришедшие не по порядку — переупорядочиваются, чтобы все было как надо — надежно и по порядку.
Проблема заключается в том, что когда TCP таким образом “синхронизирует” поток данных, в случае потери пакета передача останавливается до тех пор, пока потерянный пакет не будет отправлен заново (и получен адресатом). Если во время ожидания придут новые данные, они будут поставлены в очередь, и вы не сможете прочитать их, пока не дойдет тот самый потерянный пакет. Сколько времени занимает посылка пакета заново? Она занимает как минимум время, равное времени прохождения пакета туда и обратно (когда TCP определяет, какой пакет надо отправить заново), плюс время на повторную доставку потерянного пакета. Так что, если пинг между компьютерами составляет 125 мс, повторная передача пакета займет примерно одну пятую секунды, а в худшем случае — до полсекунды (представьте, если вдруг заново отправленный пакет тоже потеряется). Веселуха!
Почему никогда не стоит использовать TCP для многопользовательских игр
Проблема с использованием TCP в сетевых играх заключается в том, что, в отличие от браузеров, электронной почты и прочих приложений, игры завязаны на взаимодействии в реальном времени. Для многих аспектов игры, например, нажатых пользователем клавиш и положения игроков в игре, неважно, что происходило секунду назад, а важно только наиболее актуальное состояние игрового мира.
Рассмотрим простой пример многопользовательской игры, например, 3d-шутер. Сетевая часть в игре построена очень просто: каждую итерацию цикла игры клиент посылает на сервер описание всех действий игрока (нажатые клавиши, положение мыши и т.п.), и каждую итерацию сервер обрабатывает эти данные, обновляет модель игрового мира и посылает обратно клиенту текущие позиции объектов мира, чтобы тот отрисовал игроку новый кадр.
Итак, в нашей игре, если пакет будет потерян при передаче по сети, игра останавливается и ждет, пока пакет не будет доставлен заново. На клиентской стороне игровые объекты замирают, и на сервере игроки также не могут двигаться или стрелять, так как сервер не может принимать новые пакеты. Когда потерянный пакет наконец доходит, в нем содержится уже устаревшая информация, которая уже является неактуальной. К тому же после этого приходят и все те пакеты, которые накопились в очереди за время ожидания, и их всех нужно обработать за одну итерацию цикла. Полная неразбериха!
К сожалению, изменить такое поведение TCP никак нельзя, да и не надо, так как в нем и заключается смысл TCP. Это — необходимость, чтобы сделать передачу данных через интернет надежным и последовательным потоком данных.
Но нам не нужен надежный и последовательный поток данных.
Нам нужно, чтобы данные доходили от клиента к серверу как можно быстрее, и мы не хотим ждать повторной отправки данных.
Вот почему никогда не следует использовать TCP для многопользовательских игр.
Но подождите! Почему я не могу использовать и UDP, и TCP вместе?
Для игровых данных реального времени, например, нажатий пользователя и состояния игрового мира, важны только наиболее актуальные данные, но для других типов данных, например, наборов команд, пересылаемых от одного компьютера к другому, надежность и последовательность канала может быть очень важна.
Конечно, велико искушение использовать UDP для передачи данных пользовательского ввода и состояния мира, а TCP — для тех данных, которые должны быть гарантированно доставлены. Возможно, вы даже думаете, что можно сделать несколько “потоков” команд — например, один для загрузки уровней, другой — для команд AI. Вы думаете: “Мне не нужно, чтобы команды AI ждали в очереди, если потеряется пакет с данными для загрузки уровня, ведь они же совершенно не связаны!”. В данном случае вы правы, и вы можете решить создать по TCP сокету на каждый поток команд.
На первый взгляд, это отличная идея. Но проблема в том, что раз TCP и UDP оба работают поверх IP, пакеты обоих протоколов будут влиять друг на друга — уже на уровне IP. Как конкретно будет проявляться это влияние — очень сложный вопрос, и связан он с механизмами обеспечения надежности в TCP. Но, в любом случае, знайте, что использование TCP обычно приводит к увеличению потерь UDP пакетов. Если хотите узнать об этом больше, можете прочитать вот эту статью.
Заключение
Я рекомендую не просто использовать UDP, но и использовать только UDP и больше ничего. Не используйте TCP и UDP вместе — вместо этого лучше узнайте, как реализовать те “фишки” TCP, которые вам нужны, самостоятельно, на основе UDP.
В следующих статьях я расскажу, как это сделать — от реализации собственного протокола с использованием соединений на основе UDP, до реализации обеспечения надежности передачи и контроля потока данных.
Скорости киберспорта: какой интернет нужен геймеру
Считается, что успешным киберспортсменом не стать без мощного компьютера и высокоскоростного интернета. Какие скорости нужны современному геймеру на самом деле, можно ли играть по Wi-Fi и почему игроки боятся пинга?
Почему важен провайдер
Онлайн-игры зачастую не требуют мощного компьютера, однако для комфортной игры нужно качественное соединение. Именно поэтому покупка игрового ПК бессмысленна без выбора хорошего провайдера, который обеспечит широкий и надежный канал в Сеть. Только в полноценной «связке» геймер сможет получить удовольствие от цифровых развлечений.
Особенно важен широкий канал, если игрок стримит свои приключения на YouTube или Twitch. Трансляция видео высокого качества может занять до 20 Мбит/сек от общего потока. Поэтому геймерам рекомендуется выбирать тарифы, на которых скорость интернет-соединения будет минимум 100 Мбит/сек.
На сегодня такие тарифы широко распространены в крупных городах. Более того, провайдеры наращивают количество подключений через GPON, где скорости максимальны. Например, Ростелеком предлагает пользователям специальный тарифный план «Игровой», который предусматривает подключение через оптику на скорости 200 Мбит/сек.
Подключение через GPON для геймеров на сегодня можно назвать оптимальным. В среднестатистической современной квартире десятки устройств с выходом в интернет. Родственники могут смотреть фильмы или качать сериалы по интернету именно в момент онлайн-игры пользователя, именно поэтому нужен запас по скорости.
При этом для каждого мобильного устройства требуется канал шириной минимум 5 Мбит/сек. Кстати, современные оптические терминалы позволяют «держать» одновременно более 30 активных подключений без каких-либо последствий для локальной сети. Оптика — гарантия того, что геймер будет «рубиться» в игры с максимальным комфортом.
Какой интернет бывает
Доступ через Ethernet. Самый распространенный на сегодня вариант. Его используют для подключения компьютера к интернету напрямую или через Wi-Fi-роутер. Скорость передачи данных через витую пару — до 100 Мбит/сек. Подключиться можно только при наличии широкополосного интернета в доме абонента.
Подключение через GPON. Это современная технология доступа в Сеть через персональную оптоволоконную линию. Она проводится от оборудования провайдера непосредственно в квартиру абонента, нужен оптический терминал. Такой тип соединения обеспечивает максимальную скорость передачи данных до 1 Гб/сек.
Подключение через ADSL. Устаревший на сегодня тип соединения, для которого требуется телефонная линия. Максимальная пропускная способность линии составляет до 24 Мбит/сек, при этом нагрузка на линию распределяется асимметрично — исходящее соединение обычно намного медленнее, порядка 1,4 Мбит/сек.
Доступ через мобильную сеть. В России операторы работают в сетях 2G, 3G и 4G, что позволяет передавать данные на скорости до 100 Мбит/сек. Мобильный интернет по сравнению с проводным подключением имеет ряд ограничений — многие провайдеры ограничивают объем ежемесячно скачиваемой информации. Кроме того, его стоимость выше проводного.
Зачем нужен минимальный пинг
Одна из самых популярных онлайн-игр Dota 2 запустится даже на «древнем» компьютере с процессором Intel Dual Core 2.4 GHz и видеокартой Nvidia GeForce 7600, однако комфортная игра на достаточно высоком уровне все равно потребует качественного широкополосного интернета — для геймеров важно отсутствие пинга.
Пинг в максимально простом представлении — промежуток времени, за который пакет, отосланный с компьютера пользователя, проходит через Сеть до другого компьютера и обратно. Чем выше пинг, тем больше время ожидания, необходимое для действия в онлайн-игре. Полученная задержка обычно измеряется в миллисекундах.
Российский прогеймер и капитан сборной России по StarCraft 2 Никита «SKillous» Гуревич считает этот параметр важнейшим для качественной игры онлайн. «Общая стабильность интернета крайне важна для геймера — нужно, чтобы соединение длительное время работало без сильных изменений в своих характеристиках», — рассказывает он.
При этом Гуревич развеял миф про невозможность профессионально играть через Wi-Fi. Считается, что такой способ соединения не может сравниться по стабильности с классическим проводом. «С уверенностью могу заявить, что играть по Wi-Fi очень удобно. Главное, что бы у геймера был современный роутер», — подчеркнул игрок.
Как клиенты онлайн-игр могут так быстро обмениваться данными через интернет?
давайте представим себе очень простую игру. У нас есть лабиринт и два игрока пытаются найти выход в режиме реального времени через интернет.
на каждом шаге клиент игры должен отправлять координаты игрока на сервер и принимать текущие координаты другого клиента. Как можно сделать этот обмен так быстро (как это делают все современные игры).
Ok, мы можем использовать memcache или аналогичную технологию для уменьшения операций интеллектуального анализа данных на стороне сервера. Мы также можем использовать самый быстрый веб-сервер etc., но у нас все равно будут проблемы с таймингами.
- какой протокол обычно используют игровые клиенты для обмена информацией с сервером?
- какие серверные технологии подходят для решения этой проблемы?
- какие алгоритмы применяются для борьбы с задержками во время игры и т. д.
3 ответов
обычно с сетевой интерполяцией и предсказанием. Gamedev-хороший ресурс:http://www.gamedev.net/reference/list.asp?categoryid=30
- используйте UDP, а не TCP
- используйте пользовательский протокол, обычно один байт, определяющий “команду”, и как можно меньше последующих байтов, содержащих аргументы команды
- прогнозирование используется, чтобы сделать движения других игроков кажутся гладкими без необходимости получать обновление для каждого кадра
подсказка: предсказание используется в любом случае, чтобы сгладить быстрое обновление экрана (
60fps), так как фактическая скорость игры обычно медленнее (
другие ответы не изложили пару важных заблуждений в исходном сообщении, а именно, что эти игры не являются веб-сайтами и работают совсем по-другому. В частности:
- нет или мало “данных”, которые должен чтобы ускорить процесс. Самый быстрый онлайн игры (например. шутеры от первого лица ) как правило, не сохраняют ничего диск во время матча. Медленнее онлайн игры, такие как MMOs, могут использовать база данных, прежде всего для хранения информация об игроке, но для большинства часть они держат их игрок и данные по Мира в памяти, не на диске.
- Они не используют web-сервер. HTTP относительно медленный протокол, и даже TCP самостоятельно может быть слишком медленно для некоторых игр. Вместо этого они есть на заказ серверы, которые написаны только для этой конкретной игры. Часто эти серверы настроены на низкую задержку, а не пропускную способность, потому что они обычно не обслуживают большие документы, как веб-сервер, но много крошечных сообщений (например. измеряется в байтах, а не килобайты.)
с этими двумя проблемами, охваченными, ваша проблема скорости в значительной степени уходит. Вы можете отправить сообщение на сервер и получить ответ менее чем за 100 мс и сделать это несколько раз в секунду.
Риски открытия портов маршрутизатора для игры в онлайн и как этого избежать
В некоторых случаях для правильной работы программы или игры требуется, чтобы на маршрутизаторе были открыты определенные порты, чтобы они были доступны из Интернета. Однако по возможности рекомендуется держать порты закрытыми. Киберпреступники сканируют порты на предмет уязвимостей и способов проведения атак. Случается так, что иногда, чтобы использовать программу или играть в сети, нам нужно открыть порты. Здесь мы объясним, насколько опасно открывать порты маршрутизатора для игры в сети, а также, в случае, если мы должны это сделать, как мы должны это делать.
Когда мы говорим о транспортном уровне модели TCP / IP, мы должны иметь в виду два типа протоколов: TCP и UDP. Оба могут использоваться при открытии портов.
Как открывать порты и зачем их открывать?
Первое, что нам нужно сделать, чтобы открыть порты маршрутизатора для игры, или что нам нужно, это узнать IP-адрес нашего маршрутизатора. Мы сделаем это с помощью окна командной строки, набрав эту команду:
Затем появится экран, на котором Шлюз по умолчанию это IP нашего роутера.
Затем мы записываем его в интернет-браузере и вводим свой логин и пароль для входа в конфигурацию роутера. Затем мы ищем раздел, который обычно называется NAT, виртуальный сервер или перенаправление портов.
Следующим шагом будет указать порт, который мы хотим использовать, и протокол, который он использует, TCP или UDP, о которых мы говорили ранее. Также следует добавить локальный IP-адрес оборудования. Если вам нужны более подробные сведения, вы объяснили, как открыть порты TCP / UDP любого роутера .
Что касается наиболее типичных причин, по которым требуется открыть порты маршрутизатора для воспроизведения или использования приложений, они обычно связаны с одним из следующих:
- Пользователи консольных игр, которые жалуются, что у них строгий NAT, что мешает им играть хорошо из-за одного или нескольких портов.
- Использование программ P2P, таких как Torrent или Emule.
- Чтобы использовать дома FTP, SSH или VPN-сервер, необходимо получить к ним доступ из Интернета.
Опасно ли открывать порты роутера для игры?
Что касается открытия неиспользуемого порта, это может быть опасно, тем более что в любой момент уязвимая служба может прослушивать этот порт, поэтому мы будем разоблачены. Это не так просто, как открыть первый порт, который приходит в голову. Еще одно важное соображение – мы должны открывать как можно меньше портов. В поисковых системах, таких как Shodan, вы можете видеть открытые порты различных служб, и он даже может сказать нам, есть ли служба, работающая за этим портом.
В этом смысле, открывая порты маршрутизатора для игр или программ, мы должны убедиться, что диапазон как можно меньше. Чем меньше возможностей атаковать мы даем киберпреступникам, тем в большей безопасности мы будем.
Также следует отметить, что есть некоторые критические порты, которые мы не должны использовать, если мы не собираемся использовать эту службу. Все порты, которые мы помещаем ниже, являются общими для разных протоколов, в целях безопасности рекомендуется изменить их как можно скорее и не использовать порты по умолчанию.
- Порт 21 используется протоколом FTP и для создания серверов этого типа.
- Порт 22, используемый протоколом SSH для удаленного управления компьютерами.
- Порт 23, используемый протоколом Telnet для удаленного доступа.
- Порты 80 и 443, которые следует закрыть, если у нас нет веб-сервера.
Вот еще опасные порты TCP и UDP и как мы можем защитить себя. Эти порты, которые мы вам показали, являются самыми простыми и первыми, которые проверяет киберпреступник. Поэтому, если мы заблокируем все, кроме тех, которые используются и нужны нам, у нас будет очень защищенная система. Помните, что если у нас есть открытый порт, это может быть первым шагом к вторжению.
Проверить открытые порты онлайн
Еще один важный момент обзор – это программное обеспечение, которое мы установили . В этом смысле, операционная система без последних обновлений делает нас более уязвимыми . Беспокоит тот факт, что многие люди до сих пор используют Windows 7 и XP, хотя они давно не поддерживаются. Еще один важный фактор – это наш маршрутизатор , который должен иметь обновленная прошивка . Кроме того, старый маршрутизатор, который не обновлялся в течение многих лет, также может оставить нас незащищенными.
Первое, что нам нужно, прежде чем начать проверку портов, – это узнать наш общедоступный IP-адрес. Для этого воспользуемся сайтом what-es-mi-ip.net и нажав на ссылку, мы сможем узнать наш IP.
Далее пора проверить открытые порты на вашем роутере. Для этого воспользуемся сайтом теста скорости. Там у них естьтест порта чтобы быстро и легко проверить это онлайн.
После загрузки сети мы помещаем наш общедоступный IP-адрес и устанавливаем порт или порты, которые хотим проверить. Этот инструмент позволяет вам проверять диапазоны портов, а также порты, разделенные запятыми. Наконец, вот мои результаты, в которых вы можете видеть, что порты 21, 22 и 23, о которых мы говорили ранее, закрыты, что является хорошей новостью.
Как вы видели, открытие портов на маршрутизаторе несет в себе угрозу безопасности, если за нами стоит уязвимая служба или если мы открываем неиспользуемый порт, потому что в будущем приложение может использовать его и быть уязвимым. В мире кибербезопасности первое, что пентестеры будут тестировать и проверять, – это открытые порты на определенной цели, чтобы попытаться использовать уязвимость в сервисах, стоящих за ней.
Как понизить пинг в играх. Часть 1
Читатель с критическим мышлением взглянет на заголовок статьи и скажет, опять очередная подборка сто тысяч раз виденных советов по настройке реестра в Windows и в какой-то мере будет прав. Просматривая наиболее топовые статьи по теме “как понизить пинг”, в глаза так и бросается массовое заблуждение и перепечатывание одних и тех же рекомендаций, которые вообще повлиять на него в играх ну ни как не смогут.
Пинг — больная тема всех любителей онлайн-игр. И реальность такова, что понизить его своими силами в играх, получится не у всех и даже не у каждого второго. Как один из бесплатных и доступных способов, попытаться снять нагрузку со своего оборудования и переложить ее на оборудование провайдера, тем самым убрав задержки при склеивании фрагментированных пакетов. Возможно это и понизит пинг, но узнать можно только экспериментальным путем.
Как это сделать? Читаем ниже.
Как понизить пинг в играх, только настройками в ОС
Природа появления его бывает трех видов:
1) Локальная проблема у пользователя
Сюда входят:
- неправильное конфигурирование операционной системы в сетевой части
- вирусы
- кривые параметры в игре или программе
- проблема с конфигурированием или производительностью “железа” (3G-модема, сетевой платы, роутера и прочее).
2) Проблема из-за оборудования провайдера
Грубо говоря сюда входит маршрутизатор, который стоит в подъезде, линии тянущиеся от него или каналы связи до самого провайдера и коммутаторымаршрутизаторы и прочие железки, пропускающие весь трафик абонентов на вышестоящих провайдеров.
3) Проблемы с транспортом, с вышестоящим провайдером и конечным сервером.
Если со вторым и третьим пунктом чаще всего бороться можно только одним способом. Сменой поставщика услуг. То вот в первом варианте можно попытаться сделать все зависящее от нас, чтобы пакеты бежали как можно быстрее и на полных парусах до сервера, не испытывая ненужных задержек.
Доводилось вам слышать такие слова, как UDP и TCP? И вероятно знаете, что это вышестоящие протоколы расположенного над IP?
В интернете очень много статей, как понизить пинг средствами ОС. И подавляющее большинство из них описывает настройки в реестре и предлагает добавить TcpAckFrequency или TCPNoDelay или еще какие-то параметры. Т.е. описываются параметры TCP (которые в играх практически не используются и на ping ни как не влияют), а по факту нужны настройки для UDP-протокола. Эта путаница, мягкого с теплым и не понимание, приводит к тому, что у читателей появляется разочарование после применения данных советов. В играх ничего не меняется по сетевой задержке.
Для наглядности привожу перечень наиболее популярных игр, с запросом про пинг и мы посмотрим какой протокол они используют у себя:
Игра | Протокол |
Counter-Strike: Global Offsence (CS: GO) | udp |
Counter-Strike 1.6 | udp |
World Of Tanks (WoT) | udptcp |
Warface | udptcp |
Dota 2 | udp |
Grand Theft Auto (GTA) | udptcp |
Counter-Strike Source v34 | udp |
World of Warcraft (WoW) | udptcp |
Как видно из примера, все популярные игры завязаны на один протокол. И это не просто совпадение. (Присутствие TCP, во все не говорит о том, что для игровых ситуаций он используется. Чаще всего TCP задействуют только для обновлений, лаунчеров и передачи информации с гарантированной доставкой.)
Разработчики намеренно используют User Datagram Protocol для многопользовательских игр, так как он позволяет наиболее точно и максимально быстро передавать данные о нажатии клавиш, положений персонажа в игровом мире и передаче прочих данных, требующих самого актуального состояния.
К слову, этот протокол не идеален. Если потеряется пакет и он не будет продублирован, то в игре это будет лаг. У него имеется множество минусов на первый взгляд , но это только на первый. Разработчики знают его сильные стороны и именно его выбирают в сетевой части для многопользовательских игр.
На него можно хоть как то повлиять либо в самой игре, либо настройкой MTU в ОС. В играх обычно используются консольные команды типа ratecl_cmdratecl_updaterate или еще какие-то аналоги.
Теперь самый важный момент в статье!! Вам нужно подобрать правильный параметр IP MTU и держать его в уме, при изменении сетевых значений в игре. Подбирается он так:
Пуск – выполнить – cmd
ping yandex.ru -f -l 1500
уменьшайте значение до тех пор, пока пакет пройдет не фрагментированным. И пингуйте сервер, на котором собираетесь играть.
Как только определили максимальный размер пересылаемых данных, прописываем или добавляем в реестре
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesTcpipParametersInterfacesкод_адаптера
параметр MTU (reg_dword) равный нашему значению и +28. Т.е. если значение было 1422, то прописать нужно 1450.
Почему +28? Это из-за разных протоколов, ping использует ICMP, а мы настраиваем IP.
И после того, как вы подобрали нужный размер MTU, внесли данные в реестр, перезагрузили компьютер. Только тогда можно приступать к настройке сетевой части в самой игре, чтобы понизить ping.
Фрагментирование может влиять на пинг в игре
Почему важно избавиться от фрагментации на уровне ОС? Имеет она свои минусы и очень существенные:
- Сервер должен получить все фрагменты, чтобы собрать пакет целиком. Если хоть один будет утерян, считайте что вы получите лаг в игре.
- Фрагментация приводит к нагрузке на процессоры транзитных маршрутизаторов и конечного сервера. Если несколько сотен пользователей, на осаде замка например, будут так нагружать сервер, лаги почувствуют все из-за нагрузки на сам сервер.
- Увеличивается требование к памяти маршрутизаторов, так как он должен хранить все фрагменты, пока пакет не будет дальше собран и отправлен. Если с этим проблемы у него, это увеличивает пинг или появляются лаги
- Часто фрагментирование выполняют медленные процессоры, отсюда появляется задержка
- Есть еще минусы, которые так же могут добавлять ping в игре
И в заключении, что нужно прописывать и для какой игры и другие способы как повлиять на сетевую задержку, будет рассмотрено в следующих статьях. (третья и четвертая части)
Надеюсь чуть-чуть внес ясности в тему, как понизить пинг своими силами и вы узнали, что повлиять на UDP-пакеты настраивая только параметры TCP – нельзя. Но можно настроить сетевую карту особым образом, чтобы еще понизить пинг и отгрызть драгоценные миллисекунды! Эта интересная тема будет раскрыта в следующей статье (вторая часть).