加载中...

Nagle 算法由 John Nagle 于 1984 年提出(RFC 896),用于解决"小包问题":telnet 等应用逐字节发送时,每个字节都要背负 40 字节的 TCP/IP 头,严重浪费带宽。
规则很简单:连接上如果存在尚未被确认的小段数据,后续的小块数据先在缓冲区累积,直到收到 ACK 或凑满一个 MSS 再发送。这样在一个往返时间内最多只有一个小包在途,天然实现了自适应的合包。
接收端的延迟确认(Delayed ACK)会故意推迟最多数十到两百毫秒再回 ACK,与 Nagle 算法叠加时,发送端等 ACK、接收端等数据,形成互相等待,造成典型的 40 毫秒级卡顿,对请求-响应式或实时性敏感的协议伤害明显。
对时延敏感的应用(游戏、SSH、RPC、数据库协议等)普遍通过 setsockopt 设置 TCP_NODELAY 关闭该算法,改由应用层自行合并写入;Redis、Nginx 等软件默认即关闭。

登录 后参与讨论
暂无讨论,来发表第一条评论吧