Skip to content

v0.5.4

Choose a tag to compare

@Kylin010 Kylin010 released this 11 Aug 06:46
· 2 commits to main since this release

主要修复:向导误报「本机没有 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)