声明:本人的所有博客皆为个人笔记,作为个人知识索引使用,因此在叙述上存在逻辑不通顺、跨度大等问题,希望理解。分享出来仅供大家学习翻阅,若有错误希望指出,感谢!
HTTP报文内的HTTP信息
HTTP报文结构
HTTP报文是由多行数据构成的字符串文本,使用CR+LF换行
CR:回车符:\r LF:换行符:\n
HTTP报文大致可分为报文首部和报文主体两部分,二者由最初的空行(CR+LF)来划分
通常,不一定要有报文主体
请求报文首部
- 请求行
- 请求首部字段
- 通用首部字段
- 实体首部字段
- 其他首部字段
相应报文首部
- 状态行
- 响应首部字段
- 通用首部字段
- 实体首部字段
- 其他首部字段
请求行:包含用于请求的方法、请求URI和HTTP版本
状态行:包含表明响应结果的状态码、原因短语和HTTP版本
首部字段:包含请求和响应的各种条件和属性的各类首部
其他:可能包含HTTP的RFC里未定义的首部(cookie等)
编码提升传输效率
HTTP在传输数据时可以按照数据原貌直接传输,也可以在传输过程中通过编码提升传输效率
编码操作需要计算机来完成,因此会消耗更多cpu资源(牺牲cpu资源来提升传输效率)
HTTP中有一种被称为内容编码的功能可以进行压缩操作
报文主体与实体主体的区别
报文:HTTP的基本通信单位,由8位组字节流组成
实体:作为请求或响应的有效荷载数据被传输,其内容由实体首部和实体主体组成
通常报文主体等于实体主体,只有传输过程中进行编码操作时,实体主体的内容发生变化,导致它和报文主体产生差异
分割发送的分块传输编码
在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面,在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面,这种把实体主体分块的功能称为分块传输编码
分块传输编码会把实体主体分成多个部分,每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用(CR+LF)来标记
使用分块传输编码的实体主体会由接收的客户端负责解码
发送多种数据的多部分对象集合
HTTP协议支持多部分对象集合,发送的一份报文主体内可含有多类型实体
多部分对象集合包含对象如下:
- multipart/form-data:在web表单文件上传时使用
- multipart/byteranges:状态码206响应报文包含了多个范围的内容时使用
在HTTP报文中使用多部分对象集合时,需要在首部字段里加上Content-type
多部分对象集合的每个部分类型中,都可以含有首部字段
获取部分内容的范围请求
指定范围发送的请求叫做范围请求,可以用于实现下载的中断恢复
执行范围请求时,会用到首部字段Range来指定资源的byte范围
byte范围指定形式如下:
- Range:bytes=5001-10000 //获取5001~10000字节
- Range:bytes=5001- //获取5001字节之后的全部
- Range:bytes=0-3000,5000-7000 //从最开始到3000字节和5000~7000字节的多重范围
针对范围请求,响应会返回状态码为206的响应报文,响应报文中的Content-Range指定范围的实体内容
对于多重范围的范围请求,响应会在首部字段Content-Type标明multipart/byteranges后返回响应报文
如果服务器无法响应范围请求,则会返回状态码 200 OK 和完整的实体内容
内容协商返回最合适的内容
内容协商机制是指客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源
内容协商会以语言、字符集、编码方式等为基准判断响应的资源
包含在请求报文中的某些首部字段为判断的基准:
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
内容协商技术有以下3种类型:
- 服务器驱动协商:由服务器端进行内容协商,以请求的首部字段为参考,在服务器端自动处理
- 客户端驱动协商:由客户端进行内容协商,用户从浏览器提供的可选项列表中手动选择
- 透明协商:服务器驱动协商+客户端驱动协商