鉴于某些地区家庭宽带 IPv4 和 IPv6 上下带宽并不对等,需要分开测速,Ookla 的测速服务器越来越少,支持双栈的服务器更少,官方的 Web 端 和 cli 端 没有 ipv6 only 和指定地域选项,默认会根据 IP 返回服务器列表,speedtest 域名本身就在国外,获取服务器列表接口不小心分流后就会出现无法返回中国服务器的情况,所以需要精确找出中国地区的服务器,并且支持 IPv6 。其实可以通过 修改系统 hosts 指定 IPv4/IPv6 地址,干预程序域名解析,这样就可以 定点 (指定服务器 ID ) 定栈 ( IPv4/IPv6 )进行测速了。
因为官方客户端闭源,通过阅读非官方客户端 https://github.com/sivel/speedtest-cli 可知,目前官方尚有 API 查询接口可用 https://www.speedtest.net/api/js/servers?engine=js&search=china 通过遍历中国地区服务器,使用 dig 命令找出有 AAAA 记录的服务器即可 (以下命令请确保 jq 程序已安装)
for host in $(curl -s https://www.speedtest.net/api/js/servers\?engine\=js\&search\=china | jq ".[].url" | awk -F'[:/]' '{print $4}'); do if r=$(dig +short AAAA $host @223.5.5.5 | head -n 1) && [[ -n "$r" ]]; then echo "$r" $host; fi; done
成果如下 (更新:2023/08/04):
# 成都电信 29071 China - China Telecom
240e:16:1001:150::3 speedtest1.sc.189.cn
# 重庆广电 5530 Chongqing - CCN
2401:7e00:fffe:22::6a speedtest1.cqccn.com
# 兰州电信 3973 Lanzhou - China Telecom
# 240e:2a:1:ff00::2 speed.bajianjun.com
# 上海联通 24447 Shanghai - China Unicom 5G
2408:8000:9000:20e6::5dd 5g.shunicomtest.com
# 北京联通 43752 Beijing - BJ Unicom
2408:8000:1010:10::254:31 beijing.unicomtest.com
# 北京移动 25828 Beijing - China Mobile Group Beijing Co.Ltd
2409:8087:0:45:600::9 speedtest.bmcc.com.cn
Linux/Mac:/etc/hosts
Windows:C:\Windows\system32\drivers\etc\hosts
追加上述内容,如果使用了 dnsmasq/smartdns 等自建 DNS 也可以加入相关规则进行全局干预。
打开 https://ipv6.speedtest.net Change Server 输入关键字切换切换服务器,按 F12 观察网络请求
优点:使用方便,所见即所得
缺点:浏览器开销太大,在低配软路由开虚拟机,跑一个 windows 再开一个浏览器,机器本身就快死了,测速偏低。
到 https://www.speedtest.net/apps/cli 根据系统下载官方 cli 客户端,使用 speedtest -s <服务器 ID> 进行定点测速(定栈已通过 hosts 文件干预),通过抓包分析,程序会通过 cli.speedtest.net 域名获取服务器列表并进行 ISP 定位,可根据实际情况加入分流名单,解决其使用境外服务器导致的 程序卡顿/报错,或者 ISP 定位不准的问题。
优点: 多平台官方客户端,程序占用资源小,可在裸机/容器中运行,性能优良,测速准确。
缺点: 闭源黑盒
非官方客户端高 stars 项目 sivel/speedtest-cli release 版本中依然使用了根据 IP 返回最近服务器列表,使用参数--server <服务器 ID> 有可能报会服务器不存在。在 pull request #784 "Add option --custom to perform test with custom servers" 有大佬加入了自定义补丁,但是没有被作者 merge 到主干分支中,并目前已经和主干冲突,但是实测可用,具体使用步骤:
wget "https://raw.githubusercontent.com/sivel/speedtest-cli/ca087bac99f94608f65d050f2401f08aea6d376f/speedtest.py" -O speedtest-cli
chmod 755 speedtest-cli
./speedtest-cli --custom "https://www.speedtest.net/api/js/servers?engine=js&search=china" --server <服务器 ID>
优点:开源、跨平台
缺点: python 脚本程序,包依赖复杂,程序占用资源小,但性能一般(估计测速时间过短,未到 QoS 上限窗口就结束了,有兴趣朋友可修改读数据的时长试试),测速偏低。
== Update 2023/08/13 ==
1、截止到现在,目前仅存活,可时刻保持关注服务器列表。
2、根据观察目前 IPv6 的限速测策略比较迷幻,100% 的人会想如果有接近1 Gbit/s 上行带宽 岂其不爽YY?但现实是似乎有白名单机制,不见得你到测速服务器的带宽 就是真实可用带宽,甚至 同城[同/跨]运营商、异地[同/跨]运营商 都能跑满,但是使用诸如改 hosts 的方法干扰程序百度网盘,移动网盘,上传速度依然 和 v4 一样,不知到是客户端还是服务器的问题。
3、根据观察 IPv6 的下行带宽似乎也存在 v4/v6 不对等的情况,具体测试方法相同。
4、目前观察到 v4+v6 的合计带宽会出现远远 大于签约带宽 的现象,例如:我 500M 的电信宽带,能跑出持续 1 分钟以上 1.2Gb/s 的峰值带宽(路由器出口观察到,排除浏览器缓存或者程序计数问题)。可以通过 https://speedtest.im
测速方式 1、2 (技术原理:使用并行文件下载的方式,薅了大厂 CDN 的羊毛。文件来源包括且不限于阿里,腾讯,百度等,因为会同时返回多个不通的 v4、v6 的服务器IP,所以能稳定复现这个现象。)
=== 2023/01/23 更新 ===
curl -s https://www.speedtest.net/api/js/servers\?engine=js\&search=china | jq -r '.[] | "\(.url) \(.id) \(.sponsor) \(.country) \(.name)"' | while read url id sponsor country name; do domain=$(echo $url | awk -F"[/:]" '{print $4}'); aaaa=$(dig +short AAAA $domain @180.184.1.1|head -n1); if [ ! -z "$aaaa" ]; then echo "$aaaa $domain #$id [$sponsor $country-$name]"; fi; done
输出效果,直接追加到 /etc/hosts 即可
2401:7e00:fffe:22::6a speedtest1.cqccn.com #5530 [CCN China-Chongqing]
240e:16:1001:150::3 speedtest1.sc.189.cn #29071 [China Telecom-China 成都]
2409:8062:3000:1001::2 speedtest1.sc.chinamobile.com #4575 [China Mobile-Group Sichuan China Chengdu]
2409:8087:0:45:600::7 speedtest.bmcc.com.cn #25858 [China Mobile-Group Beijing Co.Ltd China Beijing]
1
JensenQian 2023-08-13 04:20:08 +08:00 via Android
ipv6.stream
论坛大佬做的,有一堆大学的 ipv6 测速点 |
2
iijboom 2023-08-13 11:27:11 +08:00
我这里三网都是 v4 v6 一起限速地非常准确
|
3
yyzh 2023-08-13 13:58:05 +08:00 via Android
官方 api 返回的节点数量有限制的,目前还没找到能列出全部的方法
|
4
loukky 2023-08-13 17:49:34 +08:00
|
5
iijboom 2023-08-21 23:22:24 +08:00
“目前观察到 v4+v6 的合计带宽会出现远远 大于签约带宽 的现象”
我这里会牢牢限制死,一点都不多 |