0.阅读引用
1.发展历程
1.1 文字的大致叙述
(1)HTTP0.9
(2)HTTP1.0
(3)HTTP1.1
(4)HTTP2.0
(5)HTTP3.0
HTTP的发展
http是一种超文本的传输协议,规定了客户端和服务的交互规范.
(1)http/0.9
只是一个草案
只有GET方法
只能传输纯文本
没有HEADER等描述数据的信息
服务器发送完毕,就关闭TCP连接
(2)http/1.0
增加POST、HEAD等方法
增加响应状态码
引入协议版本号
增加HEADER
传输不再仅限于文本
多字符集支持、多部分发送、权限、缓存等
(3)http/1.1-在1.0上增加一些功能,优化网络连接的过程
增加PUT、DELETE方法
增加缓存管理和控制
明确了缓存管理、允许持久连接
允许数据分块、利于大文件传输
强制要求host头
(4)http/2.0
二进制协议,不再要求纯文本
可以发起多个请求,废除1.1里面的管道
使用头部压缩
允许服务器主动向客户端推送消息
增强了安全性
HTTP2里面所有的数据都是以帧方式进行传输,所有同一个连接里面发送的多个请求不再需要按照顺序来,让web应用有了质的提升
头信息压缩以及推送等提高效率的功能
HTTP2的出现是为了解决HTTP1.1中效率低下的问题
(5)http/3.0
使用quic协议
1.2 图说明
2.基于优化的推进
2.1 HTTP/1.1
2.1.1 HTTP/1.1相对于HTTP1.0的优点
(1)使用TCP长连接的方式改善了 HTTP/1.0 短连接造成的性能开销;
(2)支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间.
2.1.2 HTTP/1.1待优化的点
HTTP/1.1待优化的点主要表现在性能上:
(1)请求/响应头部(Header)未经压缩就发送,首部信息越多延迟越大,只能压缩Body的部分;
(2)发送冗长的首部,每次互相发送相同的首部造成的浪费较多;
(3)服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞;
(4)没有请求优先级控制;
(5)请求只能从客户端开始,服务器只能被动响应.
2.2 HTTP/2.0
2.2.1 安全性
HTTP/2.0 协议是基于HTTPS的,所以 HTTP/2.0的安全性是有保障的.
2.2.2 性能上的优化
HTTP/2.0相比HTTP/1.1性能上的改进.
1.头部压缩
HTTP/2.0会压缩头(Header),如果你同时发出多个请求,他们的头是一样的或是相似的,那么协议会帮你
消除重复的部分.这就是所谓的HPACK算法:在客户端和服务器同时维护一张头信息表,所有字段都会存
入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了.
2.二进制格式
HTTP/2.0不再像HTTP/1.1里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是二
进制,并且统称为帧(frame):头信息帧和数据帧.
这样虽然对人不友好,但是对计算机非常友好,因为计算机只懂二进制,那么收到报文后,无需再将
明文的报文转成二进制,而是直接解析二进制报文,这增加了数据传输的效率.
3.数据流
HTTP/2.0的数据包不是按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应.因此,必
须要对数据包做标记,指出它属于哪个回应.每个请求或回应的所有数据包,称为一个数据流
(Stream).每个数据流都标记着一个独一无二的编号,其中规定客户端发出的数据流编号为奇数,服务
器发出的数据流编号为偶数.客户端还可以指定数据流的优先级.优先级高的请求,服务器就先响应该
请求.
4.多路复用
HTTP/2.0是可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应.
移除了HTTP/1.1中的串行请求,不需要排队等待,也就不会再出现【队头阻塞】问题,降低了延
迟,大幅度提高了连接的利用率.
举例来说,在一个TCP连接里,服务器收到了客户端A和B的两个请求,如果发现A处理过程非常耗时,于是
就回应A请求已经处理好的部分,接着回应B请求,完成后,再回应A请求剩下的部分.
5.服务器推送
HTTP/2.0还在一定程度上改善了传统的【请求-应答】工作模式,服务不再是被动地响应,也可以主动向
客户端发送消息.
举例来说,在浏览器刚请求HTML的时候,就提前把可能会用到的JS、CSS文件等静态资源主动发给客户
端,减少延时的等待,也就是服务器推送(Server Push,也叫 Cache Push).
2.2.3 HTTP/2.0存在的问题
HTTP/2.0主要的问题在于,多个HTTP请求在复用一个TCP连接,下层的TCP协议是不知道有多少个HTTP请求
的.所以一旦发生了丢包现象,就会触发 TCP 的重传机制,这样在一个TCP连接中的所有的HTTP请求都必须
等待这个丢了的包被重传回来.
小小的拓展与比较:
HTTP/1.1 中的管道(pipeline)传输中如果有一个请求阻塞了,那么队列后请求也统统被阻塞住了;
HTTP/2.0 多个请求复用一个TCP连接,一旦发生丢包,就会阻塞住所有的 HTTP 请求。
2.3 HTTP/3.0