Архивный файл (или просто архив), это специальным образом организованный файл-контейнер, содержащий в себе один или несколько файлов в сжатом или несжатом виде, а также служебную информацию, необходимую для их идентификации, извлечения и проверки целостности. Понимание внутренней структуры архива критически важно для разработчиков ПО, специалистов по восстановлению данных и системных администраторов.
Несмотря на разнообразие форматов (ZIP, RAR, 7z, TAR, ARJ и др.), большинство современных архивов имеют общую логическую архитектуру, состоящую из нескольких ключевых частей.
Глобальная структура: Локальные заголовки, Данные и Центральный каталог
Классический пример — формат ZIP (и его производные: JAR, APK, DOCX, XPI). Его структура наглядно демонстрирует разделение на три основные зоны:
- Локальные файловые заголовки (Local File Headers) + Сжатые данные: Это «тело» архива. Для каждого файла хранится его заголовок, сразу за которым следуют сжатые (или сохраненные «как есть») данные этого файла. Это позволяет читать архив последовательно (streaming), не загружая его целиком в память.
- Центральный каталог (Central Directory): Находится, как правило, в конце файла. Это «оглавление» архива. Он содержит метаданные всех файлов: полные пути, атрибуты, CRC32 контрольные суммы, смещения (offsets) до локальных заголовков, методы сжатия и размеры; Именно центральный каталог позволяет архиваторам мгновенно показывать содержимое архива без его полного сканирования.
- Запись конца центрального каталога (End of Central Directory Record ⏤ EOCD): Последняя структура в файле. Указывает на начало центрального каталога, общее количество записей, размер каталога и комментарий к архиву. Поиск этой сигнатуры (0x06054b50) — стандартный способ начала чтения ZIP-архива.
Детальная анатомия части архива (на примере одного входящего файла)
Каждый файл внутри архива представлен набором связанных структур. Рассмотрим их детально:
А. Локальный заголовок файла (Local File Header)
Располагается непосредственно перед данными файла. Содержит минимально необходимый набор для извлечения «на лету»:
- Сигнатура (Signature): Магическое число (для ZIP —
0x04034b50), идентифицирующее начало записи. - Версия для извлечения: Минимальная версия архиватора, необходимая для распаковки.
- Общие флаги (General Purpose Bit Flag): Битовая маска: шифрование, использование Data Descriptor, кодировка имен (UTF-8) и др.
- Метод сжатия (Compression Method): 0 — Store (без сжатия), 8 — Deflate, 12, BZIP2, 14, LZMA, 93 — Zstandard (Zstd) и др.
- Время и дата последней модификации (Last Mod Time/Date): В формате MS-DOS (или расширенные таймстемпы в Extra Field).
- CRC-32: Контрольная сумма несжатых данных для проверки целостности.
- Сжатый размер (Compressed Size) и Несжатый размер (Uncompressed Size): Если размеры превышают 4 ГБ (или неизвестны при потоковой записи), ставится 0xFFFFFFFF, а реальные значения ищутся в ZIP64 Extra Field или Data Descriptor.
- Длина имени файла (File Name Length) и Длина дополнительного поля (Extra Field Length).
- Имя файла (File Name): Относительный путь с разделителем
/. - Дополнительное поле (Extra Field): Расширяемая область для ZIP64 (большие файлы), расширенных таймстемпов (NTFS/Unix), прав доступа, NTFS ACL и пользовательских данных.
Б. Данные файла (File Data)
Непосредственно полезная нагрузка. После прохождения через алгоритм сжатия (Deflate, LZMA, PPMd и т.д.) данные записываются в виде непрерывного байтового потока. Если включено шифрование (традиционное ZipCrypto или современное AES в режиме Authenticated Encryption), данные шифруются после сжатия.
В. Дескриптор данных (Data Descriptor) — Опционально
Используется, если при создании архива размеры и CRC были неизвестны (например, при потоковой записи из stdin). Ставится после данных файла. Содержит: CRC-32, Сжатый размер, Несжатый размер. Наличие сигнатуры 0x08074b50 перед дескриптором опционально, что усложняет парсинг.
Г. Запись центрального каталога (Central Directory File Header)
Дублирует и расширяет информацию из локального заголовка. Ключевые отличия:
- Сигнатура:
0x02014b50. - Версия, созданная архиватором (Version Made By): указывает ОС (0 — FAT/MS-DOS, 3 — Unix, 7 — Macintosh, 11 — NTFS и т.д.) и версию ПО.
- Смещение локального заголовка (Relative Offset of Local Header): Критически важное поле — адрес от начала архива до соответствующего Local File Header. Позволяет перепрыгнуть к данным файла мгновенно.
- Внешние атрибуты файла (External File Attributes): Биты атрибутов, зависящие от ОС (например, для Unix — режим доступа
modeи тип файла в старших 16 битах). - Комментарий к файлу (File Comment);
Специфические части других популярных форматов
Формат RAR (Roshal Archive)
Структура RAR (особенно версии 5.0+) организована в виде блоков (blocks) с контрольными суммами CRC32 для каждого блока:
- Маркер архива (Marker Block): Фиксированная сигнатура
Rar!(v5) илиRar!. - Главный заголовок (Main Header / Archive Header): Флаги архива (solid, locked, recovery record), версия формата.
- Заголовки файлов (File Headers): Содержат метаданные, атрибуты, хэши (BLAKE2sp в v5 для проверки целостности), словарь сжатия.
- Служебные блоки: Recovery Record (RR) — избыточные коды Рида-Соломона для восстановления поврежденных данных; Lock Block — запрет модификации архива; End Archive Block — маркер конца.
- Solid-режим: В сплошных архивах файлы сжимаются как единый поток данных, что повышает коэффициент сжатия, но требует последовательного чтения для извлечения файла из середины.
Формат 7z (7-Zip)
Имеет модульную, открытую архитектуру:
- Заголовок архива (Header): Сигнатура
7z¼¯', версия, CRC заголовка, ссылка на следующий заголовок (Next Header Offset/Size/CRC). - Структура папок (Folders): Логические контейнеры, объединяющие файлы для сжатия единым словарем. В каждой папке указывается цепочка кодировщиков (Coders) — например: LZMA2 -> BCJ (x86 filter) -> AES-256 (шифрование).
- Каталог файлов (Files List): Имена, размеры, атрибуты, таймстемпы (в формате FILETIME), флаги (пустой файл, директория, зашифрован).
- Потоки упаковки (Pack Streams): Собственно сжатые/зашифрованные данные папок.
Формат TAR (Tape Archive) + сжатие (.tar.gz, .tar.xz)
TAR не сжимает данные сам, он лишь объединяет. Структура линейна:
- Последовательность заголовков блоков по 512 байт (POSIX ustar / GNU / PAX форматы).
- Заголовок содержит: имя (100/256 байт), режим, UID/GID, размер (в восьмеричном ASCII), mtime, тип файла (обычный, директория, симлинк, блок/симв. устройство), имя связанного файла (для линков), магическую строку
ustar. - Сразу за заголовком идут данные файла, выровненные до 512 байт.
- Конец архива, два нулевых блока (1024 байта нулей).
- Сжатие (gzip, xz, bzip2, zstd) применяется ко всему TAR-файлу целиком (solid-архив).
Служебные и вспомогательные части
Помимо основных структур, в архивах могут присутствовать важные дополнительные компоненты:
Записи восстановления (Recovery Records / Volumes)
- RAR Recovery Record: Встроенная избыточность (обычно 1-10% размера), позволяющая восстановить данные при физических повреждениях носителя или ошибках передачи.
- PAR/PAR2 файлы: Отдельные файлы восстановления (не внутри архива, а рядом), часто используются с RAR/TAR в Usenet/Backup.
- Многотомные архивы (Split/Spanned Archives): Один логический архив, разбитый на части (
.part1.rar,.z01,.001). Имеют специальные маркеры начала/продолжения и общий центральный каталог (обычно в последней части или первой).
Шифрование и безопасность
- Заголовки шифрования (Encryption Headers): Соли (Salt), вектор инициализации (IV), теги аутентификации (MAC/Tag для AES-GCM/CCM), количество итераций ключа (PBKDF2). В 7z/RAR5/ZIP (AE-2) это надежное криптографическое защищение и метаданных (имен файлов), и данных.
- Цифровые подписи: Некоторые форматы (например, APK/JAR — это ZIP с подписью в
META-INF/) позволяют встраивать подписи для проверки авторства и неизменности.
Расширенные атрибуты и метаданные
- Extra Fields (ZIP) / Extended Attributes (7z, RAR): Хранение NTFS ACL, Unix uid/gid/mode, расширенных атрибутов (xattr), macOS Resource Forks, альтернативных потоков данных (ADS), таймстемпов с наносекундной точностью (NTFS/Unix nanoseconds).
- Комментарии: К архиву в целом (в EOCD) и к отдельным файлам (в Central Directory).
Логическая структура каталогов внутри архива
Важно различать физическое хранение (последовательность байт в файле архива) и логическую структуру (дерево папок).
- В ZIP, 7z, RAR имена файлов храняться с разделителем
/(например,docs/report.txt). Явных записей для директорий может не быть (директория неявно существует, если есть файл с префиксомdocs/), либо они присутствуют как записи с нулевым размером и флагом «директория» (атрибутFILE_ATTRIBUTE_DIRECTORYили суффикс/в имени); - При распаковке архиватор восстанавливает полную структуру директорий, рекурсивно создавая папки перед извлечением файлов.
- В TAR директории — это явные записи типа
typeflag = '5'.
Почему важно знать части архива?
- Восстановление данных: Понимание структуры (поиск сигнатур Local Header / Central Directory / Block Headers) позволяет извлечь файлы из поврежденных/обрезанных архивов утилитами вроде
zip -F,rar r,7z -tили скриптами на Python (zipfile,pyunpack). - Оптимизация доступа: Чтение Central Directory (ZIP) или Header (7z/RAR) дает мгновенный доступ к списку файлов без сканирования терабайт данных.
- Потоковая обработка (Streaming): Знание про Data Descriptor и Local Headers позволяет писать/читать архивы в пайпах (stdin/stdout) без поиска (seek) по файлу.
- Безопасность: Анализ Extra Fields, флагов шифрования и версий формата помогает выявить вредоносные архивы (Zip Slip, Symlink атаки, Zip Bombs — вложенные архивы/коллизии размеров).
- Кроссплатформенность: Правильная интерпретация External File Attributes и Extra Fields (Info-ZIP Unix/NTFS) гарантирует сохранение прав доступа, владельцев и времени при переносе между Windows, Linux, macOS.
Файл архива — это не просто «сжатые данные», а сложная иерархическая структура, состоящая из заголовков (метаданных), полезной нагрузки (сжатых/зашифрованных потоков), индексов (центральных каталогов) и служебных блоков (восстановление, подписи, расширенные атрибуты). Различные форматы (ZIP, RAR, 7z, TAR+) делают разные компромиссы между скоростью доступа, коэффициентом сжатия, надежностью и функциональностью, но общие принципы организации «частей файла архива» остаются едиными на протяжении десятилетий.