tcpdump 抓到大量 Dup ACK / Retransmission 但业务日志无超时的根因

发布时间 - 2026-01-29 00:00:00    点击率:
根本原因是TCP重传与应用层超时分属不同层级,内核重传常在应用感知前完成;业务无超时仅说明系统调用最终返回,不反映中间是否经历重传或乱序。

为什么 Dup ACK 和 Retransmission 不一定触发业务超时

根本原因是 TCP 重传和应用层超时属于不同层级的机制,且重传常在应用层感知前就完成了。业务日志没报超时,不代表网络没问题;它只说明 read()write() 系统调用最终返回了,哪怕中间经历了重传、乱序、延迟确认等过程。

常见误解是把「TCP 层重传」等同于「应用层请求失败」,但实际中:
- 应用层超时(如 HTTP client 的 timeout=5s)从发起请求那一刻开始计时,而 TCP 重传发生在内核协议栈,只要重传后数据最终送达,应用读写就能完成
- 内核 TCP 栈默认启用快速重传(tcp_fastretrans)、SACK、时间戳等优化,很多丢包在几十毫秒内就恢复了,远低于应用层超时阈值
- 如果服务端处理快、客户端不校验响应完整性(比如没校验 HTTP Content-Length 或分块边界),即使部分重传导致响应体错乱,也可能被静默接受

如何确认 Dup ACK / Retransmission 是真丢包还是误判

tcpdump 显示大量 Dup ACKRetransmission 可能是真实丢包,也可能是抓包位置不当造成的“假象”。关键看抓包点是否在路径关键节点:

  • 如果在客户端机器抓包,看到自己发的包被重传 → 很可能客户端到服务端之间有丢包(防火墙限速、网卡驱动 bug、交换机 buffer 溢出)
  • 如果在服务端机器抓包,看到客户端重传 → 需结合服务端 netstat -s | grep -i "retran" 确认是否收到原始包:若服务端 TcpExtTCPDupAck 高但 TcpInSegs 正常,说明 Dup ACK 是服务端发出的(即客户端丢响应),不是客户端丢请求
  • 如果在中间设备(如负载均衡器)抓包,看到大量 Dup ACK 但无对应重传包 → 很可能是该设备未开启 SACK 或窗口缩放,导致接收端反复发送重复 ACK,触发发送端误重传

一个快速验证方式:

ss -i src_ip:src_port dst_ip:dst_port

查看当前连接的 cwndssthreshrttretrans 计数。如果 retrans 持续增长但 cwnd 没明显下降,大概率是瞬时拥塞而非持续丢包。

哪些场景下业务完全无感但 tcpdump 异常明显

以下情况会导致 tcpdump 抓到高频重传/Dup ACK,但业务日志干净:

  • 服务端启用了 TCP_NODELAY 但客户端未启用,小包频繁触发 Nagle 算法与 Delayed ACK 协同失

    效,造成“伪重传”(实际是 ACK 延迟引发的快速重传误触发)
  • 网络路径存在微突发(microburst),交换机队列瞬间打满丢包,但平均带宽正常 → ping 测不出丢包,tcpdump 却能看到局部重传
  • 客户端或服务端 TCP 时间戳(tcp_timestamps)关闭,导致 RTT 估算失真,RTO 设置过小,轻微延迟就被判定为丢包并重传
  • 使用 TLS 1.3 + 0-RTT,首次请求在 handshake 完成前就发出了,若 handshake 包丢失,重传的是 handshake 而非业务数据,业务层只看到连接建立稍慢

下一步排查该盯什么,而不是继续看 tcpdump

tcpdump 是现象入口,不是根因终点。当看到大量 Dup ACK/Retransmission 但业务无异常时,优先检查这些:

  • 确认两端 /proc/sys/net/ipv4/tcp_reordering 是否一致(默认 3)。若一端设为 1,另一端为 6,容易因乱序误判重传
  • 查服务端 netstat -sTcpExtTCPDeliveredTcpOutSegs 的比值:若显著低于 1,说明大量数据被重传后才交付,虽未超时但有效吞吐已受损
  • ethtool -S eth0 查网卡收发队列丢包(rx_missed_errorstx_aborted_errors),比 tcpdump 更接近物理层真相
  • 检查 BPF 过滤器或 eBPF 工具(如 bpftrace -e 'kprobe:tcp_retransmit_skb { printf("retrans %s:%d -> %s:%d\\n", args->sk->__sk_common.skc_rcv_saddr, ntohs(args->sk->__sk_common.skc_num), args->sk->__sk_common.skc_daddr, ntohs(args->sk->__sk_common.skc_dport)); }')定位具体哪个连接、哪个 socket 在反复重传

真正难定位的,往往是那些重传后立刻恢复、不触发 RTO、也不影响单次请求耗时的微抖动 —— 它们不会出现在业务日志里,却在悄悄抬高 P99 延迟、降低连接复用率。这时候,tcpdump 是起点,不是答案。


# node  # 防火墙  # 工具  #   # 网卡驱动  # 为什么  # red  # printf  # Length  # 算法  # http  # tcpdump  # linux  # bug  # 负载均衡  # 服务端  # 客户端  # 应用层  # 很可能  # 均衡器  # 而非  # 前就  # 根本原因  # 的是  # 也不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  怎样使用JSON进行数据交换_它有什么限制  黑客如何利用漏洞与弱口令入侵网站服务器?  如何挑选最适合建站的高性能VPS主机?  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  linux写shell需要注意的问题(必看)  网站制作软件有哪些,制图软件有哪些?  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  敲碗10年!Mac系列传将迎来「触控与联网」双革新  香港服务器选型指南:免备案配置与高效建站方案解析  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  中山网站制作网页,中山新生登记系统登记流程?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  高防服务器租用如何选择配置与防御等级?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  英语简历制作免费网站推荐,如何将简历翻译成英文?  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  JavaScript如何实现路由_前端路由原理是什么  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  js实现获取鼠标当前的位置  如何基于云服务器快速搭建网站及云盘系统?  如何在局域网内绑定自建网站域名?  jQuery 常见小例汇总  活动邀请函制作网站有哪些,活动邀请函文案?  新三国志曹操传主线渭水交兵攻略  如何快速搭建二级域名独立网站?  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  WordPress 子目录安装中正确处理脚本路径的完整指南  如何在万网利用已有域名快速建站?  打造顶配客厅影院,这份100寸电视推荐名单请查收  Laravel怎么在Blade中安全地输出原始HTML内容  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Laravel如何使用Gate和Policy进行授权?(权限控制)  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  如何在万网开始建站?分步指南解析  Laravel如何使用Service Container和依赖注入?(代码示例)  如何在Windows服务器上快速搭建网站?  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  Python结构化数据采集_字段抽取解析【教程】  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Laravel怎么实现模型属性的自动加密  lovemo网页版地址 lovemo官网手机登录