Nagle 与延迟 ACK 可能让小请求的第二部分等待
Nagle 算法减少 TCP 小报文:当前面数据尚未确认时,它会暂缓额外的小块数据,除非已经积累到足以构成完整段。延迟确认则是接收端的另一种行为,可以短暂推迟 ACK。当应用把一个请求拆成多个很小的写入,而对端必须取得后续字节才能生成响应时,两者的相互作用就会影响延迟。需要明确是哪一部分数据已经发出、哪一部分仍在等待。 原有两次试验都提交 a,刻意停顿 2 毫秒,再提交 b;服务器等到 ab 后回复 OK。启用 Nagle 时抓包顺序为 a、覆盖 a 的 ACK、b;启用 TCP_NODELAY 时为 a、b、首个数据 ACK。约 41 毫秒和 2 毫秒的段间隔来自原有受控运行,不是统一常数。 仅为原有实验示意,本轮配图未重跑。 坏掉的样子 单独一个小请求,不会自动被 Nagle 延迟。如果没有更早的未确认数据,第一个小段可以直接发送。问题场景是第一部分已在途中,第二个短小部分排在后面等待。如果接收端延迟确认,同时应用又在等完整请求,进展可能暂停,直到确认计时器到期。不能把所有“小请求慢”都归到这个机制,也不能省略前面存在未确认数据这一条件。 ...