v0.5.4
主要修复:向导误报「本机没有 IPv4」导致流程中断
现象
跑向导时屏幕出现:
本机没有 IPv4, 测速走 IPv6
但机器明明有 IPv4,也没有 IPv6。随后走到「对端 IP」那一步直接退出:
公共测速服务器暂时都不可用, 稍后再试
测速服务器是好的,是脚本自己把协议族选错了。
什么样的机器会中
1 核 VPS + 有第二块网卡(最常见是用 Docker 装的面板留下的 docker0)。
两台客户机实测中招率 96% 和 99%;2 核约 1%(偶发,重跑一次就好,但现象一模一样,最难排查);4 核以上基本不会。
和发行版无关 —— Debian 11 / 12、Ubuntu 都复现;在同一台机器上换 iproute2 5.9 / 5.15 / 6.1 三个版本,也都复现。
根因
脚本顶部是 set -uo pipefail,而 have_ipv4 写成 ip … | grep -q 'inet '。
grep -q 一匹配就退出并关掉管道,写端 ip 还没写完就吃 SIGPIPE 被杀(退出码 141),pipefail 把 141 当成整条管道的返回值——「匹配到了」被读成「没匹配到」。
只有匹配成功时才会触发,所以表现为「机器真的有 IPv4 → 报没有 IPv4」。
此外旧版判不出 v4 就无条件切 IPv6,从头到尾没检查过机器有没有 IPv6。
改动
- 全脚本 14 处
| grep -q清零,改用命令替换 +case(26 个用例差分测试确认行为等价) have_ipv4/have_ipv6增加ip route get兜底 —— 默认路由不一定叫default,机器上跑 VPN / 透明代理时常被拆成0.0.0.0/1+128.0.0.0/1或挪进策略路由表- 切 IPv6 前必须先确认 IPv6 可用;两边都判不出来时保持 IPv4 并明确说明
小带宽机器(100 Mbps 以下)现在能正常调优了
三台 10-20 Mbps 的机器上,旧版 9 次扫描全部失败。四个原因:
probe_bandwidth把结果取整到 50 的档位,10 Mbps 直接归零 → 向导打印Measured ~0 Mbps后退出- 扫描步长硬下限 20,而小机器的扫描区间可能只有十几宽 → 只能采到 2 个点,找不到限速点
- 扫描区间用 iperf3 发送端数字推算,丢包链路上它远高于实际送达量 → 起点直接落在丢包区
- 安全余量对 100M 以下一律退 5 —— 15 Mbps 的线会被限到 10,白丢三分之一
现已分别修正:取整粒度跟档位走、步长按区间宽度推、区间改用实测送达量、余量按比例分档(≤30M 退 1、31-60M 退 2)。
其他修复
- 整形值为整千时验证误判 ——
tc会把1000显示成1Gbit,旧的解析剥不掉单位,导致跳过达成率判断。速率解析已统一成一个公共函数,11 个档位实测通过 - 机器没装
ping时甩锅测速服务器 —— 现在直接说明缺什么、怎么装;向导也会单独检查并询问安装(此前只在安装 iperf3 的分支里问,装了 iperf3 却没 ping 的机器永远问不到) - 重复跑向导时的整形残留 —— 这次没测到限速器时会主动清掉上次的限速;结果页和
verify改为读取网卡实际状态,不再出现「屏幕写未设置、网卡上还挂着旧值」 - 扫描过程中的 qdisc 残留 —— 修复扫描结束后 HTB 仍留在网卡上、屏幕却打印
qdisc restored的问题
更新方式
tcpfit update
或在菜单中选择更新。更新后需要重新运行一次 tcpfit 才会用上新版本。
首次安装:
bash <(curl -fsSL https://raw.githubusercontent.com/Kylin010/tcpfit/main/tcpfit.sh)