讲师中心 微信公众号
AI工具推荐 视频效率加速

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

小芳姑娘_9130

小芳姑娘_9130

发布时间:2026-01-29 19:19:02

|

320人浏览过

|

来源于php中文网

原创

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

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

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

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

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

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

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

  • 如果在客户端机器抓包,看到自己发的包被重传 → 很可能客户端到服务端之间有丢包(防火墙限速、网卡驱动 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

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

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

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

用于自动切换项目中适合的node 版本
用于自动切换项目中适合的node 版本

根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。

下载
  • 服务端启用了 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 -s 中 TcpExtTCPDelivered 与 TcpOutSegs 的比值:若显著低于 1,说明大量数据被重传后才交付,虽未超时但有效吞吐已受损
  • 用 ethtool -S eth0 查网卡收发队列丢包(rx_missed_errors、tx_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 是起点,不是答案。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

848

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1029

2023.11.28

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6287

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2648

2023.08.10

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

1907

2023.09.19

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

6396

2023.08.14

http500解决方法
http500解决方法

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

3723

2023.11.09

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

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

934

2023.11.14

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebSocket手册
WebSocket手册

共0课时 | 0人学习

HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 11万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 28.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn