Алгоритм работы клиентского автопатчера очень прост. Здесь я попытаюсь показать основные моменты работы алгоритма.

Структура

Чтобы настроить систему обновлений нужен веб-сервер, с быстрым каналом.
Структура папок выглядит следующим образом (это пример):
  • http://patch.server.ru/CPW/
    • info (http://patch.server.ru/CPW/info/)
      • pid (http://patch.server.ru/CPW/info/pid) — файл содержит число из клиентского файла pid.ini
    • launcher (http://patch.server.ru/CPW/launcher/)
      • version (http://patch.server.ru/CPW/launcher/version) — содержит число — текущую версию ланчера
      • files.md5 (http://patch.server.ru/CPW/launcher/files.md5) — содержит список файлов и их md5-сумму папки launcher клиента
    • patcher (http://patch.server.ru/CPW/patcher/)
      • version (http://patch.server.ru/CPW/patcher/version) — содержит число — текущую версию патчера
      • files.md5 (http://patch.server.ru/CPW/patcher/files.md5) — содержит список файлов и их md5-сумму папки patcher клиента
      • v-X.inc (http://patch.server.ru/CPW/patcher/v-X.inc) — например, v-3.inc, содержит список файлов, их md5-сумму и знак операции (+ — новый файл, ! — файл изменен). 3 — разница между текущей версией и версией клиента. т.е. если у клиента версия 78, а на сервере уже 85, то клиент будет качать файл v-7.inc
    • element (http://patch.server.ru/CPW/element/)
      • version (http://patch.server.ru/CPW/element/version) — содержит число — текущую версию элементов, та самая, что отображается в окне патчера
      • files.md5 (http://patch.server.ru/CPW/element/files.md5) — содержит список файлов и их md5-сумму папки element клиента
      • v-X.inc (http://patch.server.ru/CPW/element/v-X.inc) — например, v-3.inc, содержит список файлов, их md5-сумму и знак операции (+ — новый файл, ! — файл изменен). 3 — разница между текущей версией и версией клиента. т.е. если у клиента версия 78, а на сервере уже 85, то клиент будет качать файл v-7.inc

Каждый файл files.md5 и v-X.inc имеет внизу цифровую подпись (wikipedia).

Алгоритмы обновления

В клиенте ПВ два уровня обновления:
  1. launcher/launcher.exe — та мини-программа, которая лезет на сервер обновлений только для того, чтобы узнать не нужно ли обновлять patcher и себя;
  2. patcher/patcher.exe — основной патчер, он качает отдельные кусочки pck-файлов, карты, списки серверов, словом все, что находится в папке element.

Помимо этого, есть и два метода обновления
  1. Полная проверка. Рекомендуется делать когда есть какие-то проблемы с клиентом или он не синхронизирован с текущим;
  2. Регулярное обновление. Происходит в обычном случае.

Рассмотрим каждый метод более подробно.

Полная проверка

Для того, чтобы произошла полная проверка, нужно запустить клиент через launcher/FixIt.bat . После этого launcher/launcher.exe полностью обновит себя, содержимое своей папки (с помощью http://patch.server.ru/CPW/launcher/files.md5) и папки patcher (с помощью http://patch.server.ru/CPW/patcher/files.md5) (включая подпапки). Потом, как обычно, запустится patcher/patcher.exe .
Если клиент нажмет кнопку «Проверка», то patcher/patcher.exe скачает файл http://patch.server.ru/CPW/element/files.md5 и начнет проверять md5-сумму тех файлов, что перечислены там, с просчитанными суммами тех, что есть у клиента. Клиент скачает только отличающиеся и новые файлы. Если включен антивирус, то процесс займет продолжительное время.

С технической точки зрения процесс выглядит так:
  1. launcher/FixIt.bat запускает launcher/launcher.exe FullCheck, т.е. с параметром полной проверки
  2. launcher/launcher.exe скачивает http://patch.server.ru/CPW/info/pid и сравнивает с числом из pid.ini из patcher, если совпадают, то к следующему шагу, если нет — выдаст ошибку
  3. launcher/launcher.exe скачает файл http://patch.server.ru/CPW/launcher/files.md5, и поочередно проверит суммы всех файлов, скачает отличающиеся. Тоже самое проделает с файлом http://patch.server.ru/CPW/patcher/files.md5 и папкой patcher .
  4. запустится patcher/patcher.exe, после нажатия на «Проверку», патчер начнет качать большой файл http://patch.server.ru/CPW/element/files.md5 и будет сверять каждый файл, перечисленный там, с тем, который имеется у клиента и скачает отличающиеся.

Регулярное обновление

Обычное обновление не требует от игрока каких-то специфических действий, кроме как запуск игры через launcher/launcher.exe (как это происходит на оф-серверах). launcher/launcher.exe проверит свою версию, скачает новые/измененные файлы, если они есть, и запустит patcher/patcher.exe .
patcher/patcher.exe скачает файл http://patch.server.ru/CPW/element/version, если он отличается от версии клиента, то скачает http://patch.server.ru/CPW/element/v-X.inc, где X — разница версий и начнет проверять md5-сумму тех файлов, что перечислены там, с просчитанными суммами тех, что есть у клиента. Клиент скачает только отличающиеся и новые файлы. Если включен антивирус, то процесс займет продолжительное время.

С технической точки зрения процесс выглядит так:
  1. launcher/launcher.exe скачивает http://patch.server.ru/CPW/info/pid и сравнивает с числом из pid.ini из patcher, если совпадают, то к следующему шагу, если нет — выдаст ошибку
  2. launcher/launcher.exe скачивает http://patch.server.ru/CPW/launcher/version и сравнивает с клиентской версией launcher, если совпадают, то к следующему шагу, если нет — скачает именно файл http://patch.server.ru/CPW/launcher/files.md5, и поочередно проверит суммы всех файлов, скачает отличающиеся. После проделает тоже самое с http://patch.server.ru/CPW/patcher/version и http://patch.server.ru/CPW/patcher/v-X.md5, где X — разница версий и начнет проверять md5-сумму тех что перечислены там, с просчитанными суммами тех, что есть у клиента.
  3. запустится patcher/patcher.exe, и повторит все действия что и launcher/launcher.exe, только с http://patch.server.ru/CPW/element/version и http://patch.server.ru/CPW/element/v-X.md5, где X — разница версий и начнет проверять md5-сумму тех что перечислены там, с просчитанными суммами тех, что есть у клиента.

Структура файлов

Цифровая подпись нужна для аутентификации и валидации клиента. Поэтому, каждый файл подписан цифровой подписью длинной 173 символа, разбитую на три строки (через 64 символа).
Подпись генерируется для текста, который идет до надписи -----BEGIN ELEMENT SIGNATURE----- с помощью закрытого ключа, клиентские программы launcher/launcher.exe и patcher/patcher.exe проверяют ее с помощью открытого ключа, который зашит у них в коде (его необходимо заменить на свой при установке, иначе первая же валидация не пройдет).

Пример файла v-X.inc
# 128 129 10561111
!cb06039aebcb7f132f525e19bcb110c6 /Y29uZmlncw==/YmFkd29yZHMudHh0
!54b52a31aee9302ac04ff2f2d1071add /ZGF0YQ==/Z3Nob3AuZGF0YQ==
+23ef97776d85a98116d52a8dd7268a46 YXV0b2FkdmFuY2Vtb3VudGFpbjIuaHRm
!d052f2a05f4c55a75571b682a233caf7 YXV0b2FkdmFuY2Vtb3VudGFpbjIuc3Rm
!09263a66781cc03f4b975bc594ccda46 YXV0b2FkdmFuY2Vyb2FkLmh0Zg==
!d09d971b029c258507816f6735abd5fc aWNvbmxpc3RfZ3VpbGQudHh0
-----BEGIN ELEMENT SIGNATURE-----
EKQk4dgIM6pHBdQ5UtRagdL3WQWrGhSWawIUWDDyGILOdWpoNPNiH/s2/QaAV7dx
NOqIJMIgkId/dpDtm3jcILEkKFX8MERpSrnZi/urgFHNIHUVsCUyGAKchI6AAZMo
LXYtUttCjCMxpkUHsTdxVlObCWt7dcOyT1M63vMwLuA=

Первая строка: версия клиента, версия на сервере и размер обновления в байтах. Все пишется через пробел, вналаче строки идет знак диез (решетка) — #.

Далее список файлов. Каждая строка состоит из операции (! — обновить файл, + — добавить), md5-суммы, и пути файла. Путь файла преобразован с помощью base64, при том, что каждое имя папки или файла преобразуется отдельно, слеши преобразуются в дефисы, чтобы не было коллизий. Т.е. файл /Y29uZmlncw==/YmFkd29yZHMudHh0 равносилен файлу configs/badwords.txt.
Исходя из предыдущего примера понятно, что каждый pck-архив должен быть распакован.

Каждый файл папки element (либо launcher, либо patcher) расположен по адресу http://patch.server.ru/CPW/element/element/ (либо http://patch.server.ru/CPW/launcher/launcher/, либо http://patch.server.ru/CPW/patcher/patcher/), т.е. файл /Y29uZmlncw==/YmFkd29yZHMudHh0 находится http://patch.server.ru/CPW/element/element/Y29uZmlncw==/YmFkd29yZHMudHh0.
Если путь начинается со слеша, то это значит, что путь файлу лежит от корня директории (element, launcher или patcher), если не начинается со слеша, то файл лежит в предыдущей директории. Т.е. файл /ZGF0YQ==/Z3Nob3AuZGF0YQ== находится по адресу http://patch.server.ru/CPW/element/element/ZGF0YQ==/Z3Nob3AuZGF0YQ==, так же как и следующий за ним файл YXV0b2FkdmFuY2Vtb3VudGFpbjIuaHRm (http://patch.server.ru/CPW/element/element/ZGF0YQ==/YXV0b2FkdmFuY2Vtb3VudGFpbjIuaHRm).

Далее идет строка -----BEGIN ELEMENT SIGNATURE-----.
После нее начинается подпись.

Анализировать файлы files.md5 нет смысла. Там отсутствует номер клиентской версии, и знаки операций.

Last edited Jul 5, 2010 at 3:24 AM by gouranga, version 9

Comments

No comments yet.