概述
最近对http很感兴趣,于是开始看《http权威指南》。别人都说这本书有点老了,而且内容太多。我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做,还告诉你为什么这么做。于是我把学到的知识点记录下来,供以后开发时参考,相信对其他人也有用。
实体和编码
1.http要确保它所承载的“货物”满足以下条件:
- 可以被正确的识别。(通过Content-Type首部说明媒体格式,Content-Language首部说明语言)
- 可以被正确的解包。(通过Content-Length首部和Content-Encoding首部)
- 是最新的。(通过实体验证码和缓存过期控制)
- 符合用户的需要。(基于Accept系列的内容协商首部)
- 在网络上可以快速有效地传输。(通过范围请求、差异编码以及其他数据压缩方法)
- 完整到达、未被篡改。(通过传输编码首部和Content-MD5校验和首部)
2.http的早期版本通过Content-Length来检测报文截尾,如果缓存服务器收到被截尾的报文却没有识别出截尾的话,它可能会储存不完整的内容并多次使用它来提供服务。Content-Length首部对于持久连接也是必不可少的,不然无法知道报文在何处结束,下一条报文从何处开始。
3.在使用分块编码的情况下,使用持久连接时可以没有Content-Length首部。
4.为了检测实体主体的数据是否被不经意地修改,发送方可以在生成初始的主体时,生成一个数据的校验和,用Content-MD5首部来发送。
5.Content-Type首部字段说明了实体主体的MIME类型。它还支持可选的参数来进一步说明内容的类型,比如下面的charset参数:
Content-Type: text/html;charset=iso-8859-4
6.Accept-Encoding字段包含用逗号分隔的支持编码的列表。并且可以给每种编码附带Q(质量)值参数来说明编码的优先级。
7.内容编码是对报文的主体进行的可逆变换,比如gzip,但是用gzip压缩JPEG这类东西效果不够好。这个时候就用传输编码了。使用传输编码是为了改变报文中的数据在网络上传输的方式,比如分块传输。
8.Transfer-Encoding告诉接收方为了可靠地传输报文,已经对其进行了何种传输编码。而TE用在请求首部中,告知服务器可以使用哪些传输编码扩展。
9.对于分块编码来说,服务器可以使用大小为0的块作为主体结束的信号,所以它不需要Content-Length首部。
10.范围请求:http还允许客户端实际上只请求文档的一部分,或者说某个范围。比如说下载重连,这个时候就从某个范围(Range首部字段)开始请求。当然前提是这段时间内,该对象没有改变过。
11.Range首部在流行的P2P(Peer-to-Peer)文件共享客户端软件中得到广泛应用,他们从不同的对等实体同时下载多媒体文件的不同部分。
12.差异编码:差异编码是http协议的一个扩展,它通过交换对象改变的部分而不是完整的对象来优化传输性能。客户端使用A-IM首部(Accept-Instance-Manipulation)来说明可以接受的差异编码算法,服务端通过IM响应收不来说明使用的是哪个差异编码算法。