-
Notifications
You must be signed in to change notification settings - Fork 4
/
636.txt
386 lines (271 loc) · 16.2 KB
/
636.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
* 仕様書
[51] [[gzip]] は [DFN[RFC 1952]] により定義されています。
[REFS[
- [19] '''[CITE@en[RFC 1952 - GZIP file format specification version 4.3]] ([TIME[2014-11-02 13:39:48 +09:00]] 版) <https://tools.ietf.org/html/rfc1952>'''
- [8] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-4.2.3>
- [11] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-8.5>
- [12] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#page-12>
- [17] [CITE@en[RFC 6968 - FCAST: Object Delivery for the Asynchronous Layered Coding (ALC) and NACK-Oriented Reliable Multicast (NORM) Protocols]] ([TIME[2014-09-14 18:07:31 +09:00]] 版) <https://tools.ietf.org/html/rfc6968#page-21>
]REFS]
* 構文
[56] [[gzip]] [[ファイル]]は、
メンバーの列で構成されます [SRC[>>19]]。
[57] [DFN[[RUBYB[メンバー]@en[member]]]]は、
[RUBYB[圧縮データ集合]@en[compressed data set]]であり、
次のように構成されます。 [SRC[>>19]]
[FIG(list members)[
: [[ID1]] 1バイト : 常に固定の値です。
: [[ID2]] 1バイト : 常に固定の値です。
: [[CM]] 1バイト : 圧縮方式です。
: [[FLG]] 1バイト : いくつかのフラグです。
: [[MTIME]] 4バイト : 最終修正日時です。
: [[XFL]] 1バイト : 圧縮方式依存のフラグです。
: [[OS]] 1バイト : 元のファイルシステムです。
: [[XLEN]] 2バイト : 余剰欄の長さです。
([VAR[FEXTRA]] の場合のみ。)
: 余剰欄 [VAR[XLEN]] バイト :
([VAR[FEXTRA]] の場合のみ。)
: 元のファイル名 : 元のファイル名です。
([VAR[FNAME]] の場合のみ。)
: ファイルコメント : 人間向けの任意のコメントです。
([VAR[FCOMMENT]] の場合のみ。)
: [[CRC16]] :
([VAR[FHCRC]] の場合のみ。)
: 圧縮されたブロック群 :
: [[CRC32]] 4バイト :
: [[ISIZE]] 4バイト :
]FIG]
[67] [[ID1]] から [[OS]] までを [[gzip]] [RUBYB[ヘッダー]@en[header]] [SRC[>>19]]
と呼びます。
** ID1、ID2
[58] [DFN[[ABBR[ID1][IDentification 1]]]] は [N[31]] ([N[0x1F]])、
[DFN[[ABBR[ID2][IDentification 2]]]] は [N[139]] ([N[0x8B]]) で、
[[gzip]] であることを表します。 [SRC[>>19]]
** CM
[59] [DFN[[ABBR[CM][Compression Method]]]] は、
[RUBYB[圧縮方式]@en[compression method]]を表します。 [SRC[>>19]]
[60] [N[0]] - [N[7]] は予約されています。 [SRC[>>19]]
[61] [N[8]] は、 [[DEFLATE]] を表します。 [SRC[>>19]]
[87] [N[9]] - [N[255]] は定義されていません。
** FLG
[62] [DFN[[ABBR[FLG][FLaGs]]]] は、
次の各[[ビット]]で構成されます。 [SRC[>>19]]
- 第0ビット FTEXT
- 第1ビット FHCRC
- 第2ビット FEXTRA
- 第3ビット FNAME
- 第4ビット FCOMMENT
- 第5ビット - 第7ビット 予約
-*-*-
[63] [DFN[FTEXT]] が設定されている場合、
ファイルはおそらく [[ASCII]] テキストであることを表します。 [SRC[>>19]]
[64] [[圧縮器]]は入力データを少量検査して本フラグを設定できますが、
必ず設定しなければならないものではなく、
はっきりしない時は未設定とできます。
[[圧縮器]]は常に未設定としても構いません。 [SRC[>>19]]
[65] [[展開器]]は本フラグを無視しても構いません。
[[ASCII]] テキストと[[バイナリーデータ]]で異なるファイル形式を使うシステムでは、
[[展開器]]は本フラグを見て適切な形式を選択できます。 [SRC[>>19]]
-*-*-
[66] [DFN[FHCRC]] が設定されている場合、
[[gzip]] ヘッダーの [[CRC16]] を圧縮データの前に置きます。
[SRC[>>19]]
;; [68] 本フラグは、 [[gzip]] 1.2.4 で異なる意味で[[文書化]]されていましたが、
1.2.4 までの [[gzip]] では設定されることはありませんでした。 [SRC[>>19]]
-*-*-
[69] [DFN[FEXTRA]] が設定されている場合、
余剰欄が存在することを表します。 [SRC[>>19]]
-*-*-
[70] [DFN[FNAME]] が設定されている場合、
元のファイル名が存在することを表します。 [SRC[>>19]]
-*-*-
[77] [DFN[FCOMMENT]] が設定されている場合、
コメントが存在することを表します。 [SRC[>>19]]
-*-*-
[78] 予約ビットは、 [N[0]] でなければなりません。 [SRC[>>19]]
** MTIME
[83] [DFN[[ABBR[MTIME][Modification TIME]]]] は、
元のファイルが最も直近で修正された時刻を表します。 [SRC[>>19]]
[85] 圧縮されたデータが[[ファイル]]由来でない場合は、
[[圧縮]]が開始された[[時刻]]とします。 [SRC[>>19]]
[84] [[時刻]]は、 [[Unix time]] の[[秒]]数です。 [SRC[>>19]]
[86] [N[0]] は、[[タイムスタンプ]]が利用できないことを表します。 [SRC[>>19]]
[90] 値は4バイトの[[符号無し整数]]であり、[[ネットワークバイト順]]となります。
** XFL
[91] [DFN[[ABBR[XFL][eXtra FLags]]]] は、
[[CM]] 依存のフラグ群で、1バイトあります [SRC[>>19]]。
[92] [[CM]] が [N[8]] の時、次のフラグがあります [SRC[>>19]]。
- [[XFL]] = [N[2]] は、[[圧縮器]]が最大圧縮の最遅のアルゴリズムを使ったことを表します。
- [[XFL]] = [N[4]] は、[[圧縮器]]が最速アルゴリズムを使ったことを表します。
[93] その他の値は定義されていません。
** OS
[94] [DFN[[ABBR[OS][Operating System]]]] は、
圧縮した[[ファイルシステム]]種別を表す1バイトの値です。 [SRC[>>19]]
[95] テキストファイルの[[改行]]の決定に便利かもしれません。 [SRC[>>19]]
[96] 次の値が定義されています [SRC[>>19]]。
- [N[0]] - [[FAT]]
- [N[1]] - [[Amiga]]
- [N[2]] - [[VMS]] ([[OpenVMS]] 含む)
- [N[3]] - [[Unix]]
- [N[4]] - [[VM/CMS]]
- [N[5]] - [[Atari TOS]]
- [N[6]] - [[HPFS]]
- [N[7]] - [[Macintosh]]
- [N[8]] - [[Z-System]]
- [N[9]] - [[CP/M]]
- [N[10]] - [[TOPS-20]]
- [N[11]] - [[NTFS]]
- [N[12]] - [[QDOS]]
- [N[13]] - [[Acorn RISCOS]]
- [N[255]] - 未知
** XLEN
[97] [DFN[[ABBR[XLEN][eXtra LENgth]]]]
は、 [[FEXTRA]] が設定されている場合のみ存在し、
余剰欄の長さを表します。 [SRC[>>19]]
** 元のファイル名
[71] [DFN[[RUBYB[元のファイル名]@en[original file name]]]]は、
[[FNAME]] が設定されているときに存在します [SRC[>>19]]。
[74] [[元のファイル名]]は、圧縮された[[ファイル]]の元の名前であり、
[[ディレクトリ名]]は含みません。 [SRC[>>19]]
[75] 圧縮された[[ファイル]]が[[大文字・小文字不区別]]な[[ファイルシステム]]上にある場合、
[[小文字]]とします。 [SRC[>>19]]
[73] [[元のファイル名]]は、
[[ISO 8859-1]] [[文字]]で構成されなければなりません。 [SRC[>>19]]
[72] [[元のファイル名]]は、
[N[0x00]] の[[バイト]]で終端します。 [SRC[>>19]]
[76] 名前のある[[ファイル]]以外を圧縮した時は、元のファイル名はありません。 [SRC[>>19]]
** コメント
[79] [RUBYB[コメント]@en[comment]]は、
[[FCOMMENT]] が設定されているときに存在します [SRC[>>19]]。
[80] このコメントは、[[人間]]向けのものです [SRC[>>19]]。
[81] コメントは [[ISO 8859-1]] [[文字]]で構成されます。
[[改行]]は、1つの [[0x0A]] で表すべきです。 [SRC[>>19]]
[82] コメントは、
[N[0x00]] の[[バイト]]で終端します。 [SRC[>>19]]
** CRC32
[98] [DFN[[ABBR[CRC32][CRC-32]]]] は、
未圧縮データの [[CRC-32]] 値です。 [SRC[>>19]]
** ISIZE
[99] [DFN[[ABBR[ISIZE][Input SIZE]]]] は、
未圧縮データのサイズ [[mod]] 2[SUP[32]] です。 [SRC[>>19]]
* 符号化 (圧縮)
[53] [[圧縮器]]は、 [[RFC 1952]] の要件をすべて満たす[[ファイル]]を生成しなければなりません
[SRC[>>19]]。
* 復号 (展開)
[54] [[展開器]]は、適合する[[ファイル]]をすべて[[受理]]し、
[[展開]]できなければなりません。 [SRC[>>19]]
* MIME 型
[REFS[
- [6] [CITE@en[RFC 6713 - The \x27application/zlib\x27 and \x27application/gzip\x27 Media Types]] ([TIME[2012-08-21 12:20:47 +09:00]] 版) <http://tools.ietf.org/html/rfc6713>
]REFS]
- [CODE(MIME)@en[[[application/zlib]]]]
- [CODE(MIME)@en[[[application/gzip]]]]
- [CODE(MIME)@en[[[application/gzip-compressed]]]]
- [CODE(MIME)@en[[[application/gzipped]]]]
- [CODE(MIME)@en[[[application/x-gunzip]]]]
- [CODE(MIME)@en[application/x-gzip]]
- [CODE(MIME)@en[[[application/x-gzip-compressed]]]]
- [CODE(MIME)@en[[[gzip/document]]]]
* 内容符号化・転送符号化 [CODE(HTTP)@en[gzip]]
[7] [[HTTP]] の[[内容符号化]]と[[転送符号化]] [DFN[[CODE(HTTP)@en[[[gzip]]]]]]
は、 [[gzip]] [[ファイル圧縮]]プログラムが生成する [[LZ77]]
[[符号化]]と32ビット [[CRC]] による[[符号化]] [SRC[[[RFC 1952]]]]
を表します [SRC[>>8, >>11, >>12]]。
** 名前
[9] [[内容符号化]]と[[転送符号化]]の名前は [CODE(HTTP)@en[[[gzip]]]] です [SRC[>>8, >>11]]。
[10] [[受信者]]は [DFN[[CODE(HTTP)@en[[[x-gzip]]]]]] も等価として扱う[['''べきです''']]
[SRC[>>8, >>11]]。
** 処理
[18] [[FCAST]] の実装は、 [CODE(HTTP)@en[[[Content-Encoding:]] [[gzip]]]]
に対応しなければ[['''なりません''']] [SRC[>>17]]。
* 実装
[2] [[Perlでのgzipの圧縮・展開]]
[1] [[WinIE]] の gzip 展開処理ってすごく遅くないですか?
* HTTP での実例
[28] [CODE(HTTP)@en[Content-Type:]] が [CODE(MIME)@en[application/x-gzip]]
で、 [CODE(HTTP)@en[Content-Encoding:]] が無しのもの:
[FIG(list)[
- [24] [CITE[Index of /archives]] ([TIME[2016-05-05 23:39:14 +09:00]]) <http://www.ring.gr.jp/archives/>、[CODE[.gz]] や [CODE[.tgz]]
- [26] [[GitHub]] の [CODE[.tar.gz]] ファイルのダウンロード
[TIME[2016-05-05T14:42:39.00Z]]
- [27] [[SourceForge]] の [CODE[.gz]] [TIME[2016-05-05T14:58:43.100Z]]
- [29] [[ViewVC]] の [CODE[.tar.gz]] を生成してダウンロード [TIME[2016-05-05T14:58:44.400Z]]
- [30] [[search.cpan.org]] [TIME[2016-05-05T15:01:09.700Z]]
- [33] [CITE[cURL: tar.gz from Mirrors]] ([TIME[2016-05-06 00:08:38 +09:00]]) <https://curl.haxx.se/latest.cgi?curl=tar.gz> の[[ミラーサイト]]4つのうち3つ
- [35] [CITE@en[OpenSSL]] ([[OpenSSL Foundation, Inc.]]著, [TIME[2016-05-06 00:09:56 +09:00]]) <https://www.openssl.org/source/>
- [36] [CITE@en[DBMail: Download]] ([TIME[2016-05-06 00:12:55 +09:00]]) <http://www.dbmail.org/index.php?page=download>
- [43] [CITE[Index of /pub/linux/kernel/v3.x]] ([TIME[2016-05-06 00:26:44 +09:00]]) <https://www.kernel.org/pub/linux/kernel/v3.x/>
- [44] [CITE[EPIwm Download]] ([TIME[2016-05-06 00:30:00 +09:00]]) <http://www.nongnu.org/epiwm/download.html>
[[IIS]]
- [46] [CITE@en[CRAN Packages By Name]] ([TIME[2016-05-05 23:05:08 +09:00]]) <https://cran.r-project.org/web/packages/available_packages_by_name.html>
- [50] [CITE@en-US[Downloads – old software | The Arda Network]] ([TIME[2016-05-06 00:41:41 +09:00]]) <http://www.arda.homeunix.net/downloads-old-software/>
[CODE(HTTP)@en[[[Content-Transfer-Encoding:]] [[binary]]]] もあり
]FIG]
[32] [CODE(HTTP)@en[Content-Type:]] が [CODE(MIME)@en[application/octet-stream]]
で [CODE(HTTP)@en[Content-Encoding:]] は無しのもの:
[FIG(list)[
- [25] [[SourceForge]] の [CODE[.tgz]]
[TIME[2016-05-05T14:53:08.800Z]]
- [31] [CITE[Index of /download/]] ([TIME[2016-05-06 00:04:45 +09:00]]) <http://nginx.org/download/>
- [34] [CITE[cURL: tar.gz from Mirrors]] ([TIME[2016-05-06 00:08:38 +09:00]]) <https://curl.haxx.se/latest.cgi?curl=tar.gz> の[[ミラーサイト]]4つのうち1つ
- [45] [CITE@en[PyPI - the Python Package Index : Python Package Index]] ([TIME[2016-05-06 00:31:58 +09:00]]) <https://pypi.python.org/pypi>
- [49] [CITE[The Tengine Web Server]] ([TIME[2016-05-04 22:49:39 +09:00]]) <http://tengine.taobao.org/download.html>
]FIG]
[41] [CODE(HTTP)@en[Content-Type:]] が [CODE(MIME)@en[application/binary]]
で [CODE(HTTP)@en[Content-Encoding:]] は無しのもの:
[FIG(list)[
- [40] [CITE[Index of /libsodium/releases/]] ([TIME[2016-05-06 00:20:42 +09:00]]) <https://download.libsodium.org/libsodium/releases/>
]FIG]
[48] [CODE(HTTP)@en[Content-Type:]] が [CODE(MIME)@en[binary/octet-stream]]
で [CODE(HTTP)@en[Content-Encoding:]] は無しのもの:
[FIG(list)[
- [47] [CITE@en[Downloads - Snort.Org]] ([TIME[2016-05-06 00:38:07 +09:00]]) <https://www.snort.org/downloads>
]FIG]
[37] [CODE(HTTP)@en[Content-Type:]] が展開後のファイル形式で、
[CODE(HTTP)@en[Content-Encoding:]] が [CODE[gzip]] のもの:
[FIG(list)[
- [38] [CITE@en[Index of /rrdtool/pub]] ([TIME[2016-05-06 00:15:48 +09:00]]) <http://oss.oetiker.ch/rrdtool/pub/>
]FIG]
;; [39] [[ダウンロード]]すると、 [[Chrome]] は展開したものを保存し、
[[Firefox]] は圧縮されたものを保存するようです。
[TIME[2016-05-05T15:18:52.000Z]]
[22] [CITE[Directory Listing: /]] ([TIME[2016-05-05 23:31:43 +09:00]]) <http://ftp.mozilla.org/>
[23] >>22 [[gzip]] ファイルに [CODE(HTTP)@en[Content-Encoding:]] はありませんが、
[CODE(HTTP)@en[Content-Type:]] は展開後のファイル形式を表している、
という変な状態になっています。 [TIME[2016-05-05T14:33:27.300Z]]
* 歴史
[55] [[gzip]] の[[仕様書]]の
4.1 版、
4.2 版、
4.3 版に技術的な違いはありません。 4.3 が [[RFC 1952]] です。 [SRC[>>19]]
** 実現値操作 [CODE(HTTP)@en[gzip]]
[14] [[実現値操作]] [DFN[[CODE(HTTP)@en[[[gzip]]]]]] は、
[[内容符号化]] [CODE(HTTP)@en[[[gzip]]]] と同じです [SRC[>>13]]。
[16] [CODE(HTTP)@en[[[gdiff]]]] や [CODE(HTTP)@en[[[diffe]]]] は[[圧縮]]によって大きくサイズを削減できますから、
[CODE(HTTP)@en[[[gzip]]]] も実装することが[RUBYB[強く推奨]@en[strongly recommended]]されています [SRC[>>15]]。
[REFS[
- [13] [CITE@en[RFC 3229 - Delta encoding in HTTP]] ([TIME[2014-10-26 21:15:25 +09:00]] 版) <http://tools.ietf.org/html/rfc3229#section-10.1>
- [15] [CITE@en[RFC 3229 - Delta encoding in HTTP]] ([TIME[2014-10-26 21:15:25 +09:00]] 版) <http://tools.ietf.org/html/rfc3229#section-10.9>
]REFS]
[89] [[IANA登録簿]]には [[RFC 2616]] を出典として登録されています [SRC[>>88]]。
[[RFC 723x]] 出版後も出典は更新されていません。 [TIME[2014-11-19T16:22:24.500Z]]
[REFS[
- [88] [CITE[Instance Manipulation Values]] ([TIME[2014-01-31 02:45:13 +09:00]] 版) <http://www.iana.org/assignments/inst-man-values/inst-man-values.xhtml>
]REFS]
* メモ
[52] 圧縮データへの[[ランダムアクセス]]は設計上想定外とされています [SRC[>>19]]。
[3][CITE@en[gzip - Wikipedia, the free encyclopedia]] ([TIME[2008-11-12 13:59:37 +09:00]] 版) <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] [CITE[gzip - Wikipedia, the free encyclopedia]] (Referenced: [TIME[2009-07-17T21:25:15+09:00]])
<http://en.wikipedia.org/wiki/Gzip>
[20] [CITE@en[RFC 6713 - The 'application/zlib' and 'application/gzip' Media Types]]
([TIME[2015-09-27 13:20:11 +09:00]] 版)
<https://tools.ietf.org/html/rfc6713>
[21] [CITE@ja[gzip - Wikipedia]]
([TIME[2016-01-31 22:25:05 +09:00]] 版)
<https://ja.wikipedia.org/wiki/Gzip>
[42] [CITE@en[233047 – From some download servers, browser uncompresses gzip file, but keeps gz extension. Download manager is confused over file size and time remaining (nsBinaryDetector)]]
( ([TIME[2016-05-06 00:23:32 +09:00]]))
<https://bugzilla.mozilla.org/show_bug.cgi?id=233047>