前言
🙋♂️ 温故而知新
http协议也称为超文本传输协议,基于tcp/ip协议,早期的版本有http/0.9和http/1.0, 但它们并不是一个标准的规范,只是一份参考文档,随着互联网的发展以及实际应用场景的需求,http协议也在不断的完善和标准化,目前使用最广泛的版本是http/1.1和http/2.0,下面就这两个版本做一个简单的介绍和对比。
http/1.1
http/1.1是1999年推出的版本,最主要是解决之前版本连接的问题,早期的版本每一次与服务器进行通信,都要经历建立连接,传输数据以及关闭连接三个阶段,当一个页面引用较多外部文件时,就需要重复不断的建立和断开连接,这样大大的消耗服务器性能以及增加了网络的开销。
http/1.1版本有如下特点:
- 长连接:引入了TCP连接复用,即一个TCP默认不关闭,可以被多个请求复用
- 并发连接:对一个域名的请求允许分配多个长连接(缓解长连接中
对头阻塞问题) - 引入管道机制(pipelining):一个TCP连接,可以同时发送多个请求(响应的顺序必须和请求的顺序一致)
- 增加了PUT,DELETE,OPTIONS,PATCH等新的方法
- 新增了一些协商缓存字段(If-Modify-Since, If-None-Match)
- 请求头引入了range字段,支持断点续传
- 允许响应数据分块(chunked),利于传输大文件
- 强制要求Host头,让互联网主机托管成为可能
管道机制
管道机制是指在一个TCP连接之内,客户端可以同时向服务器发送多个http请求,不用等待上一次请求服务器返回结果,就可以再次发送下一次请求,但服务器端必须按照客户端请求的先后顺序返回对应的结果,以保证客户端能够区分每次响应的内容。
http/2.0
2015年正式发布的HTTP/2默认不再使用ASCII编码传输,而是改为二进制数据,用来提升传输效率。
客户端在发送请求时,会将每个请求的内容封装成不同的带有编号的二进制帧(Frame), 然后将这些帧同时发送到服务器端,服务器接收数据后,会将相同编号的帧合并为完整的请求信息,同样,服务器端返回结果,客户端接收结果也遵循这个帧的拆分与组合的过程。
http/2.0的特点:
- 二进制协议:HTTP/1.1版本的头部信息是文本,数据部分可以是文本和二进制数据,http/2.0头部和数据部分都是二进制数据,统一称为
帧。 - 多路复用:废弃了HTTP/1.1中的管道,同一个TCP连接里面,客户端和服务器端可以同时发送多个请求和多个响应,并且不用按照顺序来,由于服务器不用按照顺序来处理响应,所以避免了
对头阻塞的问题。 - 头部信息压缩:使用专用算法压缩头部,减少数据传输量。
- 服务器端主动推送:允许服务器主动向客户端推送数据。
- 数据流:由于HTTP/2.0版本中数据包不是按照顺序发送的,同一个TCP连接里面相连的两个数据包可能是属于不同的响应,因此,必须要有一种方法来区分每一个数据包属于哪个响应,在http/2.0版本中,每个请求和响应的所有数据包,称为一个
数据流(stream), 并且每一个数据流都有一个唯一的编号ID, 请求数据流的编号ID为奇数,响应数据流的编号ID为偶数。每个数据包在发送的时候带上对应数据流的编号ID,这样服务器和客户端就能区分是属于哪一个数据流,并且客户端还能指定数据流的优先级,优先级越高,服务器会越快做出响应。