一. 实体和编码
在头部信息中,需要标注实体的类型(content-type)、大小(content-length)、自然语言(content-language)、编码(content-encoding)
content-length相关:
- 检测截尾 - 在持久连接中分割数据
- 压缩后实际传输的长度而不是压缩之前
- content-length可以忽略的情况:
- 使用HEAD等方法只获取头部的时候
- 含有transfer-encoding时,该编码方式通过结尾是一个特定长度字符串(比如zero-byte chunk)时,表示结尾
- multipart/byteranges的分部传输,则需要每一部说明自己的大小
客户端可以通过accept-encoding来向服务器请求自己能够接受的编码方式,并使用q(0 ≤ q ≤ 1)值来表示对编码方式的偏爱度。
差异编码 - 服务器可以只告诉客户端或者代理服务器与之前缓存版本不一样的地方,客户端只需要替换修改就可以获得新的页面。
二. 国际化
字符集是根据一定协议将计算机编码转变为自然语言文字的对应表集合。
客户端可以通过accept-language来向服务器请求自己能够接受的自然语言。
三. 内容协商与转码
协商主要是指服务器提供多个页面(比如电脑端、手机端;不同语言版本等),传输给用户最适合的那一个。
协商的主要方式:
- 客户端驱动的协商
a. 客户端发送请求
b. 服务器提供2个版本供客户端选择
c. 客户端选择后再次请求
d. 服务器返回目标页面
这种方法需要进行多次传输,并且造成uri冗杂 - 服务器驱动的协商
服务器通过header的内容来猜测传输给用户什么 - 透明协商
使用中间代理来进行报文交换的最小化实现
根据vary首部向不同的客户端提供不同的版本,并随时替换缓存。