校园网路由器 IPv6 中继长尾:一次卡顿的定位与优化记录
症状有三条:抖音视频能播但评论一直转圈,图片偶发加载失败;游戏延迟显示绿色但操作有滞后;部分网站整页打不开,刷新后恢复。
设备是小米 BE5000(固件 1.0.91),电脑走网线。此前一轮报障已经把校园网出口拥塞定为主因,结论写着”与用户侧设备无关”。
实际结果是两件事叠加:校园网出口分方向异常仍然存在,用户侧修不了;直接造成本次卡顿的是路由器自己的 IPv6 中继。关闭路由器 IPv6 后,50 路并发的最大 TCP 建连时间从 2504 ms 降到 243 ms。
一、分层定位
第一轮只做只读测量,不改配置。
| 层 | 测什么 | 结果 |
|---|---|---|
| 网卡 | 协商速率、错误与丢弃计数 | 1 Gbps 全双工,计数全 0 |
| 电脑 → 路由器 | 100 包 ping 192.168.31.1 |
全回,平均 1 ms,最大 3 ms |
| 路由器 → 校园首跳 | 10.10.30.13 |
1 ms,0% 丢包 |
| 出口分方向 | 电信、联通、移动、教育网各一个靶标 | 电信 4 ms、联通 11 ms 正常;移动 29 ms、教育网 39 ms 偏慢 |
| DNS | 四个 resolver 各查 5 次计时 | 1–2 ms,无失败 |
路由器后台读数:CPU 负载 0,内存 45%,QoS 关闭,在线 3 台设备,WAN 是校园网下发的 10.12.x.x/20 地址,MTU 1500。
同一时刻电信方向 436 Mbps,教育网方向单线程 2.3 Mbps。这组数据把慢点定位在校园网出口之后,但它解释不了上面的三条症状。
二、空闲 ping 测不出转发层故障
补充一条信息:网线直插宿舍墙口时体感更顺。这与第一层的结论冲突。如果慢点全在出口之后,绕不绕路由器不该有区别。
按可证伪的形式重排假设:
| 假设 | 预测 |
|---|---|
| IPv6 路径异常(中继质量或 PMTU 黑洞) | 同一目标 IPv6 明显慢于 IPv4,或大包失败 |
| 路由器 DNS 转发超时 | 经 192.168.31.1 解析有长尾,直查公共 DNS 正常 |
| 硬件转发 / NAT 路径抖动 | DNS 与 IPv6 正常,但并发 HTTPS 有长尾,且路由器负载仍低 |
| 出口分方向拥塞 | 不同运营商方向吞吐差异大 |
第四条已有证据,但它无法解释”绕过路由器更顺”,只能算放大器。
四条假设都指向偶发,改用并发复现。40 路并发拉抖音首页,同一时刻对路由器的 ping 仍是平均 1 ms、0% 丢包,但 40 路中有一路 TCP 建连 3 秒超时,其余拉长到 215–470 ms,而这个站平时建连只有 20–50 ms。
这就是症状的来源:页面加载要并发拉几十到上百个资源,整体耗时取决于最慢的那一条;游戏测延迟只测自己那条 UDP 会话。用平均值判断链路健康会漏掉这类故障。
三、双栈分开压
1 | # 同一目标,分别强制 IPv4 / IPv6,各打 50 路并发 |
| 协议栈 | 成功 | 建连平均 | 建连最大 |
|---|---|---|---|
| IPv4 | 50/50 | 41 ms | 252 ms |
| IPv6 | 50/50 | 220 ms | 2504 ms |
IPv6 没有失败请求,平均值也不算异常,问题全在最大值上。
DNS 假设同时被排除:四个 resolver 各查 5 次,路由器转发没有长尾也没有失败。
另一组按 PMTU 黑洞思路做的探测失败了。用 ping -6 向三个 IPv6 靶标打 1452、1440、1400、1280 四种载荷,全部 0 回复。1280 是 IPv6 强制最小 MTU,连它都不回说明不是分片问题,而是目标根本不回 ICMPv6;随后单独测 443 和 80 端口,各 100 次全部连通。这组探测不能作为证据。IPv6 环境下 ping 不通是常态,判断健康度要用 TCP 建连。
四、根因:pi_relay
xqnetwork/ipv6_status 返回如下。真实前缀和接口标识符已替换为 RFC 3849 文档前缀 2001:db8::/32,只保留结构:
1 | { |
pi_relay 决定了问题的形状。正常结构下路由器应通过 DHCPv6-PD 拿到比 /64 更大的前缀(/60 或 /56),自行切分 /64 下发给 LAN,LAN 是一段独立地址空间。这里学校只给了 WAN 一个 /64,LAN 用的还是同一个前缀,路由器无法做路由,只能中继邻居发现报文,让电脑直接在校园网那个 /64 里取地址。
直插墙口时电脑自己发 RS、收 RA,这层中继被整个跳过,所以体感更顺。
IPv6 转发本身没有额外开销,出问题的是没有 PD 时的中继模式和这版固件的实现质量。hwnat 的 force_start 读数为 0(硬件 NAT 强制开关关闭),当时也列为嫌疑,但改它会导致路由器重启、影响面比 IPv6 大,排除 IPv6 之后未再处理。
五、修复与验证
先在客户端禁用 IPv6:
1 | Disable-NetAdapterBinding -Name "以太网" -ComponentID ms_tcpip6 |
返回拒绝访问,改网卡绑定需要管理员权限。改路由器反而更合适:影响面覆盖全部设备,回滚只需把开关拨回去。
登录走固件的 xqsystem/login,密码按 sha256(nonce + sha256(密码 + 固件常量)) 做摘要,管理密码从本地文件读取、不回显。
1 | GET xqnetwork/get_wan6_switch_v2 -> enabled = 1 |
客户端 ipconfig /renew 后只剩链路本地地址,全局 IPv6 地址与 ::/0 默认路由撤销,IPv4、网关和校园认证连接不变。
| 指标 | 修复前 | 修复后 |
|---|---|---|
| 50 路并发成功 / 失败 | IPv4 50/0,IPv6 50/0 | 50/0,走 IPv6 的请求为 0 |
| 建连平均 | 41 ms / 220 ms | 39 ms |
| 建连最大 | 252 ms / 2504 ms | 243 ms |
| 本机 → 路由器 | 平均 1 ms | 50/50,平均 1 ms,最大 1 ms |
| 抖音主页(连续 10 次) | 0.10–0.28 s | |
| 抖音静态 CDN | 0.025–0.10 s | |
| 哔哩哔哩主页 | 0.07–0.11 s | |
| 图片 CDN | 0.03–0.08 s |
改动只有这一个开关。全局关闭意味着所有连这台路由器的设备一起改走 IPv4,它们手上的旧连接不会自动迁移,改完需要重开应用。
结论适用于这台 BE5000、1.0.91 固件、只下发 /64 的校园网。可复用的是判据和实验设计,不是”关 IPv6”这个动作。
六、用户侧修不了的部分
关掉 IPv6 后重测分方向吞吐:
| 方向 | 靶标 | 下载 |
|---|---|---|
| 电信 | 华为云镜像 | 302 Mbps |
| 移动 | 网易镜像 | 44 Mbps |
| 教育网 | USTC 镜像 | 4.5 Mbps |
223.5.5.5 平均 4 ms、20 包 0 丢包。同一时刻电信方向能跑 300 Mbps,说明不是总带宽、账号限速或终端性能,而是校园网到不同上游的分方向问题。
上一轮为排除用户侧做过一次 A/B:同一根墙线、同一个 10.12.x.x 内网地址、同一个 NAT 出口,分别在”经路由器”和”直连墙口”两种接法下测同一批目标 IP,结果一致甚至直连更差。
| 目标 | 经路由器 12:37 | 直连墙口 13:19 |
|---|---|---|
| 校园首跳 | 0% 丢包 / 2 ms | 0% 丢包 / 1 ms |
| 网易 / 移动 | 5% / 53 ms / 4 Mbps | 10% / 56 ms / 1 Mbps |
| 华为云 / 电信 | 7.5% / 28 ms / 9 Mbps | 1 Mbps |
其余排除项:MTU 1472 不分片可通,非路径 MTU 黑洞;下行 301 Mbps 满载时 RTT 从 29 升到 43 ms,非缓冲膨胀;用 ping -i 让对端分别看到 TTL 127/128/129,丢包率 4%/10%/4% 无规律,非针对 NAT 终端的策略。最有说服力的是路由器内置测速,测速源就是 WAN 口本身,不经 NAT 不经电脑,故障期间连测三次为 1.41 / 1.13 / 1.51 Mbps 下行。
这些整理进了一份报障文本。配套留了个常驻脚本,每 60 秒采一轮五个方向的时延、抖动、丢包和 WAN 实时流量,追加进 .diag\watch.csv。四天后它记录了移动方向从 45–47 ms / 10% 丢包恢复到 29 ms / 0%,同时教育网从 21 ms 劣化到 39 ms。有连续采样,方向性变化才可比较。
另有一条至今有效的分流优化,校内域名走校园 DNS、其余走公共 DNS,重启不丢:
1 | Add-DnsClientNrptRule -Namespace @("buct.edu.cn", ".buct.edu.cn") ` |
七、IPv4 与 IPv6 的取舍
| 项目 | IPv4 | IPv6 |
|---|---|---|
| 宿舍内工作方式 | BE5000 做 NAT,多设备共用一个内网地址 | 理想是路由器获 PD 前缀再分配,实际是同前缀中继 |
| 兼容性 | 最成熟 | 大部分支持,不是全部 |
| 延迟 | 取决于路径 | 协议本身不比 IPv4 慢,受中继实现与上游质量影响 |
| 对体验的影响 | — | 双栈应用优先试 IPv6,评论、头像、图片分属不同 CDN |
表格最后一行是本次问题的成因:主文档走 IPv4 很快,评论和图片走 IPv6 很慢,页面卡在后者上。
| 方案 | 收益 | 代价 | 适用条件 |
|---|---|---|---|
| 路由器全局关闭 IPv6(当前做法) | 长尾消失,全设备统一 | 纯 IPv6 校内资源不可达 | 不需要 IPv6 |
| 终端设 IPv4 优先、IPv6 后备 | 保留 IPv6 能力 | 手机等设备仍受中继影响,部分应用自选栈 | 需要 IPv6 |
| 向学校申请 DHCPv6-PD | 结构正确,保留完整 IPv6 | 取决于网络中心是否配置 | 长期解法 |
| 改 AP / 桥接模式 | 绕过中继与 NAT | 多设备各自认证、可能限终端数或绑 MAC、防火墙与设备隔离消失、内网结构变更 | 确认账号支持多终端 |
| 刷第三方固件或 NAT66 | 可精细控制 NDP Proxy | 变砖风险,且修不了上游路由质量 | 不推荐 |
顺序建议:先关闭;确实需要 IPv6 时退到终端优先级方案;同时向网络中心确认宿舍有线是否支持 DHCPv6 Prefix Delegation。不要把 pi_relay 留作长期默认路径。
八、排查清单
按顺序执行,前一层不干净则后面的测量无效:
- 网卡协商速率与错误、丢弃计数
- 电脑 → 网关连打 100 包,记录最大值而不是平均值
- 网关 → 校园或运营商首跳
- 分方向吞吐,至少电信、联通、移动、教育网各一个镜像靶标
- 多 resolver 的 DNS 计时
- 以上正常但仍有卡顿:40–50 路并发打同一目标,看建连最大值
curl -4与curl -6分开各压一轮
判据:
- 平均值正常、最大值离谱即为长尾,页面卡顿量级与最大值对应。
- 空闲 ping 不能排除转发层故障。
- IPv6 的 ICMP 不通是常态,用 TCP 建连判断。
- “绕过路由器更顺”与既有结论冲突时,先重排结论,不要补测。
以下动作在当时条件下都不必做:恢复出厂(根因是固件默认中继模式,重置后仍在)、改 DNS(DNS 正常,只会增加变量)、开 QoS 或限速(CPU 负载 0,排队不在路由器)、为 160 MHz 换信道(本机走网线,且宿舍频谱拥挤)、测出长尾前刷固件。
9 月 11 日同一套流程复用于一次新的变慢:网卡与网关正常,国内靶标 3–4 ms 且 0 丢包,1.1.1.1 平均 105 ms,Cloudflare 下载 6.7–19.1 Mbps,本机后台流量接近 0。国内全好、只有跨境差,判定为国际出口或跨境路由,未改动任何配置,定位耗时约 15 分钟。
遗留问题:关闭 IPv6 之后路由器网页后台提示管理密码错误,同一密码走 xqsystem/login 可正常取得会话令牌,说明密码未变,故障在登录页的 nonce 生成与提交链路,当时未查完。
九、小结
“直连更顺”这条主观描述是本次唯一有效的实验线索。它与既有结论冲突时,该怀疑的是既有结论:几天前写下的”与用户侧设备无关”作为报障结论成立,作为排查终点不成立。另一个可迁移的点是判据选择,测速工具报的是单条会话的平均值,页面加载取决于并发会话中最慢的那一条,所以要盯最大建连时间和并发失败率。
BE5000 的转发性能没有变化,教育网方向仍是 4.5 Mbps,报障文本尚未提交。变化是 2.5 秒长尾消失,以及下次变慢时有了一套明确的测量顺序。