[COLOR="White"]
Сетевой протокол Quake 3
Опубликовано 29 ноября 2011
Этот документ описывает сетевой протокол, который
Quake 3 использует для общения с клиентами и внешним миром (серверами запросов). В настоящее время в стадии разработки.
Я в последнее время (август 2012) добавил запись в блоге с пересмотренной версией моего протокола
43 (прокси-сервер).
Запрос
Запросить сервер очень просто. Отправляется
UDP пакет с 4 байтным заголовком (
0xffffffff) и текстовой строкой
GetStatus. Есть много сайтов, которые содержат подробное описание, так что я не буду вдаваться в подробности.
Игровой протокол 68 – в версии 1.32
Все игровые пакеты –
UDP, но есть еще процессы «обмена рукопожатиями», которые должны произойти до того, как вы получите право присоединиться к серверу.
Клиент посылает запрос на получение идентификатора (иногда вам нужно отправить несколько запросов, прежде чем сервер среагирует).
Если сервер способен принимать новые подключения, он ответит.
После этого клиент имеет и может отправить запрос на подключение. Но, увы: является
Хаффман-упакованным в протоколе
68 и НЕ является открытым текстом, как показано ниже. Протокол
43 использует текстовую версию.
представляет собой строку, содержащую детальные параметры подключеняи игрока, например:
Код:
\cg_predictItems\1\sex\male\handicap\100\color\3\snaps\40\rate\10000\model\doom/red\name\UnnamaedPlayer\protocol\68\qport\\challenge\
представляет собой номер локального порта, используемого для передачи этого пакета.
Если подключение успешно, сервер ответит следующим образом:
Сервер поставит вас в
CNCT (подключающееся) состояние и начнет отправлять вам обновления игры.
Вот где комуникация значительно усложняется, поэтому я предупреждаю вас, что следующее может быть неполным и, возможно, неправильно – хотя я надеюсь, что это не так!
Клиент – серверу
Команды клиента
Код:
0 - clc_bad
1 - clc_nop
2 - clc_move
3 - clc_moveNoDelta
4 - clc_clientCommand
5 - clc_EOF
Сервер – клиенту
Команды сервера
Код:
0 - svc_bad
1 - svc_nop
2 - svc_gamestate
3 - svc_configstring
4 - svc_baseline
5 - svc_serverCommand
6 - svc_download
7 - svc_snapshot
8 - svc_EOF
Подробности
(1) -
сжатие Хаффмана с использованием заданного набора узлов для дальнейшего сокращения длины сообщения (подробности см. ниже).
(2) -
XOR алгоритм, используемый сервером для декодирования содержимого сообщения.
Код:
#define CL_ENCODE_START 12
byte key, *string;
int i, index;
string = (byte *)clc.serverCommands[ reliableAcknowledge & (MAX_RELIABLE_COMMANDS-1) ];
index = 0;
//
key = clc.challenge ^ serverId ^ messageAcknowledge;
for (i = CL_ENCODE_START; i cursize; i++) {
// modify the key with the last received now acknowledged server command
if (!string[index]) {
index = 0;
}
if (string[index] > 127 || string[index] == '%') {
key ^= '.' data + i) = (*(msg->data + i)) ^ key;
}
(3) -
XOR алгоритм, используемый клиентом для декодирования содержимого сообщения.
[I]
Замечания
Данные имеют смешанный порядок следования байт, это верно?
Фрагментация пакетов работает с помощью расчета
sequencetNumber и
FRAGMENT_BIT (где
FRAGMENT_BIT это [FONT="Courier New"]1