Что делать и кто виноват при ошибке связи
Итак, давно пора расставить все точки над i и ответить на самые волнующие вопросы.
Ошибка связи - что это и с чем ее едят.
Тем, кому посчастливилось лицезреть зайца с проводами непомерно клянут на чем свет стоит разработчиков приложения :)
Однако все ли так на самом деле?
Для начала нужно понять - чем отличаются разные типы игр. Традиционно принято считать само приложение, которое открывается у Вас в браузере - "клиентом", а обработчики событий игры, которые находятся на нашей стороне - "сервером". В разных типах игры взаимодействие клиент-сервер является различным.
Типы игры "Заработай фишки" и "Рейтинг" являются "событийной моделью" - взаимодействие происходит в момент события (нажали на стакан - ушел запрос на сервер - пришел ответ от сервера - запрос завершен - клиент обработал и выбросил фишки, как пример). То есть броски, старт игр и прочее.
Тип игры "Играй с друзьями" является "постоянной моделью". В момент старта игры и Ваш клиент и клиент соперника подключается на определенный канал сервера и остается соединен с ним до конца игры, все события проходят через эти каналы.
Какие проблемы могут подстерегать в "событийных играх" - в определенные моменты (оооочень редко) сервер может испытывать перегрузки, если на него падает слишком много событий (в обычном режиме мы обрабатываем порядка 40-120 запросов в секунду per server).
Самая частая ошибка - в случае, если сервер долго не отвечает, клиент считает, что сервер умер и надо бы его потыкать палочкой. И делает запрос ещё раз. В этот момент сервер обрабатывает первый запрос, и, искренне надеясь на честность клиента, отдает ему результаты. Тут прилетает второй запрос. Сервер долго чешет репку - что ему прислал клиент, и, не найдя слов (приличных), вываливает ошибку. Это совсем не страшно - все игры "событийного типа" можно восстановить.
Самая частая ошибка в "постоянной" модели - прерывание соединения между одним из игроков. Тут уже чешет репку клиент соперника - что же ему вообще прилетело. Ну, и разумеется, из-за плохой связи ошибки выше тоже имеют место быть. Это тоже не страшно - специально для этого и придумали восстановление игры.
Виноваты ли в этом разработчики? На 2% да. Есть тут и часть наших багов, которые мы периодически исправляем. В 98% виновата плохая связь.
И тут мы подходим к самому главному заблуждению, которое уверенно используют 99% игроков, искренне считая себя правыми. "Но ведь остальные приложения работают, вашу мать, это ваше, мля мля мля глючит!!! Все уроды!!!". Нет, нет и ещё раз нет. У каждого приложения есть свои игровые сервера, которые стоят на технических площадках в разных странах и городах. Если у Вашего провайдера отличная связность с Германией, но плохая с Нидерландами - у Вас будут прекрасно работать игры, расположенные на DE серверах и безбожно тормозить игры на Нидерландских.
Самое глубокое убеждение пользователей - у меня тариф 10 Мбит, значит отовсюду все должно качаться и не тормозить. Скорость ответа сервера зависит от очень многих факторов, но основной из них является маршрут до сервера.
Если кратко рассматривать как происходит запрос на сервер - то все очень просто. Все обращения в сети идут по IP-адресу сервера (это уникальный адрес сервера в сети - так же как и у Вас есть свой город, улица, дом, корпус и квартира).
Первоначально Ваш компьютер спрашивает у специального DNS сервера (сервер доменных имен) IP-адрес сервера - например - скажи где "живет" сервер с названием "www.сервер_игры.net" ? В ответ он получает IP-адрес - например 46.57.68.79
После этого компьютер через сеть провайдера обращается к данному ip-адресу. Но, нельзя забывать, что практически никогда мы не можем обратиться к серверу напрямую, наш запрос идет через т.н. "транзитные узлы".
Образно говоря.
Я ищу мой игровой сервер (Юлю), чтобы сделать запрос.
Мой провайдер говорит - первый транзитный узел Вася.
Я иду к Васе - "Вась, слышь чо, а где Юлька?" - "Я не знаю. Но знает Коля".
"Коль, скажи плиз, где Юля" - "Спроси у Маши, она последняя ее видела"
"Маша, привет, Юлька где? Коля сказал ты знаешь" - "Агааааа. В кафехе она".
"Юля, твою ж дивизию, где ты ходишь???" - запрос дошел до сервера.
Это самое яркое представление маршрута до сервера с Вашего компьютера. Все отлично. При таком раскладе игра тормозить не будет. Но что произойдет, если Вася будет говорить по телефону и попросит подождать, Коля уйдет на обед, а Машу припрет подумать в одиночестве в туалете?
Разумеется маршрут будет прокладываться с задержкой. Разумеется, будут ошибки связи. Виноваты ли мы в них? Ответ один - НЕТ.
Как можно узнать, есть ли на Вашей стороне ошибки связи с нашими серверами. (Наши сервера располагаются в Праге, Чехия).
Для windows - Пуск - Выполнить - в появившемся окне набираете cmd - открывается командная строка.
Для висты и 7 - Пуск - В окошке где написано "Начать поиск" набираете cmd - щелкаете на программе появившейся в меню - открывается командная строка.
Для линуксоидов - Бородатые сами знают, что вписать в консоли)
Вводите первую команду -
ping 94.198.240.231
Получаете время ответа сервера - то есть то время, за которое сигнал сбегал за пивом запросом и вернулся. Чем меньше - тем лучше. До 100 мс - нормально. До 300 - терпимо. Больше 500 - есть смысл позвонить провайдеру с вопросом "А чочо я вам бабло плачу, а пинг до Чехии дерьмо?", или вообще его сменить от греха подальше)
tracert 94.198.240.231 для виндоус©
traceroute 94.198.240.231 для линуксоидов
Получаете нумерованный список - сколько транзитных узлов обошел запрос Вася, прежде чем нашел свой сервер. В миллисекундах опять же время до каждого узла - чем меньше - тем круче.
Если в списке больше 15 узлов - есть повод насторожиться по поводу провайдера. Долбайте лучше их - толку будет больше.
В качестве примера я приведу показания с 2 разных провайдеров одного города Санкт-Петербурга (это для тех, кто любит покричать что все работает).
Итак, провайдер бизнес-центра.
local# ping 94.198.240.231
PING 94.198.240.231 (94.198.240.231): 56 data bytes
64 bytes from 94.198.240.231: icmp_seq=0 ttl=58 time=45.493 ms
64 bytes from 94.198.240.231: icmp_seq=1 ttl=58 time=44.733 ms
64 bytes from 94.198.240.231: icmp_seq=2 ttl=58 time=45.001 ms
Пинг 44-45 ms, для соединения между странами - ну будем считать все хорошо.
local# traceroute 94.198.240.231
traceroute to 94.198.240.231 (94.198.240.231), 64 hops max, 40 byte packets
1 192.168.20.1 (192.168.20.1) 0.380 ms 0.322 ms 0.314 ms
Пришли на роутер
2 85-114-24-129.obit.ru (85.114.24.129) 2.591 ms 1.204 ms 0.915 ms
3 vi-x-x-068.76-1.spb.obit.ru (85.114.28.5) 1.846 ms 15.125 ms 1.882 ms
4 te2-13-010.BRC4.spb.obit.ru (85.114.0.2) 2.058 ms 2.934 ms 2.139 ms
Отправились в Чехию
5 gw-interfiber.fra.obit.ru (217.79.3.177) 51.190 ms 51.269 ms 50.310 ms
Пришли на Французскую точку обмена трафиком
6 in-gw80GE-2nd-floor-upl-interfiber.upl.cz (78.108.176.38) 52.332 ms 46.091 ms 50.338 ms
Пришли на сервер
7 94.198.240.231 (94.198.240.231) 44.415 ms 47.177 ms 41.416 ms
В принципе, все показатели в норме, все работает прекрасно, 7 "хоп"ов в списке.
Провайдер Билайн, домашний интернет.
C:\Users\Root>ping 94.198.240.231
Обмен пакетами с 94.198.240.231 по с 32 байтами данных:
Ответ от 94.198.240.231: число байт=32 время=79мс TTL=51
Ответ от 94.198.240.231: число байт=32 время=80мс TTL=51
Ответ от 94.198.240.231: число байт=32 время=83мс TTL=51
Пинг уже 79-83 ms. Нормально для "событийных" игр, но в "постоянных" могут быть ошибки.
C:\Users\Root>tracert 94.198.240.231
Трассировка маршрута к zonk [94.198.240.231]
с максимальным числом прыжков 30:
1 1 ms 1 ms 1 ms my.router [192.168.1.1] - пришли на wi-fi )
2 * * * Превышен интервал ожидания для запроса.
3 2 ms 2 ms 2 ms 89.179.21.10
4 2 ms 2 ms 2 ms spb-195-190-110-61.sovintel.ru [195.190.110.61]
5 37 ms 37 ms 37 ms cat04.spb.gldn.net [195.190.127.5] - дошли до точки обмена трафиком
6 13 ms 13 ms 13 ms mx01.Stockholm.gldn.net [62.141.76.225] - пришли в Стокгольм О_о
7 105 ms 58 ms 61 ms mx01.Frankfurt.gldn.net [194.186.80.233] - Франкфурт
8 95 ms 93 ms * cat2-ancotel-de.interfiber.cz [80.81.194.36] - Из Германии в Чехию
9 92 ms 91 ms 95 ms in-gw80GE-2nd-floor-upl-interfiber.upl.cz [78.108.176.38]
10 96 ms 94 ms 97 ms zonk [94.198.240.231] - пришли на сервер.
В принципе, все показатели чуть хуже нормы, все работает стабильно, 10 "хоп"ов в списке.
Событийки будут играть хорошо, а вот в постоянных есть риск.
И уж конечно стоит вспомнить эпический маршрут Караганда-сервер, когда сигнал шел по маршруту Караганда-Астана-Москва(4000 километров расстояния!)-Франкфурт-Прага.
Так вот о чем это я - прежде чем кричать, что разработчики дураки - проверьте связь.