HTTP权威指南笔记(四 )
十五.实体和编码
1.报文是箱子,实体是货物
报文实体由报文首部和实体主体组成
2.Content-Length:实体的大小
该首部指示出报文中实体主体的字节大小
(1)检测截尾
(2)错误的长度信息
(3)对于持久连接必不可少
(4)如果进行了内容编码,则是编码后的字节长度
(5)确定实体主体长度的规则
- 如果特定的HTTP报文类型不允许带有主体,就忽略该首部(诸如HEAD请求)
- 如果含有描述传输编码的Transfer-Encoding首部,那么实体就应该由“零字节块”结束
- 如果有Content-Length并且没有Transfer-Encoding,则指示了实体长度
- 如果使用了multipart/byteranges,且没有使用Content-Length,那么多报文每个部分都要说明自身的长度
- 如果都不匹配,实体就在连接关闭的时候结束
HTTP/1.1建议对于没有Content-Length首部的请求,发送400/411响应
3.实体摘要
为检测实体主体的数据是否被不经意地修改,发送方可以在生成初始的主体时,生成一个数据的校验和,这样接收方就可以通过检查这个校验和来捕获所有意外的实体修改
服务器使用Content-MD5首部发送对实体主体运行MD5算法的结果,只有产生响应的原始服务器可以计算并发送Content-MD5首部
4.媒体类型和字符集
Content-Type首部说明了实体主体的MIME类型,还支持可选的参数来进一步说明内容的类型,诸如charset等
5.内容编码
(1)内容编码过程
- 网站服务器生成原始响应报文,带有Content-Type和Content-Length首部
- 内容编码服务器创建编码后的报文,同时添加Content-Encoding首部
- 接收程序得到编码后的报文进行解码,获得原始报文
(2)内容编码类型
Content-Encoding值 | 描述 |
---|---|
gzip | 表明采用GNU zip编码 |
compress | 表明实体采用Unix的文件压缩程序 |
deflate | 表明实体是用zlib格式压缩的 |
identity | 表明没有对实体进行编码 |
以上三种编码都是无损,gzip效率最高,使用最多
(3)Accept-Encoding首部:表明客户端可以接收的编码方式
6.传输编码和分块编码
经过内容编码的报文,只是对报文的实体主体部分进行了编码;经过传输编码的报文,编码作用于整个报文,报文自身的结构发生了变化
(1)可靠传输
(2)Transfer-Encoding首部:用于告知接收方为了可靠的传输报文,已经对其进行了传输编码;TE首部:用于请求首部中,告知服务器可以使用那些传输编码扩展
(3)分块编码:把报文分割成若干个大小已知的块;分块编码是一种传输编码,因此是报文的属性,而不是主体的属性
- 分块与持久连接:在持久连接时,如果服务器动态生成内容,可以使用分块技术解决;它由起始的响应首部开始,随后是一系列分块,每个分块包含一个长度值和该分块的数据;长度使用16进制表示并且用CRLF与数据分隔;最后用长度为0的块表示结束
- 分块报文的拖挂:在0长度的结束报文之后添加
(4)内容编码和传输编码的结合
(5)传输编码的规则
7.随时间变化的实例
8.验证码和新鲜度
(1)新鲜度:服务器应当告知客户端能够将内容缓存多长时间,在这个时间之内就是新鲜的;可以使用Expires和Cache-Control首部
Cache-Control首部
指令 | 报文类型 | 描述 |
---|---|---|
no-cache | 请求 | 在重新向服务器验证之前,不要返回文档的缓存副本 |
no-store | 请求 | 不要返回文档的缓存副本,不要保存服务器的响应 |
max-age | 请求 | 缓存中的文档不能超过指定的使用期 |
max-stale | 请求 | 文档允许过期,但是不能超过指令中的指定的过期值 |
min-fresh | 请求 | 响应必须在指定的这段时间保持新鲜 |
no-transform | 请求 | 文档在发送之前不允许转换 |
only-if-cached | 请求 | 只有当文档在缓存中才发送,不要联系原始服务器 |
public | 响应 | 响应可以被任何服务器缓存 |
private | 响应 | 响应可以被缓存,但是只能被单个客户端访问 |
no-cache | 响应 | 有首部列表,可以缓存并提供给客户端,但要删除首部列表;没有指定首部,缓存中的副本在没有重新向服务器验证之前不能提供给客户端 |
no-store | 响应 | 响应不允许被缓存 |
no-transform | 响应 | 响应在提供给客户端之前不能做任何形式的修改 |
must-revalidate | 响应 | 响应在提供给客户端之前必须重新向服务器验证 |
proxy-revalidate | 响应 | 共享的缓存在提供给客户端之前必须向原始服务器验证 |
max-age | 响应 | 指定文档可以被缓存的时间以及新鲜度的最长时间 |
s-max-age | 响应 | 指定文档作为共享缓存的最长使用时间 |
(2)有条件的请求和验证码
仅当资源改变时才请求副本,这种特殊请求称为有条件的请求
请求类型 | 验证码 | 描述 |
---|---|---|
If-Modified-Since | Last-Modified | 如果在前一条响应的Last-Modified中说明的时间之后,资源的副本发生了变化,就发送其副本 |
If-Unmodified-Since | Last-Modified | 如果在前一条响应的Last-Modified中说明的时间之后,资源的副本没有变化,就发送其副本 |
If-Match | ETag | 如果实体的标记与前一次响应首部中ETag相同,就发送资源副本 |
If-None-Match | ETag | 如果实体的标记与前一次响应首部中ETag不同,就发送资源副本 |
HTTP把验证码分为两类:弱验证码和强验证码
弱验证码不一定能唯一标识一个资源,而强验证码必须唯一标识
9.范围请求
客户端可以通过range首部来请求某个范围的数据;服务器通过Accept-Ranges向客户端说明可以接受的范围请求
10.差异编码:通过交换对象改变的部分而不是完整的对象来优化传输性能
十六.国际化
1.HTTP对国际性内容的支持
服务器通过Content-Type和Content-Language告知客户端文档的字母表和语言
客户端发送Accept-Charset和Accept-Language告知服务器它理解哪些字符集编码和语言以及优先顺序
2.字符集和HTTP
(1)字符集是把字符转换为二进制码的编码:charset参数用来告知客户端如何把内容中的二进制码转换为字符
(2)工作过程:根据编码方案解码,使用编码后的字符集找到字符,最后显示
(3)字符集不对,字符就不对
(4)标准化的MIME charset值
(5)Content-Type首部和charset首部以及META标志:如果首部中没有标明字符集,HTML中的META中也可能会有字符相关的信息
(6)Accept-Charset首部:客户端明确告知服务器它支持哪些字符系统
其余略
十七.内容协商与转码
内容协商技术:客户端驱动、服务器驱动以及透明驱动
技术概要
技术 | 工作原理 | 优点 | 缺点 |
---|---|---|---|
客户端驱动 | 客户端发起请求,服务器发送可选项的列表,客户端选择 | 在服务器端的实现最容易,客户端可以选择合适的内容 | 增加了时延:为了获得正确的内容,至少要发送两次请求 |
服务器驱动 | 服务器检查客户端的请求首部集并决定提供哪个版本的页面 | 比客户端驱动要快,提供q值机制,允许服务器近似匹配,还提供vary首部告知下游设备如何对请求估值 | 如果结论不明确,服务器要猜测 |
透明 | 某个中间设备代表客户端进行请求协商 | 免除了web服务器的协商开销,比客户端驱动要快 | 没有正式规范 |
内容协商首部集
Accept首部 | 实体首部 |
---|---|
Accept | Content-Type |
Accept-Language | Content-Language |
Accept-Charset | Content-Type |
Accept-Encoding | Content-Encoding |
十八.Web主机托管
1.主机托管服务
2.虚拟主机托管
(1)虚拟服务器请求缺乏主机信息:HTTP/1.0中只发送了URL的路径部分
(2)设法让虚拟主机托管正常工作
- 通过URL路径进行虚拟主机托管:给每个逻辑网站一个专门的路径前缀
- 通过端口号进行虚拟主机托管:用户不愿意
- 通过IP地址进行虚拟主机托管:资源有限
- 通过Host首部进行虚拟主机托管
(3)HTTP/1.1的Host首部
3.使网站更可靠
(1)镜像的服务器集群:服务器集群是一排配置相同的Web服务器,互相可以替换。有一个主原始服务器和多个复制原始服务器
(2)内容分发网络CDN:对特定内容进行分发的专门网络
(3)CDN中的反向代理缓存
(4)CDN中的代理缓存
4.让网站更快
服务器集群和分布式代理缓存或反向代理服务器分散了网络流量,可以避免拥塞
十九.发布系统
略
二十.重定向和负载均衡
1.为什么要重定向:可靠的执行HTTP事务、最小化时延、节约网络带宽
2.重定向到何地:Web服务器会根据每个IP来处理请求。将请求分摊到复制的服务器中去,就意味着应该把对某特定URL的每条请求都发送到最佳的Web服务器上去
3.重定向协议概览:重定向的目标是尽快将HTTP报文发送到可用的Web服务器上去
4.通用的重定向方法
(1)HTTP重定向:处理重定向的服务器找到可用的负载最小的内容服务器,并将浏览器重定向到那台服务器上去;HTTP重定向的优点之一就是重定向服务器知道客户端的IP地址
缺点:需要原始服务器进行大量处理来判断要重定向到哪台服务器上去;增加了用户时延,因为访问界面要进行两次往返;如果重定向服务器出故障,站点就会瘫痪
(2)DNS重定向:DNS轮转,在Web服务器集群中平衡负载;大多数DNS客户端只会使用多地址集中的第一个地址,为了均衡负载,大多数DNS服务器都会在每次完成查询之后对地址进行轮转;其他算法包括负载均衡算法、邻接路由算法以及故障屏蔽算法
(3)任播寻址
(4)IP MAC 转发
(5)IP地址转发
(6)网元控制协议
5.代理的重定向方法
(1)显式浏览器配置
(2)代理自动配置
(3)Web代理自动发现协议
6.缓存的重定向方法
7.因特网缓存协议(ICP)
ICP允许缓存在其兄弟缓存中查找命中内容,避免查询原始服务器带来的更多开销
8.缓存阵列路由协议
9.超文本缓存协议