了解请求和响应是怎样运作的
- HTTP报文
- HTTP请求报文和响应报文的结构
- 使用编码提升传输速率
- 发送多种数据的多部分对象数据集合
- 获取部分内容的请求范围
- 内容协商返回最合适的内容
Http报文
用于Http协议交互的信息叫做Http的报文<是一种由多行数据构成的字符串文本>
- 客户端发出的请求信息叫做请求报文
- 服务单发出的响应信息叫做响应报文
Http报文的基本结构
- 报文首部
- 报文主体
注意:
- 报文首部和报文主体由(CR(Carriage Return, 回车符:16进制 0x0d) + LF(Line Feed, 换行符:16进制 0x0a))划分开,
- 报文主体可以没有。不是必须的
HTTP请求报文和响应报文的结构
- 请求行:包含用于请求的方法,请求URI和HTTP版本
- 状态行:包含表面响应结果的状态码,原因短句和HTTP版本
首部字段:包含请求和响应的各种条件和属性的各类首部,有以下四种首部
- 通用首部字段
- 请求首部字段
- 响应首部字段
- 实体首部字段
- 其他:可能包含HTTP的RFC里未定义的首部(比如: Cookie)
使用编码提升传输速率
- 使用原数据进行传输,传输速率慢,但是不需要对数据进行处理。
- 进行编码提升传输速率,但是对原数据进行编码操作耗损cpu资源
- 常用的有两种编码方式,应用于不同的场景当中
- 内容的编码方式
- 分块的编码方式
报文主体和实体主体的差异
==报文主体,实体主体的区别==
- 报文:相当于一个载体,
- 实体:要传输的图片或者其他的资源
压缩传输的内容编码
HTTP协议当中有一种被称之为内容编码的功能,就是对实体进行打包压缩,内容编码指明应用在实体的内容之上的编码格式,并且保持实体信息原样压缩,内容编码后的实体由客户端进行解码。
HTTP协议常用的内容编码有以下几种
- gzip(GUN zip)
- compress(UNIX系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
分割发送的分块传输的编码
HTTP协议在传输大容量数据的时候,通过把数据进行分割成多块,能够在浏览器上面逐步显示,如果不能分割成为多块的话,浏览器就无法显示请求的页面
分块传输编码会把实体主体分成多个部分,每一块使用十六进制来标记快的大小,最后一块一般使用“0(CR+LF)”来进行标记。最终都会由接受到响应的客户端负责解码,恢复到编码前的实体主体
发送多种数据的多部分对象集合
我们在发送邮件的时候,我们可以在一份邮件里面,添加视频,图片,音乐,还有文本,为什么可以呢,因为邮件采用了MIME(多用途英特网邮件扩展)机制。
我们的HTTP也同样的有着一部分的功能,,可以发送一份报文内包含多个类型的实体,
- multipart/from-data:在Web表单上传文件时使用
- multipart/byteranges:状态码为206,响应报文包含了多个范围内容时使用,我们可以看下面的一则报文
1 | Data: Fri, 13 Jur 2016 01:45:26 GMT |
获取部分内容的范围请求
要实现一种可以恢复上次下载中断机制,我们就需要指定下载的实体范围,这种,指定范围发送的请求就叫做范围请求(Range Request)
对一份10 000字节大小的资源,如果使用范围请求,可以只请求一部分资源
- 注意:执行范围请求的时候会使用到首部字段 Range来指定资源的byte范围,
- Range:bytes=50001-10000
- Range:bytes=50001-
- Range:bytes=-50001, 5000-7000
如果是范围请求,则响应会返回状态码206的响应报文。另外,对于多重范围请求,响应会在首部字段Content-Type表明 multipart/byteranges后返回响应报文
内容协商返回最合适的内容
我们的电脑浏览器,在国外的时候看到英文的Google页面,在国内则看到中文的Google页面,这就是说明一套网站它两个版本么?答案则是不然,因为在HTTP协议内部有内容协商,通过内容协商则会返回最最适合的内容
- 服务器驱动协商
- 客户端驱动协商
- 透明协商