惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
博客园 - 叶小钗
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
Last Week in AI
Last Week in AI
罗磊的独立博客
量子位
Jina AI
Jina AI
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
美团技术团队
雷峰网
雷峰网
爱范儿
爱范儿
S
SegmentFault 最新的问题
小众软件
小众软件
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

V2EX

我用 AI 写代码,但终端管理反而成了累赘——于是我做了 codux [调研] 各位在公司都用什么 ide 和 agent 写代码? 老运维 share 一个运维平台 看到有公司考核 token 指标,很好奇大家上个月的 AI 账单是多少 GLM-Coding 调用持续报错: z.ai 的 Lite 套餐几乎无法使用,官方 Pro/Max 是否稳定? 现在还有什么渠道可以稳定安全地使用 Claude 吗? 上海漕河泾内推,本组有 2 个 hc,一个后端,一个前端,预算都是 20k 左右,不打卡,氛围好 如果 V2EX 上有一组不永久保存聊天记录(比如只保存 7 天或者 24 小时)的聊天室,那么会开启哪些有用或者有趣的可能? gemini cli 貌似挂了,一直返回 403 第一次在自媒体上赚到钱 收集了最近在使用的低价 GPT, Gemini,邮箱等 AI 会员的小店合集 讨论个大实话:现在企业还在说 AI 编程提效 20%, 30%的,真的太落后,没用懂 AI。因为包括很多前沿公司,已经狂奔到提效 200%-500%的情况 [招聘][远程][币安] 前端/后端/QA/iOS/Android 至少 3 年以上经验 目前有大量 HC 欢迎投递 Chatgpt Pro 用量用不完的可以开这些设置 面试的时候好像遇到钓鱼了,给各位避个坑 cursor 年续费 22 号到期, 自动续费是否还是老的计次套餐呢 被两件破事毁掉的一下午,琐碎的内耗消磨人的精力 使用 Planet 存储 Codex 的会话或者重要信息 如果业务部门领导不要你开发功能,而是要求你教会它用 claude code 开发功能,你会怎么做? 分享一个 MacOS 接绿联 CM818 USB 转 DP 转接器使用感受 我的 HR 朋友 10 年老 Java ,非全大专,大家帮忙看看简历 开源了一个 AI 口语练习工具,音素级发音评分,完全免费可自部署 V2EX 上有哪些你觉得很有趣、印象深刻的妹纸? 字节为啥不出个国内版 Vercel? 有在大马的朋友吗? 问个运营商问题 你们在有领导的公司大群发过的最大胆的消息是什么 公司裁员,目前没有工作。想试试摆摊,做一个移动鲜啤打酒车 我的硬盘 Memblaze Pblaze 5 Linux 下不识别,给 Linux 内核提交了补丁, AI 说有望被合并 只有我一个人觉得 codex 不好用?
逆向了联通官方测速系统的前端代码,发现四重作弊机制,难怪...
windmano · 2026-03-27 · via V2EX

各位 V 友好,最近闲着没事逆向了某省联通的官方宽带测速平台(就是装维上门给你"测速达标"签字那个),结果越看越上头。

分享一下发现,代码层面的东西,没有主观臆测。

TL;DR

联通测速系统的算法里埋了四个机制,叠加效果就是:不管你实际网速多少,测出来几乎必定"达标"。

0x01 先说合理的部分

公平起见,算法里有几个设计是业界通用的,没毛病:

  • 多线程并发( 6 个连接同时下载)—— Speedtest 也这么干,单连接跑不满高带宽
  • 预热丢弃(前 2 秒数据不算)—— TCP 慢启动,合理
  • 累计平均(总量÷总时间)—— 比瞬时采样更稳定

这些没问题。问题在后面。

0x02 校正因子:所有结果 ×1.04

speed = downloadVal / elapsed * 1000 * 1.04   // 下载
speed = uploadedSize / elapsed * 1.048         // 上传

计算完实际速度后,下载乘 1.04 ,上传乘 1.048 。

官方可能会说"补偿 TCP/IP 协议开销"。但 TCP header 20 bytes + IP header 20 bytes ,在 MTU 1500 的帧里占比约 2.7%。HTTP header 在持续流式传输大文件时占比可忽略。

4~5% 的"校正"显然超出了协议开销的范畴。 而且方向只往上调,从不往下。

0x03 数据修剪:只砍低的,高的全留

测速过程中每 200ms 采样一次,20 秒下来大约 90 条有效记录。然后:

records.sort((a, b) => a - b);
records = records.slice(5 * minLostDataTime);  // minLostDataTime=3, 砍掉最低 15 条
// 最高的呢?不动。

任何一本统计学教材都会告诉你,处理异常值要双边修剪或者用中位数。只砍低不砍高,这不叫数据清洗,这叫 cherry-picking 。

0x04 高位平均替换:波动大?用峰值覆盖

这段逻辑比较阴间:

topAvg = 取最高 10 条记录的平均值
totalAvg = 全部记录的平均值

if (totalAvg < topAvg * 0.96) {
    // "平均值不够高" → 全部替换为峰值附近的随机数
    records.forEach((val, i) => {
        records[i] = topAvg * random(0.99, 1.0);
    });
}

意思是:如果你的网速有波动(平均值低于峰值的 96%),那实际测量数据全部丢弃,替换为 峰值 × random(0.99, 1.0)

现实中的网络环境哪有不波动的?所以这段代码大概率每次都会触发。效果就是:最终上报的数据全是接近峰值的假数据

0x05 WiFi 补偿:没跑到?帮你补上

这是最炸裂的一段。

服务端下发了这么几个参数:

参数 含义
wifiLossRate 0.6 最多补偿签约带宽的 60%
wifiMaxLossValue 600 单次最多加 600 Mb/s
standardValue 0.9 低于签约 90% 就触发
if (measured < bandwidth * 0.9 && measured > bandwidth * 0.1) {
    gap = ceil((bandwidth * 0.9 - measured) / bandwidth * 100);
    compensation = min(gap / 100, 0.6) * bandwidth;
    compensation = min(compensation, 600);
    speed += compensation * 1000 * 125;  // 直接加到速度上
}

来,算一笔账:

签约 2000M ,实测 1200 Mb/s

gap = ⌈(1800 - 1200) / 2000 × 100⌉ = 30

compensation = min(0.3, 0.6) × 2000 = 600 Mb/s

上报 = 1200 + 600 = 1800 Mb/s → 达标

实际呢?只有 1200 。

注意,补偿参数是服务端控制的,也就是说运营商可以随时调整这个"作弊力度"。想让达标率高一点?把 wifiLossRate 调大就行了。

0x06 四重 buff 叠满

层级 机制 效果
Layer 1 ×1.04 校正因子 基础膨胀 4%
Layer 2 只删低值 拉高均值
Layer 3 峰值替换 消灭波动,锁定高位
Layer 4 WiFi 补偿 +600M 兜底,不达标也给你补到达标

这四层从下到上,覆盖了从"轻微美化"到"明目张胆造假"的完整光谱。你的宽带在这套系统面前,想不达标都难。

0x07 一些额外发现

  • 测速参数全部由服务端动态下发,运营商可以远程调整"作弊力度",前端只是执行
  • 前端 JS 做了混淆,变量名全是 _0x585b('0x2c') 这种,但混淆程度不高,字符串表基本明文
  • 认证机制是 MD5("speedInternal-" + secret + timestamp) 然后 Base64 ,写死的密钥

0x08 我的验证

用 Python 复现了完整测速流程,保留合理部分(多线程、预热),去掉四个作弊机制。

同一条 2000M 宽带:

官方系统 去掉修正
下行 "达标" ~1400 Mb/s
上行 "达标" ~365 Mb/s

1400/2000 = 70%,实际并不达标。但在官方系统里,WiFi 补偿一加,峰值一替换,妥妥的"达标"。

最后

我不反对运营商考虑 WiFi 衰减的因素。但正确的做法是在报告里注明"有线/无线"测试环境和修正说明,而不是在算法里偷偷加数据,给用户一份失真的报告,然后让装维拿着这份报告让你签"速率达标确认单"。

校正因子可以商榷,但 WiFi 补偿和峰值替换就是纯粹的造假,没有任何技术合理性。

用户买的是带宽,不是一份永远达标的测速报告。


以上分析基于前端 JS 逆向,所有结论可从源码直接验证。代码已脱敏,有兴趣的同学可以自己抓包看看。

技术讨论欢迎,键政免入。