V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
onion83
V2EX  ›  宽带症候群

使用 Speedtest 服务器定点定栈测试 IPv6 带宽

  •  
  •   onion83 · 258 天前 · 2073 次点击
    这是一个创建于 258 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景和动机

    鉴于某些地区家庭宽带 IPv4 和 IPv6 上下带宽并不对等,需要分开测速,Ookla 的测速服务器越来越少,支持双栈的服务器更少,官方的 Web 端 和 cli 端 没有 ipv6 only 和指定地域选项,默认会根据 IP 返回服务器列表,speedtest 域名本身就在国外,获取服务器列表接口不小心分流后就会出现无法返回中国服务器的情况,所以需要精确找出中国地区的服务器,并且支持 IPv6 。其实可以通过 修改系统 hosts 指定 IPv4/IPv6 地址,干预程序域名解析,这样就可以 定点 (指定服务器 ID ) 定栈 ( IPv4/IPv6 )进行测速了。

    相同网络下 v4/v6 上传速度比较

    前期准备

    因为官方客户端闭源,通过阅读非官方客户端 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
    

    修改 hosts 文件

    Linux/Mac:/etc/hosts
    Windows:C:\Windows\system32\drivers\etc\hosts

    追加上述内容,如果使用了 dnsmasq/smartdns 等自建 DNS 也可以加入相关规则进行全局干预。

    测速方式 1:使用官方网站测速

    打开 https://ipv6.speedtest.net Change Server 输入关键字切换切换服务器,按 F12 观察网络请求

    优点:使用方便,所见即所得
    缺点:浏览器开销太大,在低配软路由开虚拟机,跑一个 windows 再开一个浏览器,机器本身就快死了,测速偏低

    测速方式 2:使用官方 cli 客户端测速

    https://www.speedtest.net/apps/cli 根据系统下载官方 cli 客户端,使用 speedtest -s <服务器 ID> 进行定点测速(定栈已通过 hosts 文件干预),通过抓包分析,程序会通过 cli.speedtest.net 域名获取服务器列表并进行 ISP 定位,可根据实际情况加入分流名单,解决其使用境外服务器导致的 程序卡顿/报错,或者 ISP 定位不准的问题。

    优点: 多平台官方客户端,程序占用资源小,可在裸机/容器中运行,性能优良,测速准确
    缺点: 闭源黑盒

    测速方式 3:使用非官方 cli 客户端测速

    非官方客户端高 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 上限窗口就结束了,有兴趣朋友可修改读数据的时长试试),测速偏低

    还原与恢复

    1. 取消 hosts 文件自定义部分,还原 DNS 配置即可,无任何副作用。
    2. IPv4 定点定栈测速原理类似,也是通过 hosts 文件 DNS 干预程序服务器选择
    3. 已知问题:可能测速服务器 IPv6 地址会变,测速前最好确认以下 AAAA 记录是否有变,具体做法 dig aaaa +short <服务器地址> 或者 host -t aaaa <服务器地址>
    4. 已知问题:测速服务器可能会随时关闭,服务器可能会针对异地 IP 针对性限速或者限制访问。
    第 1 条附言  ·  258 天前

    == Update 2023/08/13 ==

    1、截止到现在,目前仅存活,可时刻保持关注服务器列表。

    1. 上海联通 24447 ✅
    2. 重庆广电 5530 ❌(异地不通,或者本身就不通)

    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,所以能稳定复现这个现象。)

    第 2 条附言  ·  95 天前

    === 2023/01/23 更新 ===

    • 获取服务器 AAAA 记录命令更新,支持显示服务器 ID 和归属地
    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]
    
    5 条回复    2023-08-21 23:22:24 +08:00
    JensenQian
        1
    JensenQian  
       258 天前 via Android
    ipv6.stream
    论坛大佬做的,有一堆大学的 ipv6 测速点
    iijboom
        2
    iijboom  
       258 天前
    我这里三网都是 v4 v6 一起限速地非常准确
    yyzh
        3
    yyzh  
       258 天前 via Android
    官方 api 返回的节点数量有限制的,目前还没找到能列出全部的方法
    iijboom
        5
    iijboom  
       250 天前
    “目前观察到 v4+v6 的合计带宽会出现远远 大于签约带宽 的现象”
    我这里会牢牢限制死,一点都不多
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1021 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:40 · PVG 02:40 · LAX 11:40 · JFK 14:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.