1、先聊聊什么是 HTTP:
我们通常所说的 HTTP(S)1.1 其实是由多个协议组成的:
- HTTP协议:用来解析 url 和 数据。
- TSL协议:用来对传输的数据进行加密(即为 HTTPS 的 "S")。
- IP协议:用来定位客户端与服务器,以便双方通信。
- TCP协议:用来确保数据完整、准确地传递。
上述四种协议,在互联网经过这么多年发展后,其中 HTTP1.1协议 和 TCP协议 都各自暴露出一些问题。
而 HTTP2 则是为了解决 HTTP1.1协议 的一些问题。
<br />
而 HTTP3 则是为了解决 TCP协议 的一些问题。
2、HTTP1.1 的主要问题 和 HTTP2 对其的解决之道:
HTTP1.1 的主要问题:
- HTTP协议的队头阻塞(Head-of-Line blocking):HTTP1.1虽然实现了多个HTTP请求可以共用TCP管道。
但建立TCP连接后,每条HTTP的 request 和 response 都是串行交互数据。所以若前面的 response 有延迟,就会阻塞后面的request,从而造成后续http请求的等待,进而影响数据的传输速度。 - 队列堆积(Queueing):浏览器对每个域名的http并发请求是有限制的(chrome为6个),当请求数量超过限制时,则新请求会进入队列等待,当并发的请求过多时,也会造成阻塞。
- 报文头(Header)信息冗余:每次request都需要携带报文头,且其数据非常冗余。
- 自身没有 加密 和 认证机制。
HTTP2 针对 HTTP1.1 的优化点:
- 二进制分帧(Binary Framing):HTTP2在应用层(HTTP)和传输层(TCP)之间加了一层 二进制分帧层。将http1.1字符串的“大”数据,分割成多个“小”的二进制数据。其好处:“二进制”可以压缩数据,而“分帧”将大数据变成多个小数据,以便“多路复用”(HTTP2相比HTTP1.1性能的提高主要是因为这一层的引入)。
- 多路复用(Multiplexing):其机制是在建立一个TCP管道中,可以同时收/发多个HTTP请求和二进制帧,从而解决HTTP1.1的阻塞问题。
- 对HTTP头压缩:HTTP1.1的header有很多信息,每次请求都要重复发送,而HTTP2对头部信息进行了压缩。
- 服务器推送:这个功能其实已事实上被废弃,具体原因文末简述。
3、TCP的主要问题 和 HTTP3 对其的解决之道:
HTTP3相比HTTP2本身升级不多,其重点是将 TCP协议 换成了 QUIC协议,以QUIC解决TCP的问题。
TCP 的主要问题:
- TCP没有加密功能:TCP协议不包含TLS协议(即 HTTPS 的 "S"),使得现在 HTTPS 运行必须有 TCP 和 TLS 两个协议的连接,才能传输数据。
- TCP协议的队头阻塞(Head-of-Line blocking):上文说到HTTP有队头阻塞,其实TCP也有队头阻塞。即TCP传输数据时会将数据拆分一个个顺序的数据包,但传输过程中若某个数据包没有按顺序到达,则接收端会一直保持等待该数据包,这时候就会阻塞后续的数据传输。
QUIC 针对 TCP 的优化点:
首先,QUIC协议基于已存在的UDP协议实现(其原因可见:What Is QUIC)
- 整合TLS:从上图可见,QUIC包含TLS,所以QUIC相比TCP天然更安全且建立时间更短(TCP协议建议链接需要额外建立TLS连接,而QUIC协议将两者合二为一)。
- 多路复用+二进制分帧:其目的为解决TCP协议的队头阻塞。
- 使用connection IDs:连接ID独立于客户端端口和IP地址,使得避免重复的连接握手。
最后总结:
- 2.0到3.0不断升级的目的:HTTP作为数据传输协议,技术发展的方向就是不断提速;所以 HTTP2.0和HTTP3.0 分别对 HTTP协议 和 TCP协议 进行了升级。其最大的目的都是:进一步提速。
- 分成两次升级原因:同时升级HTTP和TCP两大协议工作量巨大,所以互联网工程任务组(IETF)将其升级一分为二。
- QUIC协议基于UDP协议的原因:TCP作为传输层协议已广泛被互联网世界的中间硬件(如防火墙、网站、路由器等)所支持,而这些硬件升级非常慢,若断然废弃TCP协议而采用新协议,这些硬件无法良好支持。而UDP协议是古老的协议,上述这些硬件都默认支持UDP,所以QUIC协议基于运行在UDP协议之上而设计。
- HTTP2为什么废弃服务端推送功能:具体原因见# Intent to Remove: HTTP/2 and gQUIC server push
。HTTP3中用于替代 Websocket 的方案为:《# [译]WebTransport 会在不久的将来取代 WebRTC 吗?》