Структура архивного файла и его основные компоненты

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

Архивный файл — это не просто «сжатый контейнер», а сложная структура данных, организованная по определенным правилам. Понимание внутренней архитектуры архива (например, форматов ZIP, RAR, 7z, TAR) критически важно для разработчиков ПО, специалистов по восстановлению данных, системных администраторов и всех, кто работает с большими объемами информации. В этой статье мы подробно разберем, из каких частей состоит файл архива, зачем они нужны и как они взаимодействуют друг с другом.

Общая концепция: Архив как файловая система в файле

Как отмечается в теоретических источниках, архив — это файл-контейнер, который хранит в упакованном виде другие файлы (один или несколько), сохраняя их атрибуты и, часто, структуру каталогов. При необходимости эти файлы могут быть извлечены в первоначальной форме. Внутри архива реализуется логическая структура, аналогичная файловой системе диска: есть «оглавление» (каталог), сами данные файлов и служебные метаданные.

Ключевое определение: Архивный файл — это специальным образом организованный файл, содержащий в себе один или несколько файлов в сжатом или несжатом виде и служебную информацию об именах файлов, дате и времени их создания или модификации, размерах и т.п.

Три основных слоя структуры архива

Независимо от конкретного формата (ZIP, RAR, 7z), архитектуру любого современного архива можно разделить на три логических уровня:

  1. Глобальный заголовок (Signature / Magic Number) — идентифицирует формат файла.
  2. Локальные заголовки и сжатые данные (File Entries) — «тело» архива, где хранятся сами файлы.
  3. Центральная директория (Central Directory / Metadata Index), «оглавление» для быстрого доступа.

Глобальная сигнатура (Magic Bytes)

Первые байты файла (обычно 2–8 байт) служат уникальным идентификатором формата. Это позволяет программам-архиваторам и операционным системам определить тип файла без анализа расширения.

  • ZIP: PK (Local File Header) или PK (End of Central Directory).
  • RAR: Rar! (RAR 4.x) или Rar! (RAR 5.x).
  • 7z: 7z¼¯'.
  • GZIP: ‹.
  • TAR: Не имеет фиксированной сигнатуры в начале (определяется по структуре блоков по 512 байт).

Локальный заголовок файла (Local File Header) и Данные

Для каждого файла, включенного в архив, создается своя запись. Она состоит из заголовка и сразу следующих за ним сжатых (или сохраненных «как есть») данных.

Состав локального заголовка (на примере ZIP):

  • Сигнатура локального заголовка (4 байта): 0x04034b50.
  • Версия для распаковки: минимальная версия архиватора, необходимая для извлечения.
  • Общие флаги (General Purpose Bit Flag): биты, указывающие на шифрование, использование UTF-8 для имен, наличие дескриптора данных и т.д.
  • Метод сжатия (Compression Method): 0 (Store — без сжатия), 8 (Deflate), 12 (BZIP2), 14 (LZMA), 93 (PPMd) и др.
  • Время и дата последней модификации (в формате MS-DOS или расширенном).
  • CRC-32: контрольная сумма несжатых данных для проверки целостности.
  • Сжатый размер (Compressed Size) и Несжатый размер (Uncompressed Size).
  • Длина имени файла и Длина поля доп. данных (Extra Field).
  • Имя файла (File Name): относительный путь внутри архива (с сохранением структуры папок).
  • Extra Field: расширенные метаданные (NTFS timestamps, Unix permissions, ZIP64 extended info, комментарии).

Важно: В формате ZIP данные файла записываются сразу после его локального заголовка. Это позволяет читать архив последовательно (streaming), не прыгая по файлу.

Дескриптор данных (Data Descriptor) — опционально

Если при создании архива размеры файла и CRC-32 неизвестны заранее (например, при потоковой записи из stdin), в локальном заголовке ставятся нули, а после сжатых данных дописывается Data Descriptor (сигнатура 0x08074b50 + CRC-32 + Compressed Size + Uncompressed Size).

Центральная директория (Central Directory) — «Мозг» архива

Это, пожалуй, самая важная часть для производительности. Она находится, как правило, в конце файла (перед концовкой). Центральная директория содержит массив записей — по одной на каждый файл в архиве — дублирующих и расширяющих информацию из локальных заголовков.

Зачем нужна Центральная директория?

  • Мгновенное открытие: Программа-архиватор считывает только конец файла, находит Центральную директорию и сразу строит дерево файлов, не сканируя весь архив.
  • Служебная информация: Здесь хранятся атрибуты, которых нет в локальном заголовке: внешние атрибуты файла (External File Attributes, права доступа Unix, атрибуты Windows: ReadOnly, Hidden, System, Directory), смещение локального заголовка (Relative Offset of Local Header) для быстрого перехода к данным.
  • Комментарий к архиву: Текстовое описание всего архива.

Завершающая запись Центральной директории (End of Central Directory Record — EOCD)

Это «якорь» в самом конце файла. Архиватор ищет его, сканируя файл с конца в поисках сигнатуры 0x06054b50.

  • Номер текущего диска (для многотомных архивов).
  • Номер диска, где начинается Центральная директория.
  • Количество записей в Центральной директории на этом диске / всего.
  • Размер Центральной директории (в байтах).
  • Смещение Центральной директории относительно начала архива.
  • Длина и текст комментария к архиву.

ZIP64: Для архивов > 4 ГБ или с > 65535 файлами используются расширенные записи (ZIP64 End of Central Directory Record и Locator), так как стандартные поля 32-битны.

Специфика популярных форматов

RAR (Roshal Archive)

Структура RAR принципиально отличается от ZIP. Это блочный формат. Архив представляет собой последовательность блоков (Main Header, File Headers, Service Blocks, Recovery Record, End Marker).

  • Main Header: Информация об архиве (версия, тип, флаги шифрования, пароль, Recovery Record).
  • File Headers: Метаданные каждого файла (имя, размер, атрибуты, хеш BLAKE2/CRC32, словарь сжатия). В RAR 5.x заголовки файлов могут быть сжаты.
  • Service Blocks: Блоки восстановления (Recovery Record), блоки аутентификации, блоки сервисной информации.
  • End Marker: Признак конца архива.

Особенность: В RAR нет единой «центральной директории» в конце. Оглавление размазано по файлу (или собрано в специальный блок), что делает чтение с конца сложнее, но позволяет эффективно реализовывать сплошное сжатие (solid compression) и восстановление поврежденных томов.

7z (7-Zip)

Один из самых гибких и современных форматов. Использует открытую архитектуру с плагинами кодеков.

  • Signature Header: 32 байта (сигнатура, версия, CRC заголовка, размер следующего заголовка).
  • Packed Streams (Сжатые потоки): Собственно данные файлов, сжатые выбранным алгоритмом (LZMA2, PPMd, Brotli и др.). Могут быть зашифрованы (AES-256).
  • Header (Metadata): Структура архива (дерево папок, имена, размеры, хеши SHA-256, методы сжатия). Заголовок может быть сжат и зашифрован.
  • Encoded Header Info: Информация о том, как закодирован заголовок.

В 7z метаданные часто находятся в конце (как в ZIP), но могут быть и в начале.

TAR (Tape Archive) + сжатие (.tar.gz, .tar.xz)

TAR — это не формат сжатия, а формат контейнеризации (архивации). Он просто склеивает файлы последовательно.

  • Структура: Последовательность блоков по 512 байт.
  • Каждый файл = Заголовок (512 байт, содержит имя, режим, владелец, размер, время, тип, контрольную сумму заголовка) + Данные (выровнены до 512 байт) + Два нулевых блока в конце архива.
  • Сжатие применяется после создания TAR (gzip, bzip2, xz, zstd). Поэтому .tar.gz, это сжатый поток, в котором нельзя быстро получить список файлов без полной распаковки (нет центральной директории).

Дополнительные критически важные части

Записи восстановления (Recovery Record / Recovery Volumes)

Присутствуют в RAR (Recovery Record), PAR/PAR2 (отдельные файлы), опционально в ZIP (через Zipx/WinRar extensions). Это избыточные коды коррекции ошибок (Reed-Solomon), позволяющие восстановить поврежденные части архива. В RAR 5.x Recovery Record может быть встроен в основной файл или вынесен в отдельные тома (.rev).

Шифрование и аутентификация

  • ZIP (Legacy): Слабое шифрование ZipCrypto (уязвимо к атаке известного открытого текста).
  • ZIP (AE-1 / AE-2): AES-128/192/256 + HMAC-SHA1 для проверки целостности пароля и данных.
  • RAR 5.x: AES-256 в режиме CBC + PBKDF2 (HMAC-SHA256) для ключа + BLAKE2sp для проверки целостности файлов.
  • 7z: AES-256 + SHA-256 (ключ из пароля через много итераций).

При шифровении структура меняется: добавляются соли (salt), вектор инициализации (IV), теги аутентификации (MAC), а сами сжатые данные заменяются на зашифрованные.

Многотомные (Split) архивы

Большие архивы разбиваются на части (volumes): .zip, .z01, .z02... или .part1.rar, .part2.rar;...

  • ZIP: Каждая часть — валидный ZIP-файл со своей Центральной директорией (кроме последней, где полная) или только с данными (Spanned ZIP).
  • RAR: Единая структура, разорванная на границе блоков. Первый том содержит Main Header, последний — End Marker. Распаковка возможна только начиная с первого тома.

Extra Fields (Расширенные поля) — скрытая сила ZIP

В локальном заголовке и Центральной директории ZIP существуют Extra Fields (поле Extra Field). Это механизм расширяемости. Самые важные теги (Header ID):

ID (Hex) Название Назначение
0x0001 ZIP64 Extended Information Поддержка файлов > 4 ГБ, архивов > 4 ГБ, > 65535 файлов.
0x000A NTFS File Times Точное время (100-нс интервалы с 1601 года): Created, Modified, Accessed.
0x5455 Extended Timestamp (Info-ZIP) Unix-время (UTC): mtime, atime, ctime с наносекундами.
0x5855 Info-ZIP Unix Extra Field UID, GID владельца файла.
0x7075 Unix Permissions Права доступа (mode), тип файла (симлинк, блок-устройство и т.д.).
0x9901 AES Encryption Extra Field Параметры шифрования AES (длина ключа, метод проверки).

Сравнительная таблица структуры

Компонент ZIP RAR (v5) 7z TAR (+gz)
Сигнатура формата В начале каждого локального заголовка + в конце (EOCD) В начале файла (Main Header) В начале файла (32 байта) Нет (определение по структуре блоков 512б)
Метаданные файлов Локальный заголовок (перед данными) + Центральная директория (в конце) File Headers (перед данными каждого файла/блока) Централизованный Header (обычно в конце, сжат/зашифрован) Заголовок 512б перед каждым файлом
Оглавление (Index) Центральная директория (в конце) Размазано / Service Block Header (в конце) Отсутствует (последовательный доступ)
Сплошное сжатие (Solid) Нет (каждый файл сжат отдельно) Да (опционально, по умолчанию) Да (опционально) Да (весь tar-поток сжимается целиком)
Восстановление данных Редко (расширения) Встроено (Recovery Record / Volumes) Нет (внутри формата) Нет (внешние инструменты PAR2)
Потоковая запись Да (с Data Descriptor) Ограничено Сложно (нужен Header в конце) Да (идеально для потоков)

Практическое значение понимания структуры

  1. Восстановление поврежденных архивов: Зная, где находится EOCD (ZIP) или Main Header (RAR), можно вручную (hex-редактором) или скриптами «починить» обрезанный файл, восстановить Central Directory или извлечь данные, игнорируя битый индекс.
  2. Оптимизация доступа: При работе с огромными архивами (терабайты) на медленных носителях (облако, лента) критично наличие Central Directory в конце (ZIP, 7z) для мгновенного листинга без скачивания всего файла. TAR.gz и Solid RAR требуют чтения от начала до конца для получения списка файлов.
  3. Безопасность (Zip Slip, Path Traversal): Парсеры архивов должны строго валидировать имена файлов в локальных заголовках и Центральной директории (проверять на `../`, абсолютные пути, симлинки), чтобы не выйти за пределы целевой папки при распаковке.
  4. Форензика и стеганография: В Extra Fields, комментариях к архиву, полях выравнивания (padding) между блоками или в неиспользуемых битах флагов можно скрывать данные.
  5. Кроссплатформенность: Правильная запись Extra Fields (NTFS times, Unix UID/GID/Permissions) гарантирует, что при распаковке на Linux/Windows/macOS сохраняются атрибуты, время и права доступа.

Файл архива — это не «черный ящик», а строго определенная структура данных. Его основные части — сигнатура формата, заголовки файлов (локальные), сжатые потоки данных, центральная директория (оглавление) и завершающая запись — работают в связке, обеспечивая компромисс между скоростью создания, скоростью чтения, степенью сжатия и надежностью.

Выбор формата (ZIP для совместимости и случайного доступа, RAR для надежности и сжатия, 7z для максимального сжатия и открытости, TAR+Zstd для скорости и Unix-прав) должен диктоваться задачей, но понимание их внутреннего устройства позволяет использовать их максимально эффективно и безопасно.


Статья подготовлена на основе общих спецификаций форматов (PKWARE APPNOTE для ZIP, RAR 5.0 Format Specification, 7z Format Specification, POSIX.1-2001 для TAR) и предоставленных справочных материалов.