Skip to the content.

Http_protocols

24 Apr 2025 - joy717

http各个版本之间的区别

管道,可以实现请求端“同时”(这边指的是,响应没回来之前)发起,但响应端,必须依照请求的先后顺序,将响应内容完整传输回来,才能继续下一个请求的响应。

但这个只是在http层解决了队头阻塞的问题,在tcp层,并不知道这个数据帧,因此当某个tcp包丢失了,依然会导致整个通道内的数据包被阻塞。(因为tcp要求数据包是有顺序的,必须按顺序接收)

实际上,为了保证数据的可靠性,quic自己实现了tcp协议相关的内容,也就是保证数据是要按顺序接收,可以说是tcp2.0. 但也正是tcp2.0,所以在单个请求(资源)内,依然要求包是顺序的(tcp的要求),因此在单个请求里,依然有队头阻塞的情况。只不过不再影响其他的资源了。

有意思的是:

HTTP1.1 版本开始,为了解决队头阻塞,浏览器允许对于单个域名,同时发起6个左右的tcp链接. 极大降低了队头阻塞的问题。

后续的各种版本虽然奔着解决队头阻塞问题,但实际上对于队头阻塞并不能有效缓解,有时候不如加大链接数量。

这是因为丢包的时候,往往是丢了一段(TCP/UDP层),这一段里面极大可能包含着多个请求里面的一些数据块(比如123123123->123xxx123 其中的xxx为丢失部分). 也就变成是,大部分的资源请求因为前面有块数据丢失,导致对于单个请求来说,依然是队头阻塞的.


HTTP(HyperText Transfer Protocol)是互联网上应用最广泛的协议之一,自1991年诞生以来经历了多个版本的迭代。以下是HTTP 1.0、HTTP 1.1、HTTP/2和HTTP/3的主要区别及核心改进:


1. HTTP 1.0(1996年)


2. HTTP 1.1(1999年)


3. HTTP/2(2015年)


4. HTTP/3(2022年正式标准化)


版本对比总结

| 特性 | HTTP 1.0 | HTTP 1.1 | HTTP/2 | HTTP/3 | |---------------------|---------------|-----------------------|------------------------|------------------------| | 连接方式 | 短连接 | 持久连接 | 多路复用 | QUIC多路复用 | | 协议层 | TCP | TCP | TCP | UDP(QUIC) | | 队头阻塞 | 严重 | 管道化部分解决(请求端解决,响应端未解决) | 应用层解决,TCP层仍有 | 彻底解决 | | 头部压缩 | 无 | 无 | HPACK | QPACK | | 服务器推送 | 不支持 | 不支持 | 支持 | 支持 | | 加密 | 可选 | 可选 | 主流强制HTTPS | 默认加密(TLS 1.3) | | 典型延迟 | 高 | 中等 | 低 | 极低(尤其移动网络) |


应用场景建议

HTTP/3代表了未来方向,但全面普及仍需时间(需操作系统、浏览器、服务器生态支持)。

这篇解释更详细,强烈建议多次通读

https://github.com/rmarx/holblocking-blogpost/blob/master/README_CN.md

概念