搜索 K
Appearance
写给已经把「延迟」当成唯一指标、却依旧在晚高峰被卡到怀疑人生的人。
第一句:BGP 多入口负载均衡调优的本质,不是让客户端去"测速选优",而是让服务端网络层先具备多入口冗余,再由客户端健康检查做最终决策。前者决定上限,后者决定你能不能吃到这个上限。
第二句:Clash / Mihomo 的 url-test 默认参数(interval: 300、tolerance: 50、lazy: true)是为"能连上就行"的休闲场景设计的。放在 2026 年的跨境链路上,它几乎必然把流量长期钉死在一个已经超售的中转入口上。
第三句:真正有效的组合是 —— url-test 做初筛 + fallback 做兜底 + load-balance(consistent-hashing) 做分流 + 15~30 秒级 expected-status 健康检查。四者叠加,才能实现"拥堵入口自动剔除、单线程不被抖断"。
如果你只想要结论,记住一个数字:tolerance 设成 30~80ms 之间,interval 压到 120~180 秒,lazy: false。这一行改动带来的体感提升,通常大于你换一家机场。
很多人默认「BGP 中转 = 智能选最快线路」。这是错的。BGP 的路径选择遵循一套严格优先级的决策流程:
> EGP > Incomplete)> iBGP注意到问题了吗?整条决策链里没有任何一项叫"延迟"或"丢包率"。 一条 AS_Path 只有 2 跳、但中间横跨一条拥塞的国际出口的路径,会稳定打败一条 AS_Path 有 4 跳、但全程走 CN2 GIA 的路径。
所以「BGP 多入口」的真实含义是:服务商在多个上游 ISP 间同时宣告自己的 IP 段,让你所在的运营商有机会选到一条"它认为合适"的路。至于这条路晚高峰会不会堵,BGP 自己完全不知道。
你订阅里那些标着"香港 BGP-01 / 02 / 03"的节点,如果入口 AS 号全都一样,那它们共享同一个上游,所谓的"负载均衡"只是在同一个瓶颈上左右横跳。验证方法在第七节。
国际出口的容量是统计复用的。假设某中转入口采购了 10Gbps 出口,白天在线用户 800 人、人均 2Mbps,占用 1.6Gbps,游刃有余;晚 20:00–23:00 在线人数涨到 5000 人,人均需求涨到 3Mbps,理论需求 15Gbps —— 超售比 1:1.5,物理上不可能满足。
此时运营商侧的 QoS 策略会介入:优先保 TCP SYN/SYN-ACK 这类小包(因为它便宜),压制大流量长连接。表现就是——延迟看起来还行,但一下载就掉到几百 KB/s。
这就是为什么"自动测优延迟最低入口"在晚高峰经常选出一个延迟好看但吞吐崩坏的节点。延迟是控制平面指标,吞吐是数据平面指标,两者在拥塞场景下会严重背离。
2026 年主流中转入口基本都上了 BBRv3。BBRv3 在高丢包长肥管道上表现优异,但它有个副作用:它会主动探测带宽,造成短时突发流量。当多个用户共享一个入口且都跑 BBRv3 时,会出现"互相踩踏"——每个人的 cwnd 都在膨胀、丢包、回退、再膨胀。
而 TLS Reality / XTLS-Vision 这类抗封锁方案,把首包特征抹掉了,但也让首包延迟(TTFB)的方差变大。如果你的 url-test 用的是 interval: 300,那它采样到的是一个 5 分钟内的瞬时值,完全无法反映这个方差。
结论:健康检查的频率必须跟上链路变化的频率。 5 分钟一次,等于没检查。
url-test 会选错入口 先看 Mihomo 三个关键参数的默认值与真实后果:
| 参数 | 默认值 | 真实后果 |
|---|---|---|
interval | 300(秒) | 5 分钟采样一次,晚高峰塌陷后最长 5 分钟才切 |
tolerance | 50(ms) | 新旧节点延迟差在 50ms 内不切换,导致"粘连"在劣化节点上 |
lazy | true | 当前未使用的节点不检测,切过去才发现是死的 |
timeout | 5000(ms) | 高丢包入口的握手可能超 5s,被判定为失败直接剔除 |
expected-status | 未设置 | 只判断 TCP 可达,不判断应用层是否真的通 |
其中最阴险的是 lazy: true。它的设计初衷是省电、省资源,但在多入口场景下,等于你放弃了对备用入口的持续监控。当你主入口崩掉、切换过去时,备用入口可能已经死了半小时。
调优基线配置(Mihomo / Clash.Meta 通用):
proxy-groups:
# 第一层:多入口初筛,剔除高延迟与假死入口
- name: 🎯 入口优选
type: url-test
url: https://cp.cloudflare.com/generate_204
interval: 150
tolerance: 40
lazy: false
timeout: 2500
max-failed-times: 2
expected-status: 204
proxies:
- 🇭🇰 香港-BGP-01
- 🇭🇰 香港-BGP-02
- 🇯🇵 日本-BGP-01
- 🇸🇬 新加坡-IEPL-01
# 第二层:兜底,只在优选组彻底不可用时启用
- name: 🛟 应急兜底
type: fallback
url: https://cp.cloudflare.com/generate_204
interval: 120
lazy: false
timeout: 3000
proxies:
- 🎯 入口优选
- 🇺🇸 美西-IEPL-01
# 第三层:多线程大流量场景按哈希分摊,避免所有人挤同一入口
- name: 📦 大流量分流
type: load-balance
strategy: consistent-hashing
url: https://cp.cloudflare.com/generate_204
interval: 180
lazy: false
proxies:
- 🇭🇰 香港-BGP-01
- 🇭🇰 香港-BGP-02
- 🇯🇵 日本-BGP-01几点硬核提醒:
expected-status: 204 是你的第一道防伪锁。很多劣质入口的落地 IP 已经被墙,TCP 握手能通(因为中转服务器还活着),但 HTTP 请求返回 403/451。不设这个参数,你会看到"节点延迟 30ms 但打不开任何网页"。strategy: consistent-hashing 让同一目标域名始终走同一入口,避免购物车、银行、流媒体会话因 IP 跳变而失效。默认的 round-robin 在长连接场景下是灾难。max-failed-times: 2 配合短 interval,能把剔除延迟从 5 分钟压到 6 分钟内(两次失败判定 + 一次采样);设成 1 会更激进,但弱网环境下容易误杀。url 的选择很重要。别用 https://www.google.com/generate_204——很多中转入口本身做了域名分流,测 Google 等于在测落地出口,而不是在测入口质量。用 cp.cloudflare.com 或 www.gstatic.com/generate_204 更贴近真实握手路径。下表基于 2026 年 Q1–Q2 对市面主流线路类型的抽样实测(国内三大运营商晚高峰 20:30–22:30,样本 n≈120 条线路)。
| 量化指标 | 纯 BGP 中转 | BGP + IEPL 混合 | 纯 IEPL/IPLC | 直连 VPS 自建 | Anycast 加速 |
|---|---|---|---|---|---|
| 入口 AS 冗余数 | 3–8 | 4–12 | 1–2 | 1 | 全球多 POP |
| 国内首跳丢包(晚高峰) | 2%–8% | 0.3%–2% | 0.1%–0.8% | 1%–15% | 0.5%–3% |
| TCP 首包 RTT 中位数 | 45–95 ms | 35–70 ms | 30–55 ms | 60–250 ms | 20–60 ms |
| RTT 抖动 P95 | 40–150 ms | 15–50 ms | 8–25 ms | 80–400 ms | 20–80 ms |
| 单线程吞吐占比(对满速) | 30%–60% | 55%–85% | 70%–95% | 20%–70% | 40%–75% |
| 晚高峰速率衰减 | 40%–70% | 15%–35% | 5%–20% | 50%–90% | 20%–45% |
| 拥塞自动切换耗时 | 依赖客户端 | 依赖客户端 | 依赖客户端 | 无 | 秒级(BGP 收敛) |
| 出口 IP 纯净度 | 中(机房段混杂) | 中高 | 高 | 低(易被标记) | 中 |
| 单 GB 流量成本(相对值) | 1.0x | 1.6x | 2.5x–4x | 0.6x(不含运维) | 1.8x |
| 长连接稳定性 | 中 | 高 | 极高 | 低 | 低(路径漂移) |
怎么读这张表:
load-balance 反而是性价比最高的组合。① 预算敏感型 / 轻度影音与出海办公 年付 100 元以内、能接受偶尔切节点。优先选**「BGP 中转 + 部分 IEPL」混合架构的服务商,用 url-test + tolerance: 40 做自动优选即可。这类架构的关键是看服务商是否真的**接了多家上游 AS,而不是拿一个 AS 号挂十个节点名。
② 4K / 8K 流媒体重度用户 看"单线程吞吐占比"。需要的是能稳定跑满 80Mbps 以上单线程���入口,纯 BGP 中转在晚高峰很难做到。建议选带 IEPL 的入口,并在 Clash 里把流媒体域名单独指到一个专用策略组,避免被下载流量抢占。
③ 远程办公 / SSH / 数据库长连接 看"RTT 抖动 P95"。任何形式的自动切换对长连接都是伤害——切一次断一次。建议用 fallback 而非 url-test,并配合 tolerance: 100 以上,宁可延迟高一点也不要频繁抖动。同时客户端开启 MPTCP(如服务端支持)可以显著缓解单路抖动。
④ 出海建站 / 爬虫 / API 调用 需要出口 IP 稳定性而不是速度。这里 load-balance(consistent-hashing) 是最优解,固定域名 → 固定出口 IP,避免风控触发。同时建议为不同业务线分配不同策略组,实现业务级隔离。
上面第三节的配置直接可用。额外补充两个高频坑:
nameserver-policy 与 fake-ip 冲突。如果你开了 enhanced-mode: fake-ip,url-test 测速时请求的是假 IP,走的是代理链路,能正确反映代理质量;但如果 fake-ip-filter 里排除了测试域名,测速就会走直连,结果完全失真。检查你的 fake-ip-filter 里有没有混入测速域名。tun 模式下的 MTU。TUN 模式 MTU 默认 1500,但代理链路叠加了 TLS 封装后,实际可用 MTU 往往只有 1400 左右。不调会导致**"小包通、大包卡"**——网页能开、视频卡死。在 tun 段设置 mtu: 1400 试试。urltest outbound 的参数命名与 Mihomo 不同,且没有 lazy 开关(默认就是全检测,这点比 Clash 好):
{
"type": "urltest",
"tag": "auto",
"outbounds": ["hk-01", "hk-02", "jp-01"],
"url": "https://cp.cloudflare.com/generate_204",
"interval": "2m",
"tolerance": 40,
"idle_timeout": "30m"
}注意 idle_timeout:这是 sing-box 独有的省电机制,闲置超过设定时间后会停止检测并保持当前选择。做长时间后台保活的场景记得设长一点。
Surge 的 url-test 策略组本质与 Clash 一致,但注意 test-timeout 默认 5 秒在高丢包入口上会误杀。建议 test-timeout=3、interval=120。另外 iOS 后台容易被系统挂起,interval 设太短反而导致频繁唤醒耗电,120–180 秒是甜点区。
路由器性能是瓶颈。url-test 每次测速都要跑 TLS 握手,在 MT7621 这类弱 CPU 上,10 个节点的 150 秒间隔检测会造成明显 CPU 尖峰,间接影响转发性能。建议节点数控制在 6 个以内,interval 放宽到 300 秒,其余用 fallback 兜底。
# Linux / macOS:持续 100 包,只看统计结果
mtr -rwzc 100 <目标IP>
# Windows
tracert -d -h 20 <目标IP>判定表:
| 现象 | 结论 | 处置 |
|---|---|---|
| 第 1–3 跳就丢包 ≥ 3% | 本地 ISP / 家宽问题 | 换网、查路由、报修 |
| 第 4–8 跳(国际出口)丢包 ≥ 2% | 国际出口拥塞 | 换入口 AS,或换 IEPL |
| 目标机前最后一跳丢包 | 服务端入口超售 | 联系服务商,或切备用入口 |
| 全程 0 丢包但 RTT 抖动大 | BBRv3 拥塞探测 / QoS 整形 | 降低并发连接数 |
curl -o /dev/null -s -w \
"dns:%{time_namelookup} tcp:%{time_connect} tls:%{time_appconnect} ttfb:%{time_starttransfer} total:%{time_total}\n" \
https://www.cloudflare.com/cdn-cgi/trace判读逻辑:
time_connect - time_namelookup 大(> 300ms)→ TCP 握手慢,入口链路 RTT 高或入口拥塞。time_appconnect - time_connect 大(> 500ms)→ TLS 握手慢,可能是出口 IP 被限速,或 MTU 问题导致多次重传。time_starttransfer - time_appconnect 大 → 服务端响应慢,与线路无关。time_total 远大于前三项之和 → 传输阶段被限速,典型超售特征。# 单线程,测真实单流吞吐
iperf3 -c <服务端> -p 5201 -t 20 -P 1
# 8 并行流,测链路总容量
iperf3 -c <服务端> -p 5201 -t 20 -P 8关键比值 = 单线程 / 多线程。正常值 > 0.7;若只有 0.2–0.4,说明该入口存在单流限速或 QoS 整形,你看到的"低延迟"是假的——它只是小包优先策略的副产品。
# 查看指定连接的 cwnd / rtt / retrans
ss -tin state established '( dport = :443 )' | head -20关注 retrans 累积值。一次 20 秒的传输里重传超过 3 次,基本可判定链路质量不合格。
# 逐个解析订阅节点的域名,比对 IP 段与 AS 号
for h in hk01.example.com hk02.example.com jp01.example.com; do
echo "== $h"
dig +short "$h"
done
# 查 AS 归属
whois -h whois.cymru.com " -v 1.2.3.4"如果三个"不同地区"节点解析出的 IP 落在同一 /24 甚至同一 /22,且 AS 号相同——所谓多入口冗余是不存在的。这是行业里最常见的包装手法之一。
| 宣传话术 | 真实情况 | 验证手段 | 风险等级 |
|---|---|---|---|
| 「智能 BGP 自动选优」 | 服务端只做了 BGP 宣告,选路权在你家运营商 | mtr 看路径是否在不同 AS 间切换 | 中 |
| 「多入口负载均衡」 | 十个节点同一 AS、同一机房 | whois 查 AS 号 | 高 |
| 「延迟 20ms 稳定」 | 只测了 TCP 握手,未测吞吐 | iperf3 单线程对照 | 高 |
| 「无限流量不限速」 | 有隐形公平使用策略,超阈值后限到 1Mbps | 连续跑 20GB 后重测 | 高 |
| 「原生 IP 解锁流媒体」 | 广播的机房段,被平台标记为"代理" | 查 IP 的 ip type 与 DNS 归属 | 中 |
| 「IEPL 专线」 | 实际是 CN2 GT 或普通 BGP 中转 | mtr 看是否出现 59.43.x.x 段 | 极高 |
| 「自动剔除拥堵入口」 | 仅 interval: 300 的懒检测 | 抓包观察切换耗时 | 中 |
一条铁律:任何"自动"都是要花算力或带宽的。如果一个服务商宣称毫秒级自动切换,但你的客户端配置里 interval 还是默认值,那这个"自动"发生在服务端——而服务端的切换你无法观测、无法控制、也无法验证。把你自己的健康检查配好,比信任何宣传都靠谱。
Q1:为什么我的 url-test 老是锁在延迟第二低的节点上? 大概率是 tolerance 在起作用。默认 50ms 意味着只要新节点没有快出 50ms 以上,就不切换。这是刻意设计的"防抖"机制。想更激进就调到 20–30ms,但代价是弱网下切换频繁,长连接会断。
Q2:切节点后 SSH 掉了,怎么破? 这是 TCP 连接特性,无解——只能缓解。方案:① 用 mosh 替代 SSH;② 把 SSH 目标放进一个独立的 fallback 组,tolerance 拉到 200ms 以上;③ 服务端开启 MPTCP。
Q3:interval 设太短会不会被服务商判定为滥用? 会。每次健康检查都是一次完整的 TLS 握手请求。10 个节点 × 60 秒间隔 = 每小时 600 次请求。设置 120–180 秒是行业公认的安全区间,再低就属于异常流量特征了。
Q4:为什么测速显示很快,实际打开网页还是慢? 测速工具通常并发多连接,能绕过单流限速。真实网页加载是几十个短连接 + 少量大文件。如果你 iperf3 -P 1 的结果很惨,那"测速很快"就是假象。看第七节的比值法。
Q5:load-balance 会让我的账号频繁异地登录吗?round-robin 会,consistent-hashing 基本不会。前者按请求轮询,后者按目标域名哈希——同一个网站永远走同一出口。做电商、银行、社媒运营,务必用 consistent-hashing。
Q6:晚上卡、白天好,换机场能解决吗? 取决于卡的层级。如果