begin_end
18.08.2012, 01:39
[COLOR="Red"]Сетевой протокол Quake 3
Опубликовано 29 ноября 2011Автор: Darren (http://www.tilion.org.uk/)
Этот документ описывает сетевой протокол, который 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\s naps\40\rate\10000\model\doom/red\name\UnnamaedPlayer\protocol\68\qport\\challen ge\
представляет собой номер локального порта, используемого для передачи этого пакета.
Если подключение успешно, сервер ответит следующим образом:
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
Опубликовано 29 ноября 2011Автор: Darren (http://www.tilion.org.uk/)
Этот документ описывает сетевой протокол, который 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\s naps\40\rate\10000\model\doom/red\name\UnnamaedPlayer\protocol\68\qport\\challen ge\
представляет собой номер локального порта, используемого для передачи этого пакета.
Если подключение успешно, сервер ответит следующим образом:
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