0

0

tcpdump 抓到大量 TCP Retransmission 但业务日志没超时怎么分析

舞姬之光

舞姬之光

发布时间:2026-01-19 08:46:03

|

587人浏览过

|

来源于php中文网

原创

TCP重传不等于业务异常,需结合重传率、时延影响及双向抓包定位根因:检查RST/断连、统计重传比例、分析重传间隔与RTO关系,区分正向丢包或反向ACK丢失,并排查NAT、安全组、网卡offload等隐形干扰。

tcpdump 抓到大量 tcp retransmission 但业务日志没超时怎么分析

业务没报错但 tcpdump 显示大量 TCP Retransmission,说明网络层已出现丢包或延迟异常,而应用层因重传机制掩盖了问题——需从“是否真影响业务”和“为什么重传”两个维度交叉分析。

确认重传是否真实影响业务时延

TCP 自身有重传+快速重传+SACK 等机制,只要重传成功、数据最终送达,上层应用(如 HTTP、数据库客户端)可能完全无感知。但代价是:时延升高、吞吐下降、连接抖动。

  • tcpdump -nn -r trace.pcap 'tcp[tcpflags] & (tcp-rst|tcp-fin) != 0' 检查是否有 RST 或异常断连,若有,说明连接被中断过
  • tshark -r trace.pcap -q -z io,stat,1,"tcp.analysis.retransmission" 统计每秒重传数,结合业务 QPS 判断比例(例如:QPS=100,重传率>5% 就值得深挖)
  • 挑几个重传明显的流,用 tshark -r trace.pcap -Y "tcp.stream eq N and tcp.analysis.retransmission" -T fields -e frame.time_epoch -e tcp.time_delta 查看重传间隔,若多次重传间隔接近 RTO(如 200ms/400ms/800ms),说明链路持续不稳定

定位重传根源:先分清是单向丢包还是双向延迟不对称

重传只发生在发送方收不到 ACK 时,不一定是路径丢包,也可能是 ACK 回不来(比如反向路径拥塞、防火墙限速、NAT 超时等)。

天谱乐
天谱乐

唱鸭旗下AI音乐创作平台,为您提供个性化音乐创作体验!

下载
  • 抓包时务必在客户端和服务端**同时抓**,比对同一连接的 SYN/SYN-ACK/ACK 和后续 ACK 序列:若服务端发了 ACK,客户端没收到 → 反向路径问题;若客户端发了数据,服务端没收到 → 正向路径问题
  • 检查服务端 netstat -s | grep -i "retran"ss -i 输出中的 retransretransmits 字段,确认内核是否也统计到重传(排除抓包位置误导)
  • mtr --tcp -P 443 目标IPtcpping -x 10 目标IP 443 测试端到端路径稳定性,观察是否某跳延迟突增或丢包率高

排查常见隐形干扰源

很多重传不是物理链路问题,而是中间设备策略导致:

  • 云厂商安全组 / ACL / WAF:部分云平台对新建连接首包限速、或对 ACK 包做深度检测引入延迟,导致 ACK 晚到触发重传
  • NAT 设备老化超时:特别是长连接空闲后,NAT 表项老化,后续 ACK 无法匹配,被丢弃 → 客户端等不到 ACK 而重传
  • 网卡 offload 功能干扰:如 TSO/GSO/LRO 开启时,tcpdump 抓到的是分片前的大包,但实际线路上是小包,重传逻辑与抓包视图不一致;可用 ethtool -k eth0 查看并临时关闭:sudo ethtool -K eth0 tso off gso off lro off
  • 时间戳选项(TCP Timestamps)异常:某些老旧中间设备会错误修改或丢弃带 timestamp 的 ACK,导致接收方忽略该 ACK,发送方误判丢包

验证业务是否真的“没超时”的方法

日志没报错 ≠ 业务没受影响。很多 SDK 默认开启重试(如 OkHttp、gRPC),一次失败自动重发,最终成功但耗时翻倍。

  • 在客户端代码中开启底层网络日志(如 Java 的 -Djavax.net.debug=ssl:handshake 或 Netty 的 io.netty.handler.logging.LoggingHandler),看是否有 connect timeout / read timeout / write timeout 记录
  • bpftraceperf trace 监控系统调用:perf trace -e 'syscalls:sys_enter_connect,syscalls:sys_exit_connect,syscalls:sys_enter_sendto,syscalls:sys_exit_sendto' -p $(pidof your_app),观察 sendto 是否阻塞或返回 -EAGAIN/-EWOULDBLOCK
  • 对比同一请求在不同环境(如直连 vs 经 LB)下的 P99 延迟,若经 LB 后延迟明显升高且重传增多,基本可锁定 LB 或其背后网络策略

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

838

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

741

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

737

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

399

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

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

精品课程

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

共23课时 | 2.7万人学习

C# 教程
C# 教程

共94课时 | 7.1万人学习

Java 教程
Java 教程

共578课时 | 48万人学习

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

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