요약
- RFC 1952는 gzip 파일을 연속된 멤버들로 정의합니다. 각 멤버는 자신만의 헤더, 압축 블록, CRC32/ISIZE 트레일러를 가지며, 이후 멤버는 이전 멤버를 다시 쓰지 않고도 디코딩 출력을 확장할 수 있습니다.
- 선택적 이름, 주석, 타임스탬프, 추가 필드는 한 멤버를 기술하며 건너뛸 수 있습니다. 이것들은 인증된 출처 정보가 아니며, 형식은 임의 접근 색인이 아니라 스트림 지향으로 남습니다.
- CRC32는 한 멤버의 복구된 데이터 속 손상을 감지하고, ISIZE는 그 멤버의 길이를 2^32로 나눈 나머지를 기록합니다. 어느 필드도 덧붙인 주체를 식별하거나 임의의 다중 멤버 파일의 절대 크기를 알려주지 않습니다.
겉보기 끝점 뒤의 바이트
한 프로그램이 유효한 gzip 스트림을 써 넣고 파일을 닫았다고 가정해 봅시다. 몇 시간 뒤, 다른 프로그램이 같은 파일을 추가 모드로 열어 두 번째 유효한 gzip 스트림을 씁니다. 첫 스트림은 아무것도 바뀌지 않습니다. 새로운 외부 헤더도, 새로 만든 목차도, 바이트 0 근처에 삽입된 포인터도 없습니다. 그런데도 처음부터 읽는 디코더는 첫 번째 입력과 이어서 두 번째 입력을 모두 복구할 수 있습니다.
이것은 관대한 우연이 아닙니다.RFC 1952는 gzip 파일을 추가 정보 없이 연이어 놓이는 멤버들의 나열로 정의합니다. 멤버는 닫히는 단위입니다. 헤더, 압축 블록, 그리고 트레일러가 그 순서입니다. 디코더가 한 단위가 끝나는 지점과 다음 식별 가능한 단위가 시작되는 지점을 알기 때문에, 파일은 이어질 수 있습니다.
RFC Editor 기록은 P. Deutsch의 문서를 1996년 5월로 표기하고 Informational로 분류합니다. 이 지위는 의미가 있습니다. 이 사양은 이식 가능한 형식과 준수 규칙을 기록할 뿐, 그 자체가 표준 트랙 선언이나 이후 gzip을 만난 모든 디코더의 조사 목록은 아닙니다.
설계 목표는 실용적이고 좁았습니다. 형식은 프로세서, 운영체제, 파일 시스템, 문자 집합을 넘나들 수 있어야 하고, 유한한 중간 저장소를 가진 스트림으로 동작해야 하며, 특허 기술 없이 구현 가능해야 하고, 이미 쓰이던 gzip 형식과 맞아야 했습니다. 임의 접근은 명시적으로 설계 밖이었습니다. 나열은 색인이 되지 않고도 신뢰하게 훑을 수 있습니다.
하나의 멤버, 네 종류의 사실
고정 헤더는 두 개의 식별 옥텟으로 시작합니다. 그 뒤에 압축 방식 필드가 오며, 방식 8은 DEFLATE를 뜻합니다. 플래그는 선택적 자료를 알리고, 예약 플래그 비트는 0으로 남아야 합니다. 이 사실들로 디코더는 멤버를 인식하고, 올바른 해제기를 고르고, 헤더를 통과합니다.
선택적 필드는 더 부드러운 질문에 답합니다. MTIME은 수정 시각을 담을 수 있지만 0은 이용 가능한 타임스탬프가 없음을 뜻합니다. FNAME은 원본 이름을 담을 수 있습니다. FCOMMENT는 사람이 읽는 주석을 담을 수 있습니다. FEXTRA는 길이로 구획된 하위 필드를 담을 수 있습니다. FTEXT는 텍스트 여부에 대한 잠정적 표시를 제공합니다. 디코더는 이를 활용하지 않더라도 선언된 선택적 자료를 건너뛸 수 있어야 합니다.
이 구분은 구조적입니다. 파일명은 유용할 수 있지만 멤버의 신원은 아닙니다. 주석은 보관 경위를 설명할 수 있지만 보관 사실을 증명하지는 않습니다. 운영체제 코드는 로컬 변환에 도움을 줄 수 있지만, 준수하는 디코더는 무시할 수 있습니다. 이 필드들은 인증되지 않았으므로, 조사자는 이를 객체가 실어 나르는 주장으로 대해야지 그 객체의 출처에 관해 독립적으로 확립된 사실로 대해선 안 됩니다.
FHCRC가 있다면, 이는 CRC32 계산의 하위 16비트로 바로 앞 헤더를 검사합니다. 트레일러의 CRC32는 다릅니다. 그 멤버의 압축 해제된 데이터를 덮습니다. 그 옆에서 ISIZE는 그 멤버의 원본 입력 크기를 2^32로 나눈 나머지를 저장합니다. 헤더 통과, 복구된 데이터의 무결성, 기술적 메타데이터는 몇 바이트 차이로 나란히 있어도 각자 별개의 면을 담당합니다.
검사는 멤버가 끝나는 곳에서 끝난다
트레일러는 손상을 유용한 경계에서 관측 가능하게 만듭니다. 디코더는 한 멤버를 해제하고 그 CRC32를 계산해 체크섬과 크기를 모두 비교할 수 있습니다. 비교가 성공하면, 복구된 바이트가 형식의 우발 오류 모델 아래에서 그 검사들과 일치한다는 근거를 가진 것입니다.
하지만 서명은 없습니다. 데이터를 교체하거나 덧붙일 수 있는 누구든 새 CRC32를 계산할 수 있습니다. 무한 길이 서술도 없습니다. ISIZE는 의도적으로 2^32에서 넘어갑니다. 다중 멤버 파일에서 각 트레일러는 자신의 멤버에 대해서만 말합니다. 복구된 길이들을 합산하는 것은 읽는 쪽이 수행하는 집계 연산이며, 첫 헤더나 마지막 헤더에 기록된 총계가 아닙니다.
압축 계층도 분리되어 있습니다.RFC 1951은 DEFLATE의 블록과 부호화를 규정합니다.RFC 1950은 DEFLATE를 별개의 zlib 래퍼, 즉 자신만의 헤더와 Adler-32 검사를 가진 껍질 안에 놓습니다. 이후RFC 6713의 미디어 타입 등록은 이 구분을 단호하게 밝힙니다. zlib은 스트림 형식이고, gzip은 파일에 맞는 헤더와 트레일러를 더합니다.
이 분리 덕분에 압축 알고리즘이 모든 파일 수준의 결정을 떠안을 필요가 없어졌습니다. gzip 멤버는 새 DEFLATE 문법을 발명하지 않고도 선택적 메타데이터를 바꿀 수 있습니다. 다른 래퍼는 같은 압축기를 다른 검증과 프레이밍으로 쓸 수 있습니다. 호환성은 하나의 묶음된 “압축 파일” 개념 안이 아니라 이름 붙은 경계에 삽니다.
실행되는 코드가 이어짐을 드러낸다
현재GNU gzip 매뉴얼은 이어 붙이기를 운용 기법으로 문서화합니다. 여러 압축 파일을 붙일 수 있고,gunzip은 모든 멤버를 내보냅니다. 따라서 두 번째 입력을 압축한 형태를 덧붙이는 일은 두 원본 입력을 이어 붙인 것과 같은 복구된 바이트열을 낳습니다. 매뉴얼은 두 가지 비용도 기록합니다. 입력을 함께 압축하는 편이 보통 더 좋은 압축률을 내며,gzip --list는 모든 멤버의 집계가 아니라 마지막 멤버의 압축 해제 크기와 CRC를 보고합니다.
이 세부 사항은 단순한 명령줄 잡지식이 아닙니다. 하나의 올바른 컨테이너가 서로 다른 도구에게 서로 다른 진실을 보여줄 수 있음을 보여줍니다. 해제기는 나열을 따라갑니다. 목록 명령은 마지막 단위만 요약할 수 있습니다. 첫 트레일러 뒤에서 멈추는 스캐너는 규격에 맞는 스트림 소비자보다 덜 봅니다. “파일이 유효하다”는 말은 어느 멤버를 검사했고 어느 디코더 정책을 썼는지 밝히지 않으면 불완전합니다.
HTTP는 이 형식에 또 다른 무대를 주지만 또 다른 존재론은 주지 않습니다.RFC 9110은gzip을 RFC 1952를 참조하여 콘텐츠 코딩으로 등록합니다. 이는 gzip으로 코딩된 표현 데이터를 허용할 뿐, 모든 중개자, 서버, 클라이언트, 보안 제품이 멤버 경계를 같은 방식으로 보존하고 보고한다는 증명이 아닙니다. 이 출처 집합은 형식 규칙을 뒷받침할 뿐, 보편적인 HTTP 행동 주장을 뒷받침하지 않습니다.
최소 사양은 의미를 국소에 남길 수 있다
Running-Code Primacy는 이 역사를 읽는 이후의 규율을 제시합니다. 공개된 문서는 하나의 실재 계층이며, 구현과 검증과 사용은 다른 계층을 더합니다. RFC 1952는 공통 문법을 정의합니다. GNU gzip은 이어 붙인 멤버들이 하나의 유지되는 구현 안에서 동작한다는 유한한 근거를 공급합니다. 어느 사실도 모든 시스템에 대한 주장으로 부풀려서는 안 됩니다.
Minimum Initial Specification은 멤버 경계의 미덕을 더 선명하게 합니다. 공통 계층은 독립 프로그램들이 반드시 합의해야 하는 곳에서 엄격합니다. 식별 바이트, 압축 방식, 플래그, 선택적 필드 길이, 예약 비트, 트레일러 검사가 그것입니다. 그러나 로컬 프로그램이 주석을 표시할지, 타임스탬프를 복원할지, OS 힌트를 쓸지는 관용적일 수 있습니다.
Reality Layers는 상징과 동작을 분리하는 데 도움이 됩니다. 하나의 파일명은 편리한 상징입니다. 그러나 동작상, 바이트들은 여러 개의 마감 사건, 여러 개의 체크섬, 여러 개의 크기 잔여값, 여러 개의 메타데이터 주장을 담고 있을 수 있습니다. 이 표기는 거짓이 아닙니다. 단지 실행 가능한 구조보다 거친 것뿐입니다.
RFC 1952의 오래된 성취는 압축을 신비하게 만든 것이 아니었습니다. 멈추는 지점을 작고 반복 가능하게 만든 것입니다. 하나의 멤버가 완전히 끝마칠 수 있었기에, 파일은 다시 시작될 수 있었습니다.
회원 브리핑
프로필 심층 컨텍스트
올바른 멤버십 등급으로 로그인하면 전체 브리핑과 출처 노트를 볼 수 있습니다.
Strategic Circle 전용
Strategic Circle
모든 독자에게 공개됩니다. 가입 후 로그인하면 프로필 브리핑를 열람할 수 있습니다.
Strategic Circle 가입하기Leadership Alliance 전용
Leadership Alliance
자격을 갖춘 IP 자산 소유자 및 운영진을 위한 콘텐츠입니다. 로그인하면 Leadership Alliance 브리핑을 열람할 수 있습니다.
Leadership Alliance 가입하기





