HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ИНФО > Статьи
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 18.08.2012, 01:39
begin_end
Участник форума
Регистрация: 04.01.2007
Сообщений: 178
С нами: 10184006

Репутация: 1362
По умолчанию

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

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


Этот документ описывает сетевой протокол, который 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
 
Ответить с цитированием
 



Предыдущая тема Следующая тема

Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.