ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Статьи (https://forum.antichat.xyz/forumdisplay.php?f=30)
-   -   Сетевой протокол Quake 3 (https://forum.antichat.xyz/showthread.php?t=347291)

begin_end 18.08.2012 01:39

[COLOR="White"]
Сетевой протокол Quake 3

Опубликовано 29 ноября 2011
Автор: Darren


Этот документ описывает сетевой протокол, который Quake 3 использует для общения с клиентами и внешним миром (серверами запросов). В настоящее время в стадии разработки.

Я в последнее время (август 2012) добавил запись в блоге с пересмотренной версией моего протокола 43 (прокси-сервер).

Запрос

Запросить сервер очень просто. Отправляется UDP пакет с 4 байтным заголовком (0xffffffff) и текстовой строкой GetStatus. Есть много сайтов, которые содержат подробное описание, так что я не буду вдаваться в подробности.

Игровой протокол 68 – в версии 1.32

Все игровые пакеты – UDP, но есть еще процессы «обмена рукопожатиями», которые должны произойти до того, как вы получите право присоединиться к серверу.

Клиент посылает запрос на получение идентификатора (иногда вам нужно отправить несколько запросов, прежде чем сервер среагирует).

http://w.ho.by/tmp/pub_q3proto/q3proto_img1.png

Если сервер способен принимать новые подключения, он ответит.

http://w.ho.by/tmp/pub_q3proto/q3proto_img2.png

После этого клиент имеет и может отправить запрос на подключение. Но, увы: является Хаффман-упакованным в протоколе 68 и НЕ является открытым текстом, как показано ниже. Протокол 43 использует текстовую версию.

http://w.ho.by/tmp/pub_q3proto/q3proto_img3.png

представляет собой строку, содержащую детальные параметры подключеняи игрока, например:

Код:

\cg_predictItems\1\sex\male\handicap\100\color\3\snaps\40\rate\10000\model\doom/red\name\UnnamaedPlayer\protocol\68\qport\\challenge\
представляет собой номер локального порта, используемого для передачи этого пакета.

Если подключение успешно, сервер ответит следующим образом:

http://w.ho.by/tmp/pub_q3proto/q3proto_img4.png

Сервер поставит вас в CNCT (подключающееся) состояние и начнет отправлять вам обновления игры.

Вот где комуникация значительно усложняется, поэтому я предупреждаю вас, что следующее может быть неполным и, возможно, неправильно – хотя я надеюсь, что это не так!

Клиент – серверу

http://w.ho.by/tmp/pub_q3proto/q3proto_img5.png

Команды клиента

Код:

0 - clc_bad
1 - clc_nop
2 - clc_move
3 - clc_moveNoDelta
4 - clc_clientCommand
5 - clc_EOF

Сервер – клиенту

http://w.ho.by/tmp/pub_q3proto/q3proto_img6.png

Команды сервера

Код:

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) - сжатие Хаффмана с использованием заданного набора узлов для дальнейшего сокращения длины сообщения (подробности см. ниже).

http://w.ho.by/tmp/pub_q3proto/q3proto_img7.png

(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

begin_end 18.08.2012 01:48

Данный материал выложен здесь с целью поиска аудитории, заинтересованной или опытной в указанных вопросах. Ежели кто-то работал с протоколом Quake3, разрабатывал ПО для него, просьба комментировать и дополнять. Необходима любая информация, так как официального опубликованного RFC в каком-либо виде нет. Этот материал, фактически все, что известно.

Один из важных моментов - разобраться с применением сжатия Хаффмана. Как и с чем его есть в этом случае, м.б. пример рабочего софта...


Авторы полезного контента будут щедро поощрены репутацией.

Hyde 19.08.2012 04:54

Спасибо, полезно!


Время: 14:33