为什么使用HTTP/2的应用仅建立一条TCP连接而非多条?
HTTP/2 多TCP连接相关问题解答
为什么HTTP/2默认不建立多条TCP连接规避TCP队头阻塞
HTTP/2 原生设计就是以单TCP连接为基准实现的,优先使用单连接主要出于以下几点考虑:
- 降低连接开销:每条TCP连接都需要经历三次握手,开启TLS的场景下还需要额外1-2次RTT的密钥协商,同时新连接刚建立时会进入TCP慢启动阶段,传输效率远低于已经完成拥塞控制校准的成熟连接。多连接带来的额外开销,很多时候会超过规避TCP队头阻塞获得的收益。
- 减少服务端资源消耗:如果每个客户端都建立多条TCP连接,高并发场景下服务端的文件描述符、内存等资源会被快速占满,反而会拉低整体服务的吞吐量。
- 保障网络公平性:TCP的拥塞控制是单连接维度的,单个客户端占用多条连接会抢占更多网络带宽,对同网络环境下其他单连接服务不公平,严重时还可能触发网络拥塞。
- 上层优化已经弱化了TCP队头阻塞的影响:主流HTTP/2实现都支持请求优先级调度,会优先传输高优先级资源(如页面主文档、首屏图片、核心接口请求),即使出现队头阻塞,受影响的也大多是低优先级请求,对用户体验的影响已经被控制在较低水平。
多TCP连接的HTTP/2实现的请求分配策略
实际生产中确实存在部分场景会使用多条TCP连接承载HTTP/2流量,常见的请求分配策略包括:
- 按域名分片分配:沿用HTTP/1.1时代的域名分片逻辑,将不同类型的资源拆分到多个子域名下,客户端为每个子域名单独建立一条HTTP/2连接,对应域名的请求自动分配到对应连接上。不过这种方案目前已经不推荐使用,多连接开销反而会降低HTTP/2的性能收益。
- 按优先级分配:将高优先级请求(如核心业务接口、首屏资源)放到独立的TCP连接上传输,低优先级请求(如埋点上报、非首屏静态资源)共用其他连接,避免低优先级请求引发的TCP丢包阻塞高优先级请求。
- 按请求类型分配:比如将大体积的POST请求和延迟敏感的小体积GET请求拆分到不同连接,避免大报文传输占用连接窗口阻塞小请求。
- 基于连接负载分配:当单条TCP连接上的并发流数量达到预设阈值(主流实现默认阈值通常为100)时,自动新建TCP连接承载新的请求,避免单连接上请求过多放大队头阻塞的影响。
内容的提问来源于stack exchange,提问作者Yichuan Wang
相关产品推荐
相关产品推荐

