Master Server Query Protocol

From Valve Developer Community
< Ru
Jump to navigation Jump to search
English (en)Русский (ru)Translate (Translate)

На этой странице документируется протокол запросов к главному серверу Steam. Старый мастер-сервер по-прежнему используется более старыми играми и модами, но все текущие игры и моды запрашивают мастер-сервер непосредственно через Steam.

От клиента к мастер серверу

Отправьте следующий UDP-запрос на главный сервер, чтобы получить список серверов Source.

Формат

Тип Поле Значение
Byte(en) Message Type Символ '1' (0x31)
Byte(en) Region Code См. ниже
String Zero(en) IP:Port См. ниже
String Zero(en) Filter См. ниже

Региональные коды

Регион мира, в котором вы хотите найти серверы.

Байт Комментарий
0x00 Восточное побережье США
0x01 Западное побережье США
0x02 Южная Америка
0x03 Европа
0x04 Азия
0x05 Австралия
0x06 Ближний Восток
0x07 Африка
0xFF Остальной мир (Океания)

IP:Port

Первый IP:Port, который вы должны послать это "0.0.0.0:0".

С этого момента IP:Port становится последним IP:Port, полученным в ответе главного сервера. Это позволяет затем захватить другой список дополнительных серверов. Закончите её с нуль-терминированной строкой (0x00)

Обратите внимание, что всякий раз, когда вы открываете новый сокет (и таким образом получаете новый случайный клиентский порт), Мастер-сервер всегда будет посылать вам первую партию IP-адресов, даже если вы пропустили действительный IP-адрес игрового сервера. Не закрывайте сокет между пакетами.

Filter

Позволяет ограничить результаты на серверах, на которых запущена определённая игра, карта и т. д. Вставить \ между параметрами фильтра

Код фильтра Что возвращает фильтр
0x00 (NULL, пустая строка) Все сервера
\nor\[x] Специальный фильтр, указывает, что серверы, соответствующие любым из следующих условий [x] не должны возвращаться
\nand\[x] Специальный фильтр, указывает, что серверы, соответствующие всем из следующих условий [x], не должны возвращаться
\dedicated\1 Выделенные сервера
\secure\1 Серверы, использующие технологию анти-читов (VAC, но потенциально и другие).
\gamedir\[mod] Серверы с указанной модификацией (например, tf)
\map\[map] Серверы, работающие с указанной картой (например, ctf_2fort).
\linux\1 Серверы, работающие на платформе Linux
\password\0 Серверы, которые не защищены не паролем
\empty\1 Серверы, которые не пустые
\full\1 Серверы, которые не полные
\proxy\1 Серверы, являющиеся прокси-серверами
\appid\[appid] Серверы, на которых запущена игра [appid]
\napp\[appid] Серверы, на которых НЕ запущена игра [appid] (Это было введено для блокирования левых 4 мертвых игр из браузера парового сервера).
\noplayers\1 Серверы на которых нет игроков
\white\1 Серверы внесённые в белый список
\gametype\[tag,...] Серверы со всеми тегами, которые перечислены в запросе, которые находятся в sv_tags
\gamedata\[tag,...] Серверы со всеми тегами, которые перечислены в запросе, в 'скрытых' тегах (L4D2)
\gamedataor\[tag,...] Серверы с любыми тегами, которые перечислены в запросе, в 'скрытых' тегах (L4D2)
\name_match\[hostname] Серверы с совпадающим именем хоста [hostname] (можно использовать '*' в качестве wildcard)
\version_match\[version] Серверы с запущенной версией [version] (может использовать '*' в качестве wildcard)
\collapse_addr_hash\1 Возвращать только один сервер для каждого уникального IP-адреса
\gameaddr\[ip] Возвращать только сервера с указанным IP-адресом (можно указать порт, он поддерживается и необязателен)

Пример запроса

Получить все сервера отовсюду:

0000   31 FF 30 2E 30 2E 30 2E    1.0.0.0.
0008   30 3A 30 00 00             0:0..

Это стандартный запрос браузера сервера Steam к Source Master Server. Он использует \napp\ фильтр для отфильтровывания игр Left 4 Dead Left 4 Dead (которые предназначены для объединения с помощью функции матчмейкинга).

31 ff 30 2e 30 2e 30 2e 30 3a 30 00 5c 6e 61 70  1.0.0.0.0:0.\nap
70 5c 35 30 30 00                                p\500.

Формат ответа

Ответ всегда начинается с FF FF FF 66 0A.

Формат представляет собой серию блоков адресов этих серверов:

Тип Данные
Byte(en) Первый октет IP-адреса
Byte(en) Второй октет IP-адреса
Byte(en) Третий октет IP-адреса
Byte(en) Четвёртый октет IP-адреса
Unsigned Short(en) Номер порта — обычно 27015 (69 87) — это network ordered, который отличается от всех других протоколов Steam.

Некоторые из серверов могут быть недоступны, поэтому запросите каждый сервер напрямую, чтобы выяснить это.

Note.pngПримечание:Обратите внимание, что этот список не является исчерпывающим, поэтому, если вы ищете определённый тип сервера, убедитесь, что вы указали фильтр с запросом, а не фильтрацию с клиентской стороны.

Конец списка IP-адресов

Полный запрошенный список IP-адресов может не поместиться в 1 пакет. Последующие пакеты должны быть запрошены с использованием последнего полученного IP-адреса и порта в качестве seed в следующем запросе.

Конец списка IP-адресов обозначается полученным IP-адресом 0.0.0.0. Порт: "0".

Игровой сервер к мастер серверу

Соединение

Вскоре после инициализации игрового сервера, он выбирает два главных сервера, чтобы "присоединиться". Для того чтобы клиенты увидели конкретный игровой сервер, когда они нажимают на вкладку "Интернет", игровой сервер должен присутствовать в записях мастер-серверов Steam.

Игровой сервер посылает каждому мастер серверу "q" (71).

Мастер сервер каждый раз отвечает посылая FF FF FF 73 0A, за которым следует уникальное 4-байтовое "challenge" число. Если вы отправите недействительный вызов мастер серверам, вы получите другой вызов в качестве ответа.

Ответ на вызов

После получения пакета "challenge" игровой сервер посылает свою информацию о вызове в следующем формате:

Note.pngПримечание:Номер "challenge" — это просто вызов, посланный мастер сервером, преобразованный в int

GoldSrc GoldSrc

002a                                 30 0a 5c 70 72 6f            0.\pro
0030   74 6f 63 6f 6c 5c 34 37 5c 63 68 61 6c 6c 65 6e  tocol\47\challen
0040   67 65 5c 31 33 33 39 38 39 35 37 30 32 5c 70 6c  ge\1339895702\pl
0050   61 79 65 72 73 5c 30 5c 6d 61 78 5c 32 5c 62 6f  ayers\0\max\2\bo
0060   74 73 5c 30 5c 67 61 6d 65 64 69 72 5c 63 73 74  ts\0\gamedir\cst
0070   72 69 6b 65 5c 6d 61 70 5c 64 65 5f 64 75 73 74  rike\map\de_dust
0080   5c 74 79 70 65 5c 64 5c 70 61 73 73 77 6f 72 64  \type\d\password
0090   5c 30 5c 6f 73 5c 6c 5c 73 65 63 75 72 65 5c 30  \0\os\l\secure\0
00a0   5c 6c 61 6e 5c 30 5c 76 65 72 73 69 6f 6e 5c 31  \lan\0\version\1
00b0   2e 31 2e 32 2e 35 2f 53 74 64 69 6f 5c 72 65 67  .1.2.5/Stdio\reg
00c0   69 6f 6e 5c 32 35 35 5c 70 72 6f 64 75 63 74 5c  ion\255\product\
 00d0   63 73 74 72 69 6b 65 0a                          cstrike.

Source Source

002a                                 30 0a 5c 70 72 6f            0.\pro
0030   74 6f 63 6f 6c 5c 37 5c 63 68 61 6c 6c 65 6e 67  tocol\7\challeng
0040   65 5c 31 33 33 39 36 31 38 32 33 5c 70 6c 61 79  e\133961823\play
0050   65 72 73 5c 30 5c 6d 61 78 5c 32 5c 62 6f 74 73  ers\0\max\2\bots
0060   5c 30 5c 67 61 6d 65 64 69 72 5c 63 73 74 72 69  \0\gamedir\cstri
0070   6b 65 5c 6d 61 70 5c 64 65 5f 64 75 73 74 5c 70  ke\map\de_dust\p
0080   61 73 73 77 6f 72 64 5c 30 5c 6f 73 5c 6c 5c 6c  assword\0\os\l\l
0090   61 6e 5c 30 5c 72 65 67 69 6f 6e 5c 32 35 35 5c  an\0\region\255\
 00a0   74 79 70 65 5c 64 5c 73 65 63 75 72 65 5c 30 5c  type\d\secure\0\
 00b0   76 65 72 73 69 6f 6e 5c 31 2e 30 2e 30 2e 32 38  version\1.0.0.28
00c0   5c 70 72 6f 64 75 63 74 5c 63 73 74 72 69 6b 65  \product\cstrike
00d0   0a                                               .

Orangebox(en)

0000   30 0a 5c 70 72 6f 74 6f 63 6f 6c 5c 37 5c 63 68  0.\protocol\7\ch
0010   61 6c 6c 65 6e 67 65 5c 31 39 35 39 36 38 37 33  allenge\19596873
0020   39 39 5c 70 6c 61 79 65 72 73 5c 31 5c 6d 61 78  99\players\1\max
0030   5c 34 5c 62 6f 74 73 5c 30 5c 67 61 6d 65 64 69  \4\bots\0\gamedi
0040   72 5c 74 66 5c 6d 61 70 5c 61 72 65 6e 61 5f 62  r\tf\map\arena_b
0050   61 64 6c 61 6e 64 73 5c 70 61 73 73 77 6f 72 64  adlands\password
0060   5c 30 5c 6f 73 5c 77 5c 6c 61 6e 5c 31 5c 72 65  \0\os\w\lan\1\re
0070   67 69 6f 6e 5c 2d 31 5c 67 61 6d 65 74 79 70 65  gion\-1\gametype
0080   5c 61 72 65 6e 61 5c 74 79 70 65 5c 6c 5c 73 65  \arena\type\l\se
0090   63 75 72 65 5c 30 5c 76 65 72 73 69 6f 6e 5c 31  cure\0\version\1
00a0   2e 30 2e 34 2e 33 5c 70 72 6f 64 75 63 74 5c 74  .0.4.3\product\t
00b0   66 0a                                            f.

Различия

Порядок расположения полей в Source Source немного отличается от порядка расположения полей в GoldSrc GoldSrc.

Goldsource protocol challenge players max bots gamedir map type password os secure lan version region product
Source protocol challenge players max bots gamedir map password os lan region type secure version product

Heartbeat-сообщение

"Heartbeat" происходит каждые пять минут, чтобы дать знать мастер-серверам, что игровой сервер всё ещё "жив". Игровой сервер просто проходит через процесс "присоединения" к списку мастер-серверов снова.

Выход

Игровой сервер посылает главному серверу байты, чтобы сигнализировать, что игровой сервер выключился.

Движок Байты
GoldSrc 62 0A
Source 62 0A 00

Мастер сервера

Работающие:

Движок IP:Port
GoldSrc hl1master.steampowered.com:27010
Source hl2master.steampowered.com:27011

Реализации

  • Asynchronous Game Query Library Java 8 библиотека асинхронных игровых запросов на основе Netty
  • Steam Condenser(en) — многоязычная библиотека для запросов к игровым серверам Steam Community, Source и GoldSrc, а также к мастер-серверам Steam. В настоящее время она реализована на Java, PHP и Ruby.
  • Master Server Query Protocol/Parsing packet(en) — пример кода для разбора пакета (Visual Basic).
  • User:Pizzahut/msqp.php — пример кода для запроса мастер-сервера Half-Life Half-Life с использованием языка PHP.
  • QueryMaster C# library
  • vmsq Node.js implementation for querying master servers

См. также