Архивный файл — это не просто «сжатый контейнер», а сложная структура данных, организованная по определенным правилам. Понимание внутренней архитектуры архива (например, форматов ZIP, RAR, 7z, TAR) критически важно для разработчиков ПО, специалистов по восстановлению данных, системных администраторов и всех, кто работает с большими объемами информации. В этой статье мы подробно разберем, из каких частей состоит файл архива, зачем они нужны и как они взаимодействуют друг с другом.
Общая концепция: Архив как файловая система в файле
Как отмечается в теоретических источниках, архив — это файл-контейнер, который хранит в упакованном виде другие файлы (один или несколько), сохраняя их атрибуты и, часто, структуру каталогов. При необходимости эти файлы могут быть извлечены в первоначальной форме. Внутри архива реализуется логическая структура, аналогичная файловой системе диска: есть «оглавление» (каталог), сами данные файлов и служебные метаданные.
Ключевое определение: Архивный файл — это специальным образом организованный файл, содержащий в себе один или несколько файлов в сжатом или несжатом виде и служебную информацию об именах файлов, дате и времени их создания или модификации, размерах и т.п.
Три основных слоя структуры архива
Независимо от конкретного формата (ZIP, RAR, 7z), архитектуру любого современного архива можно разделить на три логических уровня:
- Глобальный заголовок (Signature / Magic Number) — идентифицирует формат файла.
- Локальные заголовки и сжатые данные (File Entries) — «тело» архива, где хранятся сами файлы.
- Центральная директория (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 в конце) | Да (идеально для потоков) |
Практическое значение понимания структуры
- Восстановление поврежденных архивов: Зная, где находится EOCD (ZIP) или Main Header (RAR), можно вручную (hex-редактором) или скриптами «починить» обрезанный файл, восстановить Central Directory или извлечь данные, игнорируя битый индекс.
- Оптимизация доступа: При работе с огромными архивами (терабайты) на медленных носителях (облако, лента) критично наличие Central Directory в конце (ZIP, 7z) для мгновенного листинга без скачивания всего файла. TAR.gz и Solid RAR требуют чтения от начала до конца для получения списка файлов.
- Безопасность (Zip Slip, Path Traversal): Парсеры архивов должны строго валидировать имена файлов в локальных заголовках и Центральной директории (проверять на `../`, абсолютные пути, симлинки), чтобы не выйти за пределы целевой папки при распаковке.
- Форензика и стеганография: В Extra Fields, комментариях к архиву, полях выравнивания (padding) между блоками или в неиспользуемых битах флагов можно скрывать данные.
- Кроссплатформенность: Правильная запись 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) и предоставленных справочных материалов.