sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
sock.sendall(payload)

位置同步包每个 40 字节,客户端每 50 毫秒发一次,服务端收到的间隔稳定在 250 毫秒,ping 显示 RTT 只有 3 毫秒。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,Nagle 算法会把小包攒到凑够一个 MSS 或者等到对端 ACK 才发,交互式小包因此被拖到 200 毫秒量级。延迟确认和 Nagle 撞在一起时,等待时间还会翻倍。

围绕「Nagle 小包延迟」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

处理上按这个顺序:对交互连接设置 TCP_NODELAY;批量传输的连接保留 Nagle 合并小包;确认对端延迟确认没有和它叠加;抓包对比设置前后两包的间隔。

改完只确认一件事:设置后小包间隔从 250 毫秒降到 50 毫秒,抓包里每个包立刻发出,同步延迟回到 30 毫秒以内。

作者 9823189