В онлайн-матчах достаточно остро стоит вопрос с хостами, с чем связана масса проблем различного характера. Для одних на определенном хосте всё шикарно, другие же мучаются из-за так называемых спайков и прочих неудобств вроде невозможности зайти в игру. На мой взгляд, кому-нибудь будет интересны технические особенности, стоящие за суровой действительностью интернета, о чем собственно и пойдет речь.
Для начала стоит сказать об общей организации. Связь между двумя конечными пользователями осуществляется через несколько машин, в простонародье именуемых роутерами. Самый близкий пользователю - тот, которым заведует его родной провайдер, через него и гуляют все данные, предназначенные для других пользователей. Роутеры же шлют эти данные дальше согласно их таблице маршрутизации, где описано, к какой машине следует отправить очередной пакет по конечному адресу получателя. В большинстве случаев эти роутеры соединены между собой весьма толстыми и качественными каналами связи, что сводит к минимуму задержки и потери данных. При этом стараются подбирать оптимальные маршруты, исходя из качества и стабильности связи отдельных путей, а также их пропускной способности и загруженности. В данной системе наиболее узким зачастую является подключение именно к своему провайдеру, но не исключены и проблемы между вышеупомянутыми роутерами.
Далее есть такая штука, как пинг. Многим известно, что пинги характеризуют задержку между определенным действием и откликом сервера на это действие. Собственно, пинг - это время, за которое пакет определенного размера (обычно в 32 байта, но Windows позволяет гонять пинги размером до 65000 байт) доходит до сервера и возвращается обратно. Выходит, что по этому определению пинг от первого пользователя до второго абсолютно идентичен тому же пингу от второго до первого - в обоих случаях пакет пробегает туда и обратно. При этом пинги обязательно проверяются относительно какого-либо другого пользователя - фраза "у меня пинг 50" сама по себе смысла не имеет никакого.
Перейдем теперь к нашим реалиям - то бишь, хостам в GGArena. Для тех, кто вовсю пользуется этим клиентом, не станет новостью тот факт, что определенные хосты без различного шаманства с туннелями и антиспайками просто не видны. С чем это связано технически, я сказать затрудняюсь, это ведомо только разработчикам самого клиента, но факт есть факт. Впрочем, дальнейшие рассуждения основаны лишь на личных наблюдениях и какими-либо конкретными вещами вроде кода сетевой работы клиента не подтверждены. Но при особом желании описанные вещи можно опробовать на практике, и результат должен быть тем же.
Для того, чтобы частично избежать проблемы с нерадивыми хостами, в клиенте есть такая фича, как туннели. Так как непосредственное соединение между двумя пользователями через стандартный маршрут затруднено, вполне логично попробовать использовать посредника, до которого у обоих из игроков соединение идет без проблем. Что, по-видимому, и лежит в основе механизма работы туннеля - вместо того, чтобы гонять пакеты по нерадивому маршруту, они идут сначала к третьему лицу, после чего заворачивают туда, куда им и следовало. Какие эффекты сопутствуют такому подходу?
1. Товарищ N о такой подлости не подозревает (никто же не видел сообщения "внимание, через вас запущен GGC-туннель"?), и прием-отправка пакетов между вышеупомянутыми игроками поедает и его трафик.
2. Качество соединения Товарища N оказывает непосредственное влияние на игру. Если его лагает - куда пойдут пакеты? А они будут "ждать", пока маршрут не наладится вновь. Если туннелей несколько (а их обычно 3 штуки), то есть альтернативные пути. Если же он единственный - получаем лаги.
3. Держим в голове тот факт, что Товарищ N ничего не знает, и он, вдоволь нагонявшись в Warcraft, идет гулять/спать/отдыхать, выключая GGAren'у, да и весь компьютер тоже (это необязательно). Возвращаемся к той ситуации, когда маршрута для пакетов нет - получаем столь любимый всеми дисконнект с кучей криков в стиле "почини инет" и "тебя диск, виноват ты".
4. Туннели периодически пропадают по неизведанным причинам. Возможно, это связано с тем, что еще один человек пытается найти маршрут до нашего хоста, и туннель перекидывается на него, возможно, что-то другое. Но факт - связь рвется, и до перезагрузки клиента обоими сторонами игроки друг друга не видят.
Какие из всего этого можно сделать заключения. Если до какого-либо хоста у вас "крест" или красный пинг, то для стабильной игры в комнате нужно некоторое количество народу, которые при других обстоятельствах были бы неплохим хостом для соответствующего игрока. При этом этот самый народ должен оставаться в комнате до конца матча. В какой-то мере это выполняется в комнатах с большим количеством игроков, вроде ACL, что не особо способствует удобному проведению матчей между командами, так как в комнате банально "шумно". А если играть в комнате без сторонних лиц, выходит, что нужны хосты с соединением до обоих игроков.
Еще одна ситуация, которая иногда вызывает споры - это влияние зрителей, в простонародье обсерверов, на задержки в игре. Что творится в сети в данном случае, попробую описать ниже.
Собственно, начнем с того, кто же есть на самом деле хост и зачем он нужен.
Хост (сервер) - это машина, с которой устанавливает соединение каждый из присутствующих клиентов в игре. При этом соединения между самими клиентами отсутствуют полностью - "общение" данными идет исключительно через сервер. И тут возникает следующая проблема. Если клиентов слишком много, а канал сервера не справляется с раздачей данных каждому из них, у всех (и игроков, и обсерверов) начинается дикое подтормаживание. При этом пинг до игроков может быть минимален, но пакеты им отправить просто трудно из-за их большого количества. Лечится эта ситуация либо расширением канала сервера, что всегда затруднительно, либо оставлением всех жаждущих наблюдать кровавую зарубу двух игроков за бортом. При этом наличие зрителей никоим образом не сказывается на пинге между игроком и сервером, и при соответствующей ширине канала толпы фанатов мешать игре не будут. Естесственно, если не брать в расчет случаи с убогим соединением самих зрителей, что приводит к их периодическим дисконнектам, а в особо приятных случаях - обсбагам, когда выход одного зрителя по неизведанной пока никому причине вызывает выход одного из игроков.
Продолжая тему со зрителями, один раз я даже столкнулся с мнением, что их количество влияет на загрузку процессора компьтера игроков. Честно говоря, не знаю, что могли написать программисты из Blizzard такого, что наличие зрителей в игре требует обсчета со стороны игрока, но точно могу сказать, что такое решение крайне нелогично и нормальные люди так программы не пишут. Да и что такого игрок "считает" за зрителя, что это превышает загрузку от расчетов на отображение 3д-объектов и алгоритмов по поведению юнитов.
Вот такой ликбез. Надеюсь, кому-нибудь он будет полезен, а если я где ошибаюсь - с радостью выслушаю правильную версию.
|