《http权威指南》阅读笔记(十)
在http请求过程中,可以对实体内容进行编码
通过content-encoding头部说明,一般使用 gzip,conpress,deflate,identity
默认是identity,不对实体进行编码,使用最广泛的是gzip,主要是用来对内容进行压缩,减少网络传输的数据
头部使用accept-encoding来说明客户端可以那些编码,可以使用指定多个,说明优先级,编码之间用;隔开
content-type,实体MIME类型 text/html 一般有主类型和子类型,这个可以在MIME中心进行注册
content-length 这个比较重要,实体的长度,主要是在http1.1中作为数据发送完成的标示
在http1.0中,如果没有持久化连接,那么服务器端关闭socket连接就说明内容发送完成
在http1.1中,默认是持久化连接,客户端和服务器端根据content-length来表明数据发送完成,可以发送下一次请求,如果content-length和实际的length不匹配,会带来严重的问题,在http1.1中,如果socket异常关闭了,可以检测内容发送是否完整
考虑到一种情况,由于需要完全生成好实体内容,才可以计算出来content-length头部,对于动态内容,很难进行计算,一般都是解析一部分,发送一部分。这样的话,就必须约定一个实体内容结束标记,取代content-length标签
可以用transfer-encoding,用在服务器响应报文里面,目前只有分块chunked 编码
chunked编码基本规则:
报文长度
报文内容
CRLF
报文长度
报文内容
CRLF
0
客户端检测字节的长度,说明报文发送完成,客户端可以发起下一次请求
multipart/form-data 类型的报文,这个是类似邮件传送的报文一样,可以传送多个部分,通过boundray标记多个部分
客户端可以进行范围请求
通过头部Range:4000-10000
说明请求服务器的实体内容从4000字节开始,到第10000字节结束,应该是左闭右开
这个在P2P网络用的比较多,想一些多线程下载软件就是这么干的,第一次通过head请求,服务器响应内容长度
客户端开启N个线程,用content-length/N进行拆分,进行部分请求,然后在把下载的内容进行组合,终于知道这个原理了
还有增量请求,通过条件请求来进行
条件请求头部:
If-Modified-Since,If-Unmodified-Since,If-Match,If-Not-Match
一般情况下,使用If-Not-Match和Etag请求,增量请求有一般几种算法。