0

0

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

舞姬之光

舞姬之光

发布时间:2026-01-24 18:55:33

|

112人浏览过

|

来源于php中文网

原创

根本原因在于TCP重传和重复确认是传输层自愈机制,只要重传在RTO内完成且未触发应用层超时阈值,业务就不会报错;Dup ACK仅表示乱序,Retransmission不等于失败。

tcpdump 抓到大量 dup ack / retransmission 但业务日志无超时的分析

为什么 Dup ACK 和 Retransmission 不一定导致业务超时

根本原因在于:TCP 重传和重复确认是传输层的自愈机制,只要重传成功、应用层未感知到丢包或延迟,上层 HTTP/gRPC/DB 连接就不会报错。业务日志无超时,恰恰说明重传在 RTO(Retransmission Timeout)内完成,且应用层 socket 读写未触发超时阈值。

常见误判点:Dup ACK 只反映接收端检测到乱序包(比如包 1、3 到达,2 丢失),不等于丢包已发生;Retransmission 也不等于失败——它只是 TCP 在等不到 ACK 时的主动补救。

  • RTO 通常动态计算(基于 RTT 样本),可能低至 200ms~500ms,远小于业务层设置的 5s/30s 超时
  • 现代内核(如 Linux 4.1+)默认启用 tcp_reordering(默认 3),允许最多 3 个包乱序而不立即触发快速重传
  • 如果丢包发生在响应体末尾(如大文件下载最后几个包),应用层可能已返回 200 状态码,后续 FIN 流程仍可正常完成

如何确认这些重传是否真实影响了业务时延

关键不是看有没有 Dup ACK,而是看它们是否推高了实际 RTT 或导致窗口停滞。用 tcpdump -ttttshark -o tcp.calculate_timestamps:TRUE 提取时间戳后,重点关注三类模式:

  • 连续多个 [TCP Dup ACK] 后紧接 [TCP Retransmission],且重传包的 seq 与原始包一致 → 真实丢包,需查链路
  • Retransmission 出现在 ACK 已到达发送端之后 → 可能是虚假重传(spurious retransmit),常见于时钟漂移或 ACK 延迟抖动
  • 重传后紧接着收到多个 [TCP Window Update]ACK 窗口跳变 → 接收端缓冲区曾阻塞,问题可能在下游消费能力不足

示例命令定位重传延迟:

tcpdump -r trace.pcap -nn 'tcp[tcpflags] & (tcp-rst|tcp-syn) == 0' -w nohandshake.pcap
tshark -r nohandshake.pcap -Y 'tcp.analysis.retransmission || tcp.analysis.duplicate_ack' -T fields -e frame.time_epoch -e tcp.seq -e tcp.len -e tcp.analysis.rtt

墨鱼aigc
墨鱼aigc

一款超好用的Ai写作工具,为用户提供一键生成营销广告、原创文案、写作辅助等文字生成服务。

下载

哪些场景下业务无超时但性能已受损

即使 HTTP status 200 正常返回,以下情况仍会静默拖慢吞吐或提高 P99 延迟:

  • 频繁小包重传(如 TLS record 层每个 1388 字节包都重传一次)→ 实际吞吐跌至理论带宽 30% 以下
  • 重传集中发生在某条连接的中后段(如 POST 请求 body 上传到 80% 时丢包)→ 客户端感知为“卡顿”,但服务端日志只记一条完整请求
  • tcp_slow_start_after_idle 开启(默认开启)→ 长连接空闲后恢复传输时退回到慢启动,即使没丢包也会临时限速
  • 接收端 net.ipv4.tcp_rmem 设置过小(如 4096 65536 65536)→ 窗口缩成 64KB,持续触发 Window Full + Dup ACK 循环

下一步排查必须检查的 4 个地方

别只盯着 tcpdump 输出,这四个位置才是根因高发区:

  • 本机 /proc/net/snmpTcpExt: 行的 SyncookiesSentTCPSpuriousRtxHostQueuesTCPTimeouts —— 若 TCPTimeouts 显著高于 TCPRetransSegs,说明 RTO 设置过短或网络抖动严重
  • 对端设备(交换机/防火墙/NIC)的输入错误计数:ethtool -S eth0 | grep -i "err\|drop\|over",特别关注 rx_missed_errorsrx_over_errors
  • 路径 MTU 是否被中间设备暗改:用 ping -M do -s 1472 x.x.x.x 测试,若不通而 -s 1400 通,则存在 PMTU 黑洞,引发大量 ICMP "Fragmentation Needed" 但被过滤
  • 是否启用了 tcp_sack(默认开启)但接收端内核版本

真正棘手的问题往往藏在 NIC offload 功能和网卡驱动之间——比如某些 Mellanox CX-4 卡在启用 lro 时,会对分片重组失败的包反复生成 Dup ACK,但业务完全无感,直到并发连接数上万才暴露吞吐瓶颈。

相关专题

更多
http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

393

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

416

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2081

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2036

2024.08.16

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1353

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

704

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

777

2023.07.05

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.7万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号