gzip/document

GZIP

[131] gzip は、圧縮形式の1つです。 UnixHTTP などで広く用いられています。

仕様書

[51] gzipRFC 1952 により定義されています。

構文

[56] gzip ファイルは、 メンバーの列で構成されます >>19

[123] メンバー数は特に規定されていません。 0個でも構わないのかは不明です。

[133] メンバー数が1個以外のものが使われることもあるようですが、 相互運用性は高くないようです >>136

[142] 圧縮データの末尾は検知可能であり (gzip で用いる圧縮形式はそのようなものでなければならず)、 記録指向のファイルシステムや、 特定ブロック長の倍数でしか読めない装置由来の場合の圧縮データを扱う展開器は、 末尾を検知して以後を読み飛ばさなければなりません。 (gzip コマンドにもそのような機能が備わっています。) >>141


[57] メンバー (member) は、 圧縮データ集合 (compressed data set) であり、 次のように構成されます。 >>19

ID1 1バイト
常に固定の値です。
ID2 1バイト
常に固定の値です。
CM 1バイト
圧縮方式です。
FLG 1バイト
いくつかのフラグです。
MTIME 4バイト
最終修正日時です。
XFL 1バイト
圧縮方式依存のフラグです。
OS 1バイト
元のファイルシステムです。
XLEN 2バイト
余剰欄の長さです。 (FEXTRA の場合のみ。)
余剰欄 XLEN バイト
(FEXTRA の場合のみ。)
元のファイル名
元のファイル名です。 (FNAME の場合のみ。)
ファイルコメント
人間向けの任意のコメントです。 (FCOMMENT の場合のみ。)
CRC16
(FHCRC の場合のみ。)
圧縮されたブロック群
CRC32 4バイト
ISIZE 4バイト

[67] ID1 から OS までを gzip ヘッダー (header) >>19 と呼びます。

[124] 展開器に与えられたデータが十分な長さがない場合にどう処理するべきかは不明ですが、 エラーとするべきでしょう。

ID1、ID2

[58] ID131 (0x1F)、 ID2139 (0x8B) で、 gzip であることを表します。 >>19

[113] 展開器は、これらの値が不適切な時、 エラーとしなければなりません。 >>19

CM

[59] CM は、 圧縮方式 (compression method) を表します。 >>19

[60] 0 - 7 は予約されています。 >>19

[61] 8 は、 DEFLATE を表します。 >>19

[87] 9 - 255 は定義されていません。

[114] 展開器は、この値が不適切な時、 エラーとしなければなりません。 >>19

FLG

[62] FLG は、 次の各ビットで構成されます。 >>19

  • 第0ビット FTEXT
  • 第1ビット FHCRC
  • 第2ビット FEXTRA
  • 第3ビット FNAME
  • 第4ビット FCOMMENT
  • 第5ビット - 第7ビット 予約

[63] FTEXT が設定されている場合、 ファイルはおそらく ASCII テキストであることを表します。 >>19

[64] 圧縮器は入力データを少量検査して本フラグを設定できますが、 必ず設定しなければならないものではなく、 はっきりしない時は 0 とできます。 圧縮器は常に 0 としても構いません。 >>19

[65] 展開器は本フラグを無視して常にバイナリーデータとして扱っても構いません。 ASCII テキストとバイナリーデータで異なるファイル形式を使うシステムでは、 展開器は本フラグを見て適切な形式を選択できます。 >>19


[66] FHCRC が設定されている場合、 CRC16 が存在することを表します。 >>19

[68] 本フラグは、 gzip 1.2.4 で異なる意味で文書化されていましたが、 1.2.4 までの gzip では設定されることはありませんでした。 >>19

[109] 圧縮器は、これを 0 として構いません。 >>19


[69] FEXTRA が設定されている場合、 余剰欄が存在することを表します。 >>19

[70] FNAME が設定されている場合、 元のファイル名が存在することを表します。 >>19

[77] FCOMMENT が設定されている場合、 コメントが存在することを表します。 >>19

[110] 圧縮器は、これらをすべて 0 として構いません。 >>19


[78] 予約ビットは、 0 でなければなりません。 >>19

[120] 展開器は、 0 でないときエラーとしなければなりません。 >>19

MTIME

[83] MTIME は、 元のファイルが最も直近で修正された時刻を表します。 >>19

[85] 圧縮されたデータがファイル由来でない場合は、 圧縮が開始された時刻とします。 >>19

[84] 時刻は、 Unix time数です。 >>19

2038年問題も参照。

[86] 0 は、タイムスタンプが利用できないことを表します。 圧縮器0 に設定して構いません。 >>19

[90] 値は4バイトの符号無し整数であり、小エンディアンとなります。

XFL

[91] XFL は、 CM 依存のフラグ群で、1バイトあります >>19

[92] CM8 の時、次のフラグがあります >>19

  • XFL = 2 は、圧縮器が最大圧縮の最遅のアルゴリズムを使ったことを表します。
  • XFL = 4 は、圧縮器が最速アルゴリズムを使ったことを表します。

[93] その他の値は定義されていません。

[111] 圧縮器は、これを 0 として構いません。 >>190 は特に指定がないことを表すと思われます。

[125] zlib には FLEVEL があり似た意味で使われていますが、値は異なります。

OS

[94] OS は、 圧縮したファイルシステム種別を表す1バイトの値です。 >>19

[95] テキストファイルの改行の決定に便利かもしれません。 >>19

[96] 次の値が定義されています。

[112] 圧縮器は、これを常に 255 として構いません。 >>19

[119] 展開器は、これを無視しても構いません。 >>19

XLEN と余剰欄

[102] FEXTRA が設定されている場合、 XLEN余剰欄が存在します。

[97] XLEN は、余剰欄の長さを表します。 >>19

[117] 展開器は、最低でも XLEN 余剰欄を読み飛ばさなければなりません。 >>19

[103] 余剰欄 (extra field) は、 次の部分欄 (subfield) の列で構成されます。 >>19

SI1 1バイト
部分欄IDの一部です。
SI2 1バイト
部分欄IDの一部です。
LEN 2バイト
部分欄データの長さを表します。
部分欄データ LEN バイト
部分欄の値です。

[104] SI1SI2 の組で部分欄 (subfield) IDを表します。 >>19

[105] 通常は2つの ASCII文字が割り当てられます。 割当は Jean-Loup Gailly <gzip@prep.ai.mit.edu> が管理しています。 >>19 追加要求は <support@gzip.org> に送信することになっています >>141


[143] (0x41, 0x43) = AC は、 Acorn RISC OS/BBC MOS ファイル型情報 (file type information) を表します (Kevin Bracey)。 >>141

[151] この場合データは28バイトで、 32ビットの小エンディアン7つで構成されます。 >>141

  • 第0語 : load address
  • 第1語 : execution address
  • 第2語 : object attributes
  • 第3語 : object length
  • 第4語 - 第6語 : 予約 (0)

[152] load address と execution address はかつては実際に番地を表すために用いられましたが、 近年は他の情報を埋め込むために使っています。その場合上位12ビットが 0xFFF となります。次の12ビットがファイル型、残り (load address 下位8ビットと execution address) がタイムスタンプを表します。 >>141

[154] ファイル型 (filetype) Acorn により割り当てられるもので、 次のものが含まれます。 >>141

  • FFF Text
  • FFD Data
  • FFB BASIC program
  • FF8 Absolute (executable to be loaded and entered at 0x8000)
  • FF5 Postscript
  • FAF HTML
  • F83 MNG
  • F89 gzip
  • C85 JPEG
  • C46 Tar
  • B60 PNG
  • AE4 Java class file
  • ADF PDF
  • 695 GIF

[155] タイムスタンプからのセンチ秒数を40ビット符号無し整数で表したもの >>141 (RISC OS時刻) です。 最上位バイトは load address に含めます >>141

[153] object attributes は、次のビットで構成されます。 >>141

  • 第0ビット : owner read access の有無
  • 第1ビット : owner write access の有無
  • 第2ビット : 予約 (0)
  • 第3ビット : locked against deletion の有無
  • 第4ビット : public read access の有無
  • 第5ビット : public write access の有無
  • 第6ビット - 第31ビット : 予約 (0)

[107] (0x41, 0x70) = Ap は、 Apollo ファイル型情報 (file type information) を表します。 >>19 (David Sundstrom) >>141


[140] (66, 67) = BC は、 BGZF が使っています >>138

[150] この場合データは BSIZE、すなわち BGZF ブロックサイズ - 1 を小エンディアンの16ビット符号無し整数で表したものです。 >>138


[144] (0x63, 0x70) = cp は、 cpio で圧縮したファイルを表します (Geoffrey Dairiki)。 >>141

[149] この場合データは FNAME 欄の長さであり、2バイトで表します >>141エンディアンは不明ですが、 gzip 本体と同じとすれば小エンディアンでしょうか。


[145] (0x1D, 0x53) = gs (ママ) は、 gzsig http://www.monkey.org/~dugsong/gzsig-0.1.tar.gz (Dug Song) で使っています。 >>141

[146] (0x4B, 0x4E) = KN は、 KeyNote assertion (RFC 2704) http://www.cis.upenn.edu/~keynote/ (Dug Song) で使っています。 >>141

[147] (0x4D, 0x63) = Mc は、 Macintosh 情報 (Type および Creator) を表します (Cary Scofield)。 >>141

[148] (0x52, 0x4F) = RO は、 Acorn Risc OS ファイル型情報 (file type information) を表します (Adam Goodfellow)。 >>141

[106] SI2 = 0 の ID は、将来用に予約されています。 >>19


[108] LEN は、 部分欄データ (subfield data) の長さを表します。 (SI1SI2LEN は含みません。) >>19

元のファイル名

[71] 元のファイル名 (original file name) は、 FNAME が設定されているときに存在します >>19

[74] 元のファイル名は、圧縮されたファイルの元の名前であり、 ディレクトリ名は含みません。 >>19

[75] 圧縮されたファイル大文字・小文字不区別ファイルシステム上にある場合、 小文字とします。 >>19

[73] 元のファイル名は、 ISO 8859-1 文字で構成されなければなりません。 >>19

[72] 元のファイル名は、 0x00バイトで終端します。 >>19

[76] 名前のあるファイル以外を圧縮した時は、元のファイル名はありません。 >>19

[126] 空文字列とすることも特に禁止はされていません。意味があるのかどうかは謎ですが。

[127] 利用できるファイル名や長さに制約はありません。 古い gzip はあまりに長いファイル名でクラッシュする不具合がありました >>132。 実装時には長いファイル名によりセキュリティー上の問題とならないように注意が必要です。

[115] 展開器は、最低でも FNAME を検査して元のファイル名を読み飛ばさなければなりません。 >>19

[128] 展開器は、セキュリティーのため、元のファイル名を無防備に信用してはいけません。

コメント

[79] コメント (comment) は、 FCOMMENT が設定されているときに存在します >>19

[80] このコメントは、人間向けのものです >>19

[81] コメントは ISO 8859-1 文字で構成されます。 改行は、1つの 0x0A で表すべきです。 >>19

[82] コメントは、 0x00バイトで終端します。 >>19

[129] 空文字列とすることも特に禁止はされていません。

[134] 実装時には長いコメントでセキュリティー上の問題とならないように注意が必要です。

[116] 展開器は、最低でも FCOMMENT を検査して元のファイル名を読み飛ばさなければなりません。 >>19

CRC16

[100] CRC16 は、 FHCRC が設定されているときに存在します。 >>19

[101] gzip ヘッダーの CRC16 です。 >>19

[118] 展開器は、最低でも FHCRC を検査してCRC16を読み飛ばさなければなりません。 >>19 CRC16 を検査することは義務付けられていないようです。

CRC32

[98] CRC32 は、 未圧縮データの CRC-32 値です。 >>19

[121] gzip を使うシステムは、 CRC-32 を検査する手段を提供するべき >>19 とされていますが、 展開器CRC32 を検査することは義務付けられていないようです。

ISIZE

[99] ISIZE は、 未圧縮データのサイズ mod 232 です。 >>19

[122] 展開器がこの値を使うことは義務付けられていないようです。

符号化 (圧縮)

[53] 圧縮器は、 RFC 1952 の要件をすべて満たすファイルを生成しなければなりません >>19

復号 (展開)

[54] 展開器は、適合するファイルをすべて受理し、 展開できなければなりません。 >>19

MIME 型

[158] RFC 6713gzipMIME型application/gzip と定義しています >>6。 他にもいくつかの MIME型にも言及はしていますが、定義はせず、 application/gzip を使うべき (should) としています >>6

[157] gzipMIME型 >>6
[159] RFC 6713 は他に application/zlib も定義しています。

拡張子

[160] gzip ファイル拡張子.gz >>6 が一般的です。

[161] 元のファイル名の末尾に .gz を付加したファイル名とするのが慣習となっています。

内容符号化・転送符号化 gzip

[7] HTTP内容符号化転送符号化 gzip は、 gzip ファイル圧縮プログラムが生成する LZ77 符号化と32ビット CRC による符号化 RFC 1952 を表します >>8, >>11, >>12

名前

[9] 内容符号化転送符号化の名前は gzip です >>8, >>11

[10] 受信者x-gzip も等価として扱うべきです >>8, >>11

処理

[18] FCAST の実装は、 Content-Encoding: gzip に対応しなければなりません >>17

実装

[2] Perlでのgzipの圧縮・展開

[1] WinIE の gzip 展開処理ってすごく遅くないですか?

HTTP での実例

[28] Content-Type:application/x-gzip で、 Content-Encoding: が無しのもの:

[32] Content-Type:application/octet-streamContent-Encoding: は無しのもの:

[41] Content-Type:application/binaryContent-Encoding: は無しのもの:

[48] Content-Type:binary/octet-streamContent-Encoding: は無しのもの:

[37] Content-Type: が展開後のファイル形式で、 Content-Encoding:gzip のもの:

[39] ダウンロードすると、 Chrome は展開したものを保存し、 Firefox は圧縮されたものを保存するようです。

[22] Directory Listing: / () http://ftp.mozilla.org/

[23] >>22 gzip ファイルに Content-Encoding: はありませんが、 Content-Type: は展開後のファイル形式を表している、 という変な状態になっています。

歴史

[55] gzip仕様書の 4.1 版、 4.2 版、 4.3 版に技術的な違いはありません。 4.3 が RFC 1952 です。 >>19

実現値操作 gzip

[14] 実現値操作 gzip は、 内容符号化 gzip と同じです >>13

[16] gdiffdiffe圧縮によって大きくサイズを削減できますから、 gzip も実装することが強く推奨 (strongly recommended) されています >>15

[89] IANA登録簿には RFC 2616 を出典として登録されています >>88RFC 723x 出版後も出典は更新されていません。

メモ

[52] 圧縮データへのランダムアクセスは設計上想定外とされています >>19

[132] The gzip home page () http://www.gzip.org/

[3]gzip - Wikipedia, the free encyclopedia ( 版) http://en.wikipedia.org/wiki/Gzip

[4] >>3

Many server implementations, however, incorrectly implement the protocol by using the raw DEFLATE stream format (RFC 1951) instead. The bug is sufficiently pervasive that most modern browsers will accept both RFC 1951 and RFC 1950-formatted data for the “deflate” compressed method.

[5] gzip - Wikipedia, the free encyclopedia (Referenced: ) http://en.wikipedia.org/wiki/Gzip

[20] RFC 6713 - The 'application/zlib' and 'application/gzip' Media Types ( 版) https://tools.ietf.org/html/rfc6713

[21] gzip - Wikipedia ( 版) https://ja.wikipedia.org/wiki/Gzip

[42] 233047 – From some download servers, browser uncompresses gzip file, but keeps gz extension. Download manager is confused over file size and time remaining (nsBinaryDetector) ( ()) https://bugzilla.mozilla.org/show_bug.cgi?id=233047

[130] ncsa-mosaic/CHANGES at master · alandipert/ncsa-mosaic ( ( 版)) https://github.com/alandipert/ncsa-mosaic/blob/master/CHANGES#L128

[135] mod_deflate - Apache HTTP Server Version 2.4 () http://httpd.apache.org/docs/current/en/mod/mod_deflate.html

Now if a request contains a Content-Encoding: gzip header, the body will be automatically decompressed. Few browsers have the ability to gzip request bodies. However, some special applications actually do support request compression, for instance some WebDAV clients.

[156] () http://www.gzip.org/algorithm.txt

[162] Remove Gecko-only quirk (annevk著, ) https://github.com/whatwg/fetch/commit/a8df5b86f4134f58baf6a3cab6cc767eb866784f

[163] Remove Gecko-only quirk by annevk · Pull Request #816 · whatwg/fetch () https://github.com/whatwg/fetch/pull/816