Chrome/Edge/Safari中IIS10 HTTP2每第6次请求停滞2分钟问题求助
HTTP2下每6次请求卡顿的原因分析及排查建议
1. HTTP2连接复用与浏览器实现差异
HTTP2依赖单TCP连接的多路复用,但Chromium系(Chrome/Edge)和Safari的连接回收策略与Firefox不同:
- 这类浏览器对空闲HTTP2连接的回收存在延迟,每第6次请求时,旧连接处于半关闭状态却未被释放,新请求只能等待TCP超时(通常约2分钟)后才会新建连接处理。
- Firefox的HTTP2连接管理逻辑更激进,会主动清理无效空闲连接,因此避开了等待问题。
2. IIS 10 HTTP2模块的流调度bug
Windows Server 2022的IIS 10在HTTP2流处理上可能存在特定场景的问题:
- 当单请求页面导航触发第6次请求时,可能触发IIS内部的流队列阻塞,请求被挂起直到连接超时。
- .NET 5与IIS HTTP2模块的兼容性冲突:Kestrel集成IIS时,HTTP2的流处理逻辑可能与IIS的URL Rewrite、静态内容等模块存在交互问题,每6次请求刚好触发冲突点。
3. TCP参数不匹配导致连接超时
服务器与浏览器的TCP参数设置存在不兼容:
- 浏览器HTTP2下的TCP keep-alive参数与服务器端不一致,第6次请求时连接已进入半空闲状态,服务器未正确响应keep-alive探测,导致浏览器等待连接超时。
- IIS HTTP2模块未及时清理连接池中的无效连接,后续请求复用无效连接时陷入等待。
4. TLS会话复用异常(可能性较低)
HTTP2对TLS的要求更严格:
- Chromium系和Safari在HTTP2下对TLS会话复用的验证更严格,每6次请求可能触发会话复用失败,叠加连接复用问题后导致超时(但单纯TLS握手超时通常不会达到2分钟)。
排查方向
- 开启IIS的HTTP2日志(站点日志设置中添加HTTP2相关字段),查看第6次请求的流状态、连接ID,确认是连接复用还是流调度问题。
- 用
Wireshark抓包分析第6次请求的TCP连接状态,检查是否存在SYN重传、连接超时的情况。 - 调整.NET 5 Kestrel的HTTP2配置,比如修改
MaxConcurrentStreams参数,看是否缓解问题。 - 安装Windows Server 2022的最新补丁,微软可能已修复IIS HTTP2的相关已知bug。
内容的提问来源于stack exchange,提问作者Pradeep
相关产品推荐
相关产品推荐

