Page 396 - HTTP权威指南
P. 396

15.6 传输编码和分块编码


                 前一节讨论的内容编码,是对报文的主体进行的可逆变换。内容编码是和内容的具
                 体格式细节紧密相关的。例如,你可能会用 gzip 压缩文本文件,但不是 JPEG 文
                 件,因为 JPEG 这类东西用 gzip 压缩的不够好。

                 本节讨论传输编码。传输编码也是作用在实体主体上的可逆变换,但使用它们是由
                 于架构方面的原因,同内容的格式无关。如图 15-5 所示,使用传输编码是为了改变
                 报文中的数据在网络上传输的方式。


                   经过内容编码的响应
                    HTTP/1.0 200 OK
                    Content-encoding: gzip  标准的首部块
                    Content-type: text/html
                    [...]
                    [encoded message]       标准的实体(只
                                            是经过了编码)          经过内容编码的报文,只是对报文的实
                                                             体部分进行了编码。而对于经过传输编
                                                             码的报文来说,编码作用在整个报文上,
                   经过传输编码的响应
                                                             报文自身的结构发生了改变。
                    HTTP/1.1 200 OK
                    Transfer-encoding: chunked  基本的首部
                    10
                    abcdefghijk                经过编码的块
                    1
                    a

                 图 15-5 内容编码和传输编码的对比


                 15.6.1 可靠传输

                 长久以来,在其他一些协议中会用传输编码来保证报文经过网络时能得到“可靠传
                 输”。在 HTTP 协议中,可靠传输关注的焦点有所不同,因为底层的传输设施已经标
                 准化并且容错性更好。在 HTTP 中,只有少数一些情况下,所传输的报文主体可能
                 会引发问题。其中两种情况如下所述。

                 •   未知的尺寸
                    如果不先生成内容,某些网关应用程序和内容编码器就无法确定报文主体的最终
                    大小。通常,这些服务器希望在知道大小之前就开始传输数据。因为 HTTP 协议                                    354
                    要求 Content-Length 首部必须在数据之前,有些服务器就使用传输编码来发



                                                                           实体和编码   |   371
   391   392   393   394   395   396   397   398   399   400   401