第四部分:实体、编码和国际化
第15章 实体和编码
报文是箱子,实体是货物
实体首部指出这是一个纯文本文档,18 个字节长。一个空白行把首部字段和主体分隔开。
HTTP/1.1 版定义10个基本实体首部字段:
- Content-Type 实体中所承载对象的类型
- Content-Length 实体主体的长度
- Content-Language 语言
- Content-Encoding 对象数据所做的变换
- Content-Location 请求时可通过它获得对象
- Content-Range 如果当前是部分实体,这个会说明它是整体哪部分的
- Content-MD5 实体主体内容校验和
- Last-Modified 主体在服务器最后的修改日期
- Expires 实体数据失效日期
- Allow 该资源所允许的请求方法
- ETag 该文档特定实例的唯一验证码
- Cache-Control 缓存
实体主体
实体主体:在空白的 CRLF 行之后。
Content-Length:实体的大小
检测截尾
客户端通过 Content-Length 来检测报文结束是正常的连接关闭,还是服务器崩溃导致的连接关闭。
错误的Content-Length
HTTP/1.1 规定用户 Agent 代理应该在接收且检测到无效长度时通知用户。
持久连接
使用持久连接时可以没有 Content-Length,即采用分块编码。
内容编码
如果主体进行了内容编码,Content-Length 说明的是编码后的长度。
实体摘要
服务器使用 Content-MD5 发送对实体主体运行 MD5 算法的结果,来验证报文在传输是否被修改。
媒体类型和字符集
Content-Type 首部说明了主体的 MIME 类型。
文本的字符编码
Content-Type: text/html; charset=iso-8859-4
多部分表格提交
Content-Type: multipart/form-data; boundary=[a-z]
boundary 参数说明了分割主体不同部分所用的字符串(相当于自定义分隔符),如下所示:表格提交了 Sally 和文本文件 essayfile.txt。
内容编码
服务器对主体进行编码,有助于减少传输时间,或防止第三方看到文档的内容。内容编码是对报文主体进行的可逆变化。
Accept-Encoding首部
为了避免服务器使用客户端不支持的编码方式,客户端就把自己支持的内容编码方式列表放在 Accept-Encoding 首部里发出去。
传输编码和分块编码
传输编码也是作用在实体主体的可逆变化,但使用传输编码是为了改变报文中的数据在网络上的传输方式。
可靠传输
在少数情况下,所传输的报文主体可能会引发问题,如下:
- 未知尺寸:如果不先生成内容,某些应用程序和内容编码器就无法确定报文主体的最终大小。通常,这些服务器希望在知道大小之前就开始传输数据,故有些服务器就使用传输编码来发送数据。
- 安全性:可以用传输编码来把报文内容扰乱,然后在共享的传输网络上发送。不过现在有 SSL,很少靠传输编码来实现安全性。
Transfer-Encoding首部
Transfer-Encoding 告知接收方为了可靠地传输报文,已经对其进行了何种编码。
分块编码
分块编码把报文分割为若干个大小已知的块,块之间是紧挨着发送的,这样就不需要在发送之前知道整个报文的大小了。分块编码是一种传输编码,因此是报文的属性,而不是主体的属性。
分块与持久连接
当使用持久连接时,如果服务器动态创建内容,就可能在发送之前无法知道主体的长度。为解决这个问题,只要允许服务器把主体逐块发送,说明每块的大小就可以,即分块编码。每个分块包含一个长度值和该分块的数据。
分块报文的拖挂
可以在分块的报文最后加上拖挂。拖挂的内容是可选的元数据。
随时间变化的实例
网站对象并不是静态的,同样的 URL 会随时间变化而指向对象的不同版本。HTTP 规定了称为实例操控的一系列请求和响应操作,用以操控对象的实例。
验证码和新鲜度
新鲜度
服务器应当告知客户端能够将内容缓存多长时间,在这个时间之内就是新鲜的。
有条件的请求与验证码
为了不浪费网络带宽,HTTP 为客户端提供了一种方法,仅当资源改变时才请求副本,这种特殊请求称为有条件的请求。
第16章 国际化
暂无笔记。
第17章 内容协商与转码
客户端驱动的协商
客户端发起请求,服务器发送可选项的列表,客户端选择。
服务器驱动的协商
服务器检查客户端的请求首部集,并决定提供哪个版本的页面。
透明协商
某个中间设备(通常是缓存代理)代表客户端进行请求协商。