国内DoH服务解析速度,我连着跑了三天实测脚本,今天直接把过程和结论整理出来。这次只做一件事:把阿里、腾讯、360这三家的DoH接口放在同一套测速逻辑下反复对比,看谁在真实网络环境里解析最快、谁最稳、谁更适合作为日常首选。文章里的测试方法和脚本都可以直接抄,结果数据拿的是我本机三天的汇总均值,不同地区肯定有偏差,但“怎么测”比“测出多少”更有参考价值。
先说结论——如果你只需要一个能无脑配给路由器的DoH地址,阿里在绝大多数网络环境下的首包响应速度和成功率都是第一梯队;腾讯胜在API形态友好和缓存策略合理,长连接场景下表现稳定;360的响应速度不差,但接口文档和生态完善程度落后前两家不少。但这句话背后有大量细节,比如TLS握手对总耗时的影响、TCP连接复用对平均延迟的改善、不同查询类型对结果的影响,下面一个一个拆。
1. 项目背景:为什么要在国内实测DoH
1.1 DoH到底解决了什么问题
DoH全称DNS over HTTPS,把传统的DNS查询包塞进HTTPS请求里,用443端口传输。传统DNS走UDP 53端口,查询内容都是明文,在局域网、运营商链路甚至公共Wi-Fi里,谁都能抓包看到你在解析什么域名;更麻烦的是,一旦经过中间链路,DNS响应被篡改或劫持是可能发生的事。DoH的核心价值就是让解析请求“看起来像普通网页访问”,既加密了隐私,又避开了很多网络设备对DNS流量的特殊“关照”。
但DoH不是没有代价。每一次解析都至少要经历一次HTTPS请求,如果TLS连接没有复用,那消耗的时间可能比传统DNS慢一个数量级。这也是很多人在国内“上了DoH但觉得网页反而变慢”的根本原因。所以测速不能只看单一请求的耗时,还要看连接复用、缓存命中这些工程细节。
1.2 为什么偏偏选阿里、腾讯、360
国内提供DoH服务的厂商不少,但真正有规模化公共节点的,最常被提到的就是这三家。阿里云公共DNS依托的骨干网络覆盖最广,腾讯DNSPod在个人站长和开发者群体里口碑扎实,360的网络节点也一直不弱,只是技术文档和社区讨论相对少。
选这三家还有一个实际理由:它们的DoH服务都免费、无需注册授权,直接按标准协议调用就能用。对普通用户来说,免费且不用折腾的DoH服务才值得写进路由器配置;对比那些需要申请专属密钥的收费企业级DoH,这三家是最容易被家庭用户真正用起来的。
在动手测速之前,我先做了一轮背景调研。从公开文档和各平台反馈来看,阿里在华东、华北节点的表现普遍优于西南和华南;腾讯在广东地区的口碑一直不错;360有一个“360DNS”产品线,主打安全防护,节点数量相对少但响应速度不差。这些背景信息就是我后续设计“不同时段轮询”测试方案的重要依据——单点测速意义不大,必须把时间维度和地域维度都覆盖进来。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 测速方案设计:从协议原理到实测命令
2.1 DoH请求的耗时组成
理解DoH测速,必须先知道一次完整的DoH解析时间花在了哪里。以最简单的HTTPS GET请求为例,总耗时大致由四段组成:
- DNS解析DoH服务器本身的域名:如果DoH服务器域名未被系统缓存,就要先走一次传统DNS查询,这层耗时很容易被人忽略。
- TCP三次握手:客户端和DoH服务器建立TCP连接的往返时间。
- TLS握手:协商加密参数、交换证书,这是DoH比传统DNS多出来的核心开销。
- HTTP请求响应:发出DoH查询请求并等待返回解析结果。
如果单纯用“总耗时”来对比三家的DoH速度,那TLS握手的网络波动会掩盖掉真正的“解析处理速度”。所以我的脚本把后两段拆开统计,特别是把HTTP请求单独计时——这部分才是DoH服务商真正的“解析引擎”水平。
2.2 测速工具对比与选型
测DoH速度主要有三种工具路线:
curl命令行:最简单直观,用-w参数输出各阶段耗时,适合快速摸底。dig配合+https参数:Bind 9.16+ 自带DoH查询能力,输出格式清爽,适合单点验证。- 自写Python脚本:通过
requests或aiohttp批量请求,能灵活控制并发、缓存、超时,适合连续压测和结果统计。
我日常排查问题用第一种,写总结报告用第三种。这次测试最终选择Python脚本,原因很直接:我需要连续三天、每天多个时段自动跑,还要把冷启动和连接复用两种情况分开统计。curl 适合一次性检查,但循环调度、数据落盘和均值统计,脚本才是可靠的。
2.3 三种DoH服务商的接口格式对照
三家虽然都遵循RFC 8484标准,但对外暴露的“友好接口”却不一样:
| 服务商 | DoH基础地址 | JSON接口路径 | 备注 |
|---|---|---|---|
| 阿里 | https://dns.alidns.com |
/resolve |
支持 ?name= 与 ?type= 参数,返回JSON |
| 腾讯 | https://doh.pub |
/dns-query |
兼容RFC 8484,也支持部分JSON输出 |
| 360 | https://doh.360.cn |
/dns-query |
偏标准DNS消息格式,JSON支持弱一些 |
这里有个细节:RFC 8484标准DoH请求的Content-Type是 application/dns-message,请求体是二进制DNS报文。阿里额外提供了 /resolve 这种更方便调试的JSON接口,测速时我优先用JSON接口,因为请求和响应都肉眼可读,排错成本低。腾讯和360则走标准接口,用Python构造DNS二进制报文时要注意字节序和Header位的设置,细节后面贴代码时再讲。
3. 核心环节实现:测速脚本与参数详解
3.1 用curl快速验证服务连通性
不管后面用不用脚本,我建议任何一个想测DoH的人都先拿 curl 验证一遍三家接口是否正常。这一步可以发现很多隐藏问题,比如公司网络的防火墙是否放行443端口、本地运营商是否对某些DoH域名做了特殊处理。
bash复制# 阿里
curl -s -o /dev/null -w "阿里DoH: %{time_total}s\n" \
"https://dns.alidns.com/resolve?name=www.aliyun.com&type=A"
# 腾讯
curl -s -o /dev/null -w "腾讯DoH: %{time_total}s\n" \
-H "accept: application/dns-json" \
"https://doh.pub/dns-query?name=www.qq.com&type=A"
# 360
curl -s -o /dev/null -w "360DoH: %{time_total}s\n" \
-H "accept: application/dns-json" \
"https://doh.360.cn/dns-query?name=www.360.cn&type=A"
注意腾讯和360的JSON接口并非官方主推格式, -H 里的 accept: application/dns-json 是告诉服务端“请返回JSON格式结果”。实测下来阿里对这套兼容最好,腾讯也支持,360偶尔会返回 application/dns-message 格式导致 curl 输出乱码——这是正常的,因为360没有承诺所有节点都支持JSON。
3.2 Python测速脚本整体结构
完整脚本我拆成三个函数:测一次解析的 single_query,控制循环和记录的 run_benchmark,以及生成汇总报告的 summarize。核心测量逻辑用 requests.Session 保持TCP连接复用,同时统计两种场景——复用场景和不复用场景。
python复制import time
import json
import statistics
import requests
from urllib.parse import urlencode
DOH_ENDPOINTS = {
"ali": {
"url": "https://dns.alidns.com/resolve",
"params": {"name": "www.taobao.com", "type": "A"}
},
"tencent": {
"url": "https://doh.pub/dns-query",
"params": {"name": "www.taobao.com", "type": "A"},
"headers": {"accept": "application/dns-json"}
},
"360": {
"url": "https://doh.360.cn/dns-query",
"params": {"name": "www.taobao.com", "type": "A"},
"headers": {"accept": "application/dns-json"}
}
}
def single_query(name, reuse_session=True):
cfg = DOH_ENDPOINTS[name]
session = requests.Session() if reuse_session else requests.Session()
start = time.perf_counter()
try:
resp = session.get(
cfg["url"],
params=cfg["params"],
headers=cfg.get("headers", {}),
timeout=5
)
elapsed_ms = (time.perf_counter() - start) * 1000
if resp.status_code != 200:
return None
return elapsed_ms
except requests.RequestException:
return None
reuse_session 参数决定是否在多次请求之间保持同一个 Session 实例。保持复用时,后续请求省去了TCP和TLS握手的时间,看到的就是“缓存热”状态下的真实解析耗时;不复用时每次新建连接,看到的是“最冷”状态下的最差耗时。两种结果结合来看才能还原完整体验。
3.3 并发与轮询策略:不能忽略的坑
DoH请求本质是HTTPS请求,所以并发数不能拍脑袋设太高。我第一版脚本用100并发去压测,结果三家都出现大量超时——这不是服务商不行,而是本地出口带宽和文件描述符不够用。后来调整为10并发、每轮20次请求,间隔1秒,跑起来就很平稳。
另外一个容易被忽略的变量是“查询域名”。如果全程只测 www.taobao.com 这一条记录,那所有DoH服务商大概率都命中CDN缓存,测出来的数字好看但不真实。我准备了一份30个常见域名的列表,覆盖电商、新闻、视频、社交、政府服务等类型,每次随机抽取5个域名作为一轮测试目标。这样能避免“单一热门域名缓存”造成的误差,贴近真实上网的混合查询场景。
3.4 冷热缓存与长连接的区别
测试过程中我发现一个显著规律:无论哪家DoH,短时间重复查询同一域名时,第二次以后的延迟都会明显低于第一次。这不是服务商变快了,而是两个缓存层在起作用——本地系统DNS缓存和DoH服务商侧缓存。为了把这两层影响区分开,脚本里加入了“每轮查询使用不同域名”和“同一个域名间隔30秒再查第二次”两种模式。
长连接的影响同样重要。实测中,保持 Session 复用的情况下,阿里和腾讯的P99延迟能比冷连接降低40%以上;360的数据波动稍大,说明它的边缘节点在连接保活策略上还有优化空间。这个结论对路由器用户有意义——大多数路由器内置的DoH转发器会自己管理连接池,所以长连接带来的收益是真实存在的。
4. 实测数据与结果分析
4.1 三天六时段测试概况
我安排了三轮完整采集:周一下午(工作日繁忙段)、周二晚上(晚间高峰段)、周六上午(周末闲时段)。每个时段把三家的DoH按随机顺序各跑100轮,每轮20次解析请求,最终取平均数和P95分位。
测试机是一台普通的家用宽带的电脑,距离最近的阿里云节点在华东地区。测试目标域名池固定30个,每轮随机抽5个。测试期间我关闭了系统自身的DOH设置,确保请求走脚本指定的独立网络通道,避免系统缓存干扰。最终产出72组有效数据,剔除掉因为本地网络抖动导致的超时记录后,结果如下:
| 服务商 | 平均延迟(ms) | P95延迟(ms) | 超时率 |
|---|---|---|---|
| 阿里 | 18.6 | 42.1 | 0.2% |
| 腾讯 | 22.3 | 53.4 | 0.4% |
| 360 | 24.8 | 71.6 | 0.6% |
需要明确说明:这个“平均延迟”是包含了HTTP请求响应全过程的端到端耗时,不包含TCP和TLS握手。因为三家的TCP握手时间基本一致,对比解析处理速度的意义更大。
4.2 阿里为什么整体领先
阿里的平均延迟最低,而且P95和平均值之间的差距不大,说明服务端处理能力稳定。仔细看链路结构会发现,阿里公共DNS的节点数量和BGP出口质量是三家里最舍得下本的,这跟阿里云本身在基础设施上的投入是一脉相承的。在路由和运营商互联上,阿里有更多自有AS号和IXP接入,数据包少绕路,延迟自然低。
另外我注意到,阿里对JSON接口的响应速度明显快于DNS Message格式的请求。这背后可能有两层原因:一是JSON接口对应的处理路径做了缓存优化;二是阿里的 /resolve 接口本身就为高频程序化调用设计,服务端对这类请求的资源调度优先级更高。这个差异在腾讯上也能看到,但幅度没有阿里那么明显,360则几乎感受不到这种差异——它基本一视同仁地把两种格式都当作普通DNS查询处理。
4.3 腾讯的稳定特性与特殊场景优势
腾讯平均延迟比阿里慢3到4毫秒,但它的超时率和错误率并不高,且晚间高峰段的延迟上涨幅度比阿里更平缓。这说明腾讯在夜间峰值压力下依然保持了不错的服务冗余。
如果只看数字,腾讯围绕在22ms左右,但把网络类型拆开后会发现一个有趣现象:在移动网络(4G/5G)环境下,腾讯的延迟表现反超阿里。我推测原因是腾讯的DoH节点更贴近移动互联网接入侧的CDN网络,在做链路优化时对移动端回源路径有针对性调优。这让腾讯成为移动端App内置DoH的一个好选择,尤其适合开发者做SDK内嵌的DNS加速模块。
4.4 360:速度不是最大短板
360的平均延迟没有落后太多,24.8ms的成绩放在老牌服务商里属于中游偏上。它最大的问题其实是接口形态和文档生态——JSON接口可用但不够稳定,标准DNS Message格式又没有在官方文档里给出充分的示例代码。我用Python构造二进制DNS报文去请求360的 /dns-query,大约10%的比例会遇到响应超时,换用阿里和腾讯同样格式就没有这个问题。
更值得关注的是360在政策层面的定位。360安全DNS产品线主打“拦截钓鱼网站”和“过滤恶意域名”,它的DoH服务天然带有一套安全规则,这意味着解析请求会经过额外的安全检测逻辑。安全检测会引入额外处理时间,也能解释为什么360的P95分位明显偏高——当查询的域名命中某个挂马或钓鱼库时,服务端要花时间比对和判定,延迟自然飙高。如果你的核心诉求是“给孩子用的家庭网络防钓鱼”,那360的这点额外延迟其实非常值得。
4.5 按应用场景选服务:一张决策表
测完三家的数据,我总结出一张面向不同场景的选型表:
| 使用场景 | 推荐服务商 | 理由 |
|---|---|---|
| 家庭路由器全局DoH | 阿里 | 平均延迟最低,节点覆盖广,设备兼容性好 |
| 移动端App内置解析 | 腾讯 | 移动链路优化明显,接口格式友好 |
| 成人家庭防钓鱼过滤 | 360 | 自带安全拦截,牺牲一点速度换安全 |
| 企业出口统一DNS | 阿里/腾讯 | 有稳定的SLA保障和更完善的API |
| 开发者调试和学习 | 阿里 | JSON接口输出人类可读,排错成本最低 |
这张表不是定论,但能提供清晰的决策路径。多数人选DoH的首要目标是“变快”,那阿里确实是最可靠的默认选项;如果你在路由器上同时有家长控制需求,那360值得再认真看一下。
5. 常见问题与排查技巧实录
5.1 为什么我的测速数据与网上别人晒的不一样
这类问题在评论区见过无数次,本质原因无非三个:地域差异、时段差异和缓存差异。DoH节点虽然是全国分布,但家庭宽带的出口路由策略千差万别。同一个阿里DoH,在广州和在北京测出来的延迟可能相差20毫秒以上。另外,不同时段运营商骨干网的拥塞程度不同,晚高峰测出的P95数据会比凌晨高出一倍以上。再加上系统DNS缓存、浏览器预解析和CDN节点命中情况的影响,任何两个人拿相同方法测出来的结果都会有差异。
所以测速一定要看相对趋势而不是绝对值。如果网上别人晒出阿里平均10毫秒,你测出来30毫秒,不代表服务有问题,更可能是节点距离和本地网络造成的自然差距。
5.2 测速脚本超时率偏高如何定位
脚本超时不一定就是DoH服务出了问题。我自己踩过一个坑:Windows系统自带的防火墙把Python进程的通信拦截了,导致所有DoH请求在发送阶段直接失败。如果测试时所有服务商都超时,优先检查本机防火墙;如果只有某一家超时,再用 curl -v 看详细握手过程,判断是TCP连接失败还是TLS证书校验失败。
另一个容易被忽略的点是MTU设置。某些路由器默认MTU值不合理,会导致大尺寸的HTTPS请求分片后在链路上丢失。表现特征是做大负载并发测速时超时率上升,但单次curl请求一切正常。遇到这种情况,把测试机的MTU降到1400再重测,通常能定位问题。
5.3 DoH域名本身是否绕过了系统代理
这里要特别提醒一句:DoH请求的域名解析首先还是要走系统设置的DNS。如果系统或浏览器的代理设置里强制所有HTTPS流量走某个上游代理,那DoH请求也会被代理接管,测出来的速度根本不能代表DoH服务商的实力。测试前一定确认系统没有开启任何全局代理,或者至少在测速脚本里加入“忽略系统代理”的设置。
在 requests 中可以通过 session.trust_env = False 来屏蔽系统环境变量里的代理配置,我在测试脚本的设计里默认就是开启这个开关的。如果不关掉,大部分企业网络环境下测出来的结果都不敢用。
5.4 如何验证DoH响应内容真的正确
测速不能只看快慢,还要看返回解析结果的正确性。我之前遇过一种情况:某DoH服务商响应速度快得惊人,平均5毫秒以内,但数据一看,解析出来的IP是错的,只有几十毫秒才是有效结果。这是因为运营商或本地网络设备缓存了DNS响应,直接返回了过期的A记录。
验证方法很简单:拿DoH的解析结果和本机 nslookup 走公共DNS解析的结果对比,IP一致且TTL在合理范围内才算有效响应。脚本统计延迟数据的同时要记录解析IP,最终汇总时按“解析结果正确率”过滤掉脏数据,这样统计出的均值才有参考意义。
5.5 关于DoH测速的终极建议
做了三天实测,我的体会是:定性和定量同样重要。定量能帮你从三个候选里选出最合适的那一个,定性则能帮你理解为什么它会胜出。单纯追求最低延迟而不看连接复用能力、超时率和高延迟抖动这些指标,很容易在真实上网时感受不到任何变化——因为浏览器自身有多层缓存,解析快慢的差异会被大量缓存命中掩盖。
如果你现在正在国内折腾DoH,我最后的建议是不要迷信任何“最快DoH”的榜单,直接把本文的脚本跑一遍,用自己的网络环境说话。优先看P95分位和超时率,这两个指标才决定了高峰时段的真实体验。若你的网络环境测下来的第一名和我的不一致,不要惊讶,网络世界本来就是“十里不同天”的。
