TCP Nagle 和延迟 ACK PCAP 分析:小数据包延迟、40 毫秒停顿和缓慢请求/响应应用程序
如何分析 TCP Nagle 算法和数据包捕获中的延迟 ACK 交互、小数据包延迟、请求/响应停顿、交互协议延迟和 TCP_NODELAY 证据。
即使没有数据包丢失、CPU 较低且带宽正常,某些 TCP 应用程序也会感觉很慢。原因可能是 Nagle 算法和延迟 ACK 行为之间的相互作用。当交互式协议因微小写入而停止时,用户搜索“TCP Nagle 延迟 ACK pcap”、“40ms TCP 延迟”、“小数据包延迟”、“TCP_NODELAY 数据包捕获”、“缓慢请求响应 TCP”和“为什么 TCP 在发送小数据包之前等待”。
PCAP 手术很有用,因为这个问题完全是基于时间的。您需要保留数据包时间戳、有效负载大小、ACK 时序、方向和应用程序消息边界。
内格尔做什么
当已经有未确认的数据正在传输时,Nagle 的算法通过阻止微小的写入来减少小数据包开销。对于批量传输来说,这可能是高效的。对于发送许多小消息的交互式请求/响应协议,它可能会引入明显的延迟。
典型模式:
- 应用程序发送一小段。
- 另一个小写已经准备好了。
- 发送方在发送更多内容之前等待 ACK。
- 接收方延迟 ACK,希望能够搭载它。
- 双方短暂等待。
这种延迟看起来像是神秘的应用程序暂停。
延迟ACK有什么作用
延迟 ACK 让接收方在确认数据之前等待,通常是为了减少 ACK 流量或响应数据上的附带 ACK。这通常是有效的 TCP 行为。
出现以下情况时会出现问题:
- 发件人因内格尔而等待。
- 接收方因 ACK 延迟而等待。
- 应用程序等待第二个小段。
- 没有一方发送足够的数据来立即打破等待。
数据包捕获显示重复的间隙,通常围绕一个小的固定延迟。
常见症状
搜索者经常描述:
- “TCP没有丢包,但应用程序很慢。”
- “每个请求都有 40 毫秒的延迟。”
- “小写入速度很慢。”
- “禁用 TCP_NODELAY 固定延迟。”
- “VPN 上的数据库协议速度较慢。”
- “远程用户界面因许多小数据包而缓慢。”
- “RPC 调用有奇怪的间隙。”
- “延迟只发生在 Linux 到 Windows 上。”
根本原因可能是套接字选项、应用程序写入模式或接收方 ACK 策略。
数据包证据
寻找:
- 小 TCP 有效负载。
- 一侧发送的消息少于 MSS。
- 第二个应用程序消息延迟。
- ACK 在固定的类似定时器的间隙后到达。
- 不会发生重传。
- 窗口未满。
- RTT 低于观察到的失速。
- 吞吐量不是主要瓶颈。
这将 Nagle/延迟 ACK 与丢失、拥塞、DNS 延迟、TLS 协商和服务器处理时间区分开来。
请求/响应协议
交互协议尤其敏感:
- 数据库查询。
- RPC 框架。
- 类似 Telnet 的协议。
- 定制工业控制协议。
- 远程桌面控制通道。
- 金融交易网关。
- 健谈的 HTTP 客户端库。
- 面向行的命令协议。
如果应用程序将标头、长度字段和正文片段作为单独的小写入发送,则数据包跟踪可能会显示可避免的延迟。
TCP_NODELAY 和应用程序批处理
使用“TCP_NODELAY”禁用 Nagle 可以减少某些交互式应用程序的延迟。但这并不总是最好的解决办法。
选项包括:
- 为延迟敏感的小消息启用“TCP_NODELAY”。
- 将小批量写入写入一个应用程序中。
- 仅刷新完整的协议帧。
- 避免使用小段的写-写-读模式。
- 如果平台允许,调整延迟 ACK 行为。
- 保持 Nagle 启用批量传输。
pcap 应指导决策。
误诊
这个问题经常被误诊为:
- 丢包。
- 服务器 CPU 速度慢。
- TLS 开销。
- Wi-Fi 延迟。
- VPN 拥塞。
- DNS 延迟。
- MTU问题。
在其他情况下这些可能是真实的,但如果跟踪显示一致的小数据包间隙而没有重传,则 TCP 发送/ACK 交互值得关注。
捕获要求
为了进行有用的分析,请保留:
- TCP 握手。
- 第一个缓慢的请求。
- 有效负载大小。
- 高分辨率的数据包时间戳。
- 仅 ACK 数据包。
- 每段的方向。
- 应用程序日志时间戳(如果可用)。
- 套接字选项知识(如果有)。
不要修剪掉小的闲置间隙。他们就是证据。
调试清单
使用此工作流程:
- 识别重复的延迟间隙。
- 测量间隙持续时间。
- 检查负载是否较小。
- 检查发送方是否有未确认的数据。
- 检查 ACK 时序。
- 确认没有重传可以解释间隙。
- 与 RTT 进行比较。
- 测试应用程序写入批处理。
- 如果适用,请测试“TCP_NODELAY”。
- 在 pcaps 之前/之后保存。
最终诊断
TCP Nagle 和延迟 ACK 问题是时序和小写问题,而不是带宽问题。重要的证据是微小的分段、ACK 延迟、发送者等待行为以及重复的固定延迟间隙。
PCAP 手术有助于保留和比较所需的数据包时序,以证明缓慢的请求/响应应用程序是否被 TCP 小数据包行为阻止。