HTTP/1.1
HTTP/1.1的核心 “一次一份”。
在HTTP/1.1中你发送一次HTTP请求时,是要等收到HTTP响应才可以再发送下一个HTTP请求
对于HTTP协议来说,我们打开一个网页需要进行TCP三次握手,建立起了TCP连接,才正式进行请求。
服务器会先发送index.HTML文件给我们,但其他文件不会发给我们。
浏览器在收到HTML文件以后,根据HTML里面的内容,再向服务器依次请求CSS、JS等文件。
整个过程都是浏览器在帮我们完成,所以用户的直接感受是只有一次请求。
如果在请求的队伍里,有一个文件没有收到,后面的文件也没法接收了,这就会造成HTTP队头阻塞了。
虽然对HTTP1.1来说默认是持久链接的(Keep-Alive):也就是保持这个TCP连接,不需要对每个请求再来一轮TCP握手。
未定义标准的头部压缩机制,每个请求和响应都需要携带完整的头部信息,增加了数据传输的开销。
HTTP/1.1默认不加密,可以通过HTTPS来提高安全性,HTTP/1.1使用文本格式进行数据传输。
HTTP2
多路复用,主要就是要解决HTTP/1.1队头阻塞的问题。
HTTP2并不是单个文件就这样直接响应过去,请求和响应报文都被划分为各个不同的帧。
最重要的是HTTP2中的帧中有流标识符,正因为有这个流标识符,使得帧不用按照顺序抵达浏览器,最终可以使用流标识符按照顺序进行组合。
在HTTP/1.1报文主体压缩,首部不压缩,HTTP2就把首部也压缩了,引入了叫HPACK的压缩算法。
HTTP2在应用层使用多路复用很好的解决了队头阻塞,但是在传输层TCP依然存在队头阻塞。
HTTP3
HTTP3的一大核心:”整合”。
虽然我们很难把TCP进行快速地升级并且广泛应用,但是HTTP3把TCP和TLS的握手过程整合到一起了,直接减少了来回带来的开销。
实际上为了能够让HTTP3进行部署,只能选择传输层的UDP协议了,并且在基于UDP协议上新增一个协议:QUIC。
这个QUIC整合了TCP和TLS,使得HTTP3默认就是要使用加密传输的。
![](https://ichistudio.cn/wp-content/uploads/2024/06/图片-2.png)