http1.1
特点
- keepalive(长连接):支持让 http 重用 Tcp 连接,节省每次需要建立连接的开销
- 管道传输:第一个请求发出去后,不必等相应,可以继续发送请求
- cache-control:新增缓存控制机制
- public:表明响应可以被任何中间缓存(比如代理服务器)缓存,并且在任何情况下都可以被重新使用。
- private:表明响应只能被单个用户缓存,不能被中间缓存所缓存。
- no-cache:表明在使用之前必须经过服务器验证,缓存才能使用该请求的响应数据。
- no-store:表明响应不能被缓存,并且每次请求都必须向服务器重新获取。
缺点
- http队头阻塞:http 规定需要按顺序返回,所以当发送多个请求时,其中一个没有完成,即使后续请求处理完毕,也无法相应,造成了阻塞
- 单向传输:只能通过客户端发送请求,服务器被动相应
- 请求/响应头部冗杂:当数据量很少时,还需要有头部,并且无法省略,造成头重脚轻。
http2
特点:
-
头部压缩:发出多个请求,头部类似,就会消除重复部分,把信息放入一个表,生成索引号,以后发送索引号就可以。(HPACK 算法)
-
二进制格式:不再使用纯文本报文,使用二进制。这样虽然对人不友好,但是对计算机非常友好,因为计算机只懂二进制,那么收到报文后,无需再将明文的报文转成二进制,而是直接解析二进制报文,这增加了数据传输的效率。
-
并发传输:解决之前的 http 队头阻塞,引入 stream 概念。1 个 TCP 连接包含多个 Stream,Stream 里可以包含 1 个或多个 Message,Message 对应 HTTP/1 中的请求或响应,由 HTTP 头部和包体构成。Message 里包含一条或者多个 Frame,Frame 是 HTTP/2 最小单位,以二进制压缩格式存放 HTTP/1 中的内容(头部和包体)。针对不同的 HTTP 请求用独一无二的 Stream ID 来区分,接收端可以通过 Stream ID 有序组装成 HTTP 消息,不同 Stream 的帧是可以乱序发送的,因此可以并发不同的 Stream ,也就是 HTTP/2 可以并行交错地发送请求和响应。
-
服务器推送:支持使用服务器进行推送,客户端和服务器双方都可以建立 Stream
缺点:
tcp队头阻塞:HTTP/2 是基于 TCP 协议来传输数据的,TCP 是字节流协议,TCP 层必须保证收到的字节数据是完整且连续的,这样内核才会将缓冲区里的数据返回给 HTTP 应用,那么当「前 1 个字节数据」没有到达时,后收到的字节数据只能存放在内核缓冲区里,只有等到这 1 个字节数据到达时,HTTP/2 应用层才能从内核中拿到数据,这就是 HTTP/2 队头阻塞问题。
http3
特点:
-
改用UDP:由于TCP队头阻塞,所以抛弃 TCP 使用 UDP
-
QUIC: UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输。
-
无队头阻塞:QUIC 有自己的一套机制可以保证传输的可靠性的。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响,因此不存在队头阻塞问题
-
更快建立连接:握手时间和加密时间更短
-
支持更快的连接迁移:基于 TCP 传输协议的 HTTP 协议,由于是通过四元组(源 IP、源端口、目的 IP、目的端口)确定一条 TCP 连接。当需要重新建立连接需要断开并重新建立连接。
而 QUIC 通过 ID 标记,当连接发生变化,只要有上下文并且保存了id就可以直接建立连接。
-
参考: