资讯详情

资讯详情

比丢包率更准:TcpQuality如何用bpftrace追踪TCP重传并量化真实网络损耗

【免费下载链接】TcpQuality项目地址https://gitcode.com/gh_mirrors/tc/TcpQuality点击查看免费下载测网速时ping 丢包率常常是 0%但真实业务却卡顿——问题在于 ICMP 小包与 TCP 大流量的路径、优先级都不同。TcpQuality 是一款 Linux TCP 质量检测脚本它借助 bpftrace 在内核级钩住tcp_retransmit_skb事件逐段记录真实重传并去重计数把这条链路到底丢了多少 TCP 数据段量化成可对比的指标比传统丢包率更贴近用户真实体感。为什么丢包率经常会骗人很多运维工具用 ping 或 mtr 判断网络质量但这类探测存在明显偏差协议不同ping 发的是 ICMP 小包而你的业务走的是 TCP 443 大流量部分运营商会对其做不同的 QoS 调度包长不同小探针包容易挤进队列大包却容易触发队列丢弃口径不同ICMP 丢包按往返失败计一次抖动就可能丢一个 ping而 TCP 一次丢包会触发整段重传两者的量级完全不可比。换句话说ping 显示 0% 丢包 ≠ 你的 TCP 流量没有丢包。真正反映链路损耗的是有多少 TCP 数据段被迫重传了至少一次。核心原理bpftrace 内核级追踪重传TcpQuality 的关键在于直接用 bpftrace 在内核里抓重传这个动作本身。核心脚本是 tcpquality-retrans-seq.bt它挂载在内核 tracepointtcp:tcp_retransmit_skb上tracepoint:tcp:tcp_retransmit_skb /args-dport 443/ { if (args-skbaddr ! 0) { $skb (uint64)args-skbaddr; $seq *(uint32 *)($skb 40); $end_seq *(uint32 *)($skb 44); ... } }它只关注443 端口的 TCP 重传事件从重传 skb 中读出该数据段的seq/end_seq序列号区间连同目标地址、socket 指针一起输出。这样每一个被重传的数据段都有了一份内核级证据而不是靠事后估算。一个细节很见功力同一个数据段可能被重传多次RTO 退避后反复发。TcpQuality 在用户态以skaddr seq end_seq组合去重保证一个数据段无论重传几次只计一次——这正是唯一重传段占比比裸重传次数更能反映真实损耗的原因。双保险设计seq 主探针 skb 兜底不同内核的 BTF 信息可用性不同直接读 TCP 控制块可能在某些内核上失败。TcpQuality 为此准备了两级探针探针文件去重键适用场景seq 主探针tcpquality-retrans-seq.btsocket seq end_seq内核 BTF 可读精度最高skb 兜底探针tcpquality-retrans-skb.btsocket skb 指针无 BTF TCP 类型的内核启动逻辑在 runTcpQuality-core.sh 的speedtest_retrans_trace_start中优先尝试 seq 探针失败则自动切换 skb 兜底方案两者都不可用时才放弃追踪绝不输出一个虚假的0 重传结果。脚本注释里还特别提醒 shell 侧校验器要拒绝零序列号记录防止内核布局差异污染数据。与 TCP_INFO 交叉验证结果更可信只靠 tracepoint 还不够TcpQuality 还引入第二数据源做交叉验证tcpquality-tcpinfo.c。这是一个轻量级 LD_PRELOAD 库会拦截测速进程curl的connect/close调用只跟踪目标 IP 的 443 连接连接关闭时用getsockopt(TCP_INFO)读取该 socket 的权威统计tcpi_total_retrans累计重传次数、tcpi_data_segs_out发出数据段数、tcpi_bytes_retrans重传字节数写入快照文件供主脚本解析。若系统没有预编译库主脚本会自动降级为用ss -tinp解析同等信息见 runTcpQuality-core.sh 的speedtest_tcp_info_ss_snapshot。最终报告里bpftrace 的唯一重传段数必须落在 TCP_INFO 累计重传数的合理范围内才会被采纳runTcpQuality-core.sh两套独立数据互相印证结果可靠性远高于单一来源。如何跑起来一行命令测出真实损耗TcpQuality 默认检测全国三网运营商节点入口脚本为 runTcpQuality.sh。国内环境一行即可运行bash (curl -fsSL https://tcpquality.ibsgss.uk/run)常用参数完整列表见 README.md--all完整检测 IPv4/IPv6、CERNET/CERNET2、国际互联和单线程测速--speedtestTCP 质量探测后追加单线程测速重传追踪就工作在这一阶段-p NUM并行节点数范围 1-31默认 16--province bj等只测指定省份。测速阶段的完整流水线是启动 bpftrace 探针 → 启动 TCP_INFO 监控 → 发起 curl 下载/上传 → 停止探针 → 去重计数并交叉校验。整套编排集中在 runTcpQuality-core.sh 中你无需关心任何细节报告会自动呈现每个节点的延迟、重传数与重传占比。你最终会得到什么跑完后每个节点会得到一组远比丢包率 0%有信息量的指标唯一重传段占比真正发生过至少一次重传的数据段比例直接量化链路损耗累计重传数与重传字节数来自 TCP_INFO 的 socket 级口径单线程测速速率在锁定 TOS 计数、排除干扰流量后的干净速率分方向下载/上传、分地址族IPv4/IPv6的对比帮助定位是回程质量差还是国际互联抖动。小结 TcpQuality 的思路很清晰既然 ICMP 丢包率不能代表 TCP 真实损耗那就回到内核本身用 bpftrace 逐个追踪重传数据段、用 seq 去重计数再叠加 TCP_INFO 交叉验证。对需要评估线路质量的站长和运维来说这套重传追踪 多源校验的方法比任何单一 ping 指标都更接近用户的真实体感。项目采用 GPL-3.0-only 授权详见 LICENSE。赞分享【免费下载链接】TcpQuality项目地址https://gitcode.com/gh_mirrors/tc/TcpQuality点击查看免费下载相关推荐1分钟测出服务器真实网络质量TcpQuality TCP质量探测快速入门指南1分钟测出服务器真实网络质量TcpQuality TCP质量探测快速入门指南 TcpQuality 是一个 TCP 质量检测脚本能在一分钟内测出服务器的真实BTree 开源项目使用教程BTree 开源项目使用教程 1. 项目的目录结构及介绍 btree/ ├── btree.go ├── btree_test.go ├── LICENSE ├可观测性性能剖析tracetcp完整指南如何用TCP追踪快速诊断网络故障tracetcp完整指南如何用TCP追踪快速诊断网络故障 在网络连接故障排查中tracetcp作为一款专业的TCP路由追踪工具能够通过发送TCP SYN数上一篇还在为 .qmc0、.ncm 打不开发愁三分钟学会用 Unlock Music 免费解锁加密音乐下一篇三步为整张专辑配齐歌词163MusicLyrics批量获取LRC歌词的完整上手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →