Page 386 - HTTP权威指南
P. 386

(a)HTTP响应报文中的text/plain类型的实体
                     HTTP/1.0 200 OK
                     Content-type: text/plain
                     Content-length: 18
                     Hi! I'm a message!
                          首部末尾的LF (0x0A= <LF>) 主体内容的开始 (0x48= "H")

                    (b)HTTP响应报文中的image/gif类型的实体
                     HTTP/1.0 200 OK
                     Content-Type: image/gif
                     Content-Length: 34867



                                            首部末      主体内     图像宽度 图像高度
                                            尾的LF    容的开始
                                          (0x0A= <LF>) ("GIF87a")(0x0227= 551) (0x0206= 518)


                 图 15-2 实际报文内容(紧随空白的 CRLF 之后的原始报文内容)的十六进制转储显示


                 15.2 Content-Length: 实体的大小


                 Content-Length 首部指示出报文中实体主体的字节大小。这个大小是包含了所有
                 内容编码的,比如,对文本文件进行了 gzip 压缩的话,Content-Length 首部就是
                 压缩后的大小,而不是原始大小。


                 除非使用了分块编码,否则 Content-Length 首部就是带有实体主体的报文必须使
                 用的。使用 Content-Length 首部是为了能够检测出服务器崩溃而导致的报文截
                 尾,并对共享持久连接的多个报文进行正确分段。


                 15.2.1 检测截尾

                 HTTP 的早期版本采用关闭连接的办法来划定报文的结束。但是,没有 Content-
                 Length 的话,客户端无法区分到底是报文结束时正常的连接关闭,还是报文传输                                      344
                 中由于服务器崩溃而导致的连接关闭。客户端需要通过 Content-Length 来检测
                 报文截尾。

                 报文截尾的问题对缓存代理服务器来说尤其严重。如果缓存服务器收到被截尾的报
                 文却没有识别出截尾的话,它可能会存储不完整的内容并多次使用它来提供服务。
                 缓存代理服务器通常不会为没有显式 Content-Length 首部的 HTTP 主体做缓存,
                 以此来减小缓存已截尾报文的风险。

                                                                           实体和编码   |   361
   381   382   383   384   385   386   387   388   389   390   391