TCP 延迟确认:小请求为什么总要多等 40 毫秒

2026年08月31日

12 次

大部分”慢”的问题出在路上,也有一部分出在等待里。一个不起眼的 TCP 细节——延迟确认,就能让代理链路里的小请求平白多等几十毫秒,而链路本身完全正常。它不报错、不丢包,只让每次一问一答都慢半拍,慢得很有规律。

延迟确认在等什么:收到数据后,接收方不立刻回复确认,而是先攒一小会儿,通常约 40 毫秒,或者等攒够两个数据段,再把确认连同后续流量一起发出。对连续的大流量传输,确认不断被新的数据冲走,几乎看不出影响;对一问一答的小请求,这 40 毫秒就变成了实打实的等待,请求越碎,感受越明显。

和 Nagle 算法撞在一起:发送方有攒包的 Nagle 算法,接收方有攒确认的延迟确认。小请求密集发出时,两边都在等对方先动,结果每次交互都硬生生多出接近一个确认周期的停顿。网络完全健康,交互却明显发闷,这是经典的小包延迟问题,也是判断这类”慢”时最值得先排除的一种。

代理链路把问题放大:直连只有一段连接,延迟确认的代价最多出现一次;走代理后,客户端到代理、代理到目标端是两段相互独立的连接,每一段都可能叠加一个确认周期。一段几十毫秒,两段加起来就可能接近百毫秒,对交互型应用来说,感知差异一下子就明显了,这也是同一批请求直连快、走代理慢的常见原因之一。

不是所有流量都吃亏:大文件下载、持续数据流这类批量传输,确认被后续流量不断冲走,延迟确认几乎不产生可见影响。真正吃亏的是聊天、轮询、即时查询这类”发一小包、等一小包”的交互型流量——请求本身很快,等待却占了大多数时间,慢的感受全在等待里。

怎么判断是不是它在作怪

看交互节奏。同一批小请求,直连明显快于走代理,而且每次差距都接近一个固定数值,比如 40 毫秒上下,多半就是延迟确认在叠加。再对照发送方是否开启了 Nagle——发送方不开 Nagle,接收方仍可能延迟确认,两个机制要分开排查,别只盯着其中一边。

另一个角度是看慢的规律性。持续传输快的连接,偏偏在小请求上慢,而且慢得很有规律,比忽快忽慢的抖动更容易指向这类固定周期的等待;如果慢的时间毫无规律,更可能是路由或拥塞问题,和延迟确认关系不大,别把两类问题混在一起调。

需要注意的是,延迟确认不是故障,而是 TCP 默认的省流量设计。改它属于调优,不是修 bug:对延迟敏感的交互型应用,可以要求代理或出口端关闭延迟确认、缩短确认定时器;对普通网页浏览,收益很小,不必折腾,也别为这点收益牺牲掉省流量的默认行为。

问:延迟确认能彻底关掉吗?答:可以,但多数场景没这个必要。真正值得做的,是在评估代理链路时把”交互型应用的实际体验”纳入考察,而不只是看测速数字——链路健康与否,从来不只是带宽和延迟两个数字,还藏在像延迟确认这样细小的等待里,藏在每一次一问一答的节奏里。

相关咨询请联系QQ/微信:157069302