mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-19 14:10:43 +00:00
修局域网/中转对比基准:它自己有两个 bug,害产品背了黑锅
这个基准一直是红的(中转那条路报「连接阶段失败: timed out」),
而且报告里写着"这是中转链路的产品 bug"。**查下来不是产品的问题。**
== bug 1:两条路用了同一个配对码 ==
基准为了排除互相干扰,给两条路**各起一台全新被控端**(设计是对的),
但两台都用了写死的 code="246813"。
中转有「一个配对码只属于一台设备」的规则:
第 1 台(跑局域网)注册成功
-> stop_agent 杀掉进程,但**中转还以为它在线**(last_seen 没过期)
第 2 台(跑中转)用同一个码注册 -> **被拒**
中转日志:配对码 246813 已被 ... 占用,拒绝 ...
而 start_agent 只检查"有没有设备在线" —— 第 1 台僵尸还挂着,
于是**以为新的一台登记成功了**
-> 没有任何进程在回包 -> 超时
对照实验(新增 _build/verify_code_reuse.py):
场景 A 同一个码 -> **不通**
场景 B 各用不同码 -> 通
修法:两条路各用不同码;start_agent 的判据从"有没有在线设备"
改成"有没有**配对码正好是这一台要用的码**的在线设备"。
== bug 2:attach 用的还是旧码(我第一版补丁也漏了这处)==
relay_connect() 里 `client.attach(code)` 用的还是局域网那个码 ——
attach 到一台已经死掉、但中转以为在线的设备上,pair 自然没人回。
修成 `attach(relay_code)`。
== 顺带更新一段过时注释 ==
原文写着「当前版本经中转只稳定支撑前 1~2 次交互……这是中转链路的
产品 bug」,并据此把中转的轮数调小、超时调短。
那个 bug **已经修好了**(根因:一条 HTTP/1.1 连接被长轮询和发命令
两个线程同时用,撞状态机抛 CannotSendRequest("Idle"),
异常冒到 _client_loop 外面把 client-relay 线程打死)。
注释不更新会误导后人以为产品还有这个问题。
== 修好之后的实测(本地中转,30 次/路)==
局域网 握手 16ms 成功 30/30 (100%) 中位 0ms P90 0ms 最大 1ms
中转 握手 46ms 成功 30/30 (100%) 中位 15ms P90 29ms 最大 32ms
这是本地中转,量的是**协议本身的开销**(长轮询往返 vs 直连 TCP);
真实跨网络那条腿的 1.0~1.5 秒来自隧道和 4G,是另一回事。
结论:局域网确实是"毫秒级、不耗流量"的那条根本路径 ——
中位 0ms vs 15ms,而且不走任何外网。
踩坑记录:这两处都是"看起来像产品 bug、实际是测试自己的 bug"。
先怀疑测量工具,比先怀疑产品更省时间 ——
上一次(管理页缓存头)也是我拿 curl -I 测 GET 白查了半天。
This commit is contained in:
@@ -266,6 +266,23 @@ echo " 沙箱: $TMP"
|
||||
echo " 安装根: $SANDBOX"
|
||||
echo " 桩命令: $(ls "$STUB" | tr '\n' ' ')"
|
||||
|
||||
# 桩还在不在?每节开头都查一次。
|
||||
# 桩目录一旦丢了,后面所有"没启用 / 没生成 / 退出码不对"的断言
|
||||
# 都会变成假失败,而且报错信息完全指不到真正的原因 ——
|
||||
# 实测踩过:桩被删掉之后,deploy.sh 找不到 cloudflared 就去
|
||||
# 真的下载 GitHub,整个测试卡死十分钟。
|
||||
stub_ok() {
|
||||
local where="$1"
|
||||
if [ -d "$STUB" ] && [ "$(command -v systemctl 2>/dev/null)" = "$STUB/systemctl" ]; then
|
||||
ok "桩完好($where)"
|
||||
else
|
||||
bad "桩丢了或 PATH 被改($where):
|
||||
STUB 存在吗: $([ -d "$STUB" ] && echo 是 || echo 否)
|
||||
systemctl 解析到: $(command -v systemctl 2>/dev/null || echo 空)
|
||||
PATH 前 80 字符: ${PATH:0:80}"
|
||||
fi
|
||||
}
|
||||
|
||||
# ════════════════════════════════════════════════════════════════
|
||||
echo
|
||||
echo "── 5. 第一次部署(--skip-tunnel,不碰隧道)──"
|
||||
@@ -499,6 +516,7 @@ fi
|
||||
# ────────────────────────────────────────────────────────────────
|
||||
echo
|
||||
echo "── 7c. 默认:两个隧道单元都要启用(协议级故障隔离)──"
|
||||
stub_ok "7c"
|
||||
# 真机实测(40 次/组):quic 8 + h2 2 拿到 100% 可用率 + 最低 P90/P99。
|
||||
# 单独跑一个协议都不如两个一起跑:
|
||||
# 运营商限 UDP(12 个 edge IP:TCP 12/12 通、UDP 0/12 通)
|
||||
@@ -526,6 +544,7 @@ fi
|
||||
|
||||
echo
|
||||
echo "── 7d. --protocol quic:只跑主隧道 ──"
|
||||
stub_ok "7d"
|
||||
: > "$STUB_LOG"
|
||||
printf 'lanremote-relay\n' > "$STUB_LOG.state"
|
||||
bash "$DEPLOY" --prefix "$SANDBOX" --protocol quic \
|
||||
@@ -549,6 +568,7 @@ fi
|
||||
|
||||
echo
|
||||
echo "── 7e. --protocol http2:只跑副本隧道 ──"
|
||||
stub_ok "7e"
|
||||
: > "$STUB_LOG"
|
||||
printf 'lanremote-relay\n' > "$STUB_LOG.state"
|
||||
bash "$DEPLOY" --prefix "$SANDBOX" --protocol http2 \
|
||||
@@ -567,6 +587,7 @@ fi
|
||||
|
||||
echo
|
||||
echo "── 7f. --protocol 的非法值要报错 ──"
|
||||
stub_ok "7f"
|
||||
bash "$DEPLOY" --prefix "$SANDBOX" --protocol udp >/dev/null 2>&1
|
||||
check "非法协议退出码为 2" "$?" "2"
|
||||
bash "$DEPLOY" --prefix "$SANDBOX" --protocol both >/dev/null 2>&1
|
||||
@@ -574,6 +595,7 @@ check "both 是合法值" "$?" "0"
|
||||
|
||||
echo
|
||||
echo "── 7g. --port 换端口时 config.yml 必须跟着改 ──"
|
||||
stub_ok "7g"
|
||||
# 只改 unit 里的 RELAY_PORT、不改 config.yml 的话,
|
||||
# 隧道会回源到老端口(没人听),现象是"隧道连上了但一访问就 502"。
|
||||
if grep -q '127.0.0.1:8080' "$CFD/config.yml" 2>/dev/null; then
|
||||
@@ -605,6 +627,7 @@ fi
|
||||
|
||||
echo
|
||||
echo "── 7b. 再跑一次(不给 --hostname),config.yml 不该被改 ──"
|
||||
stub_ok "7b"
|
||||
H3=$(md5sum "$CFD/config.yml" | awk '{print $1}')
|
||||
bash "$DEPLOY" --prefix "$SANDBOX" > "$TMP/run4.log" 2>&1
|
||||
RC4=$?
|
||||
@@ -722,6 +745,7 @@ fi
|
||||
# ════════════════════════════════════════════════════════════════
|
||||
echo
|
||||
echo "── 12. 有凭据但没给域名 → 不许乱猜,必须明确提示 ──"
|
||||
stub_ok "12"
|
||||
CFD2="$TMP/nohost/root/.cloudflared"
|
||||
SANDBOX2="$TMP/nohost"
|
||||
mkdir -p "$CFD2"
|
||||
|
||||
Reference in New Issue
Block a user