什么是 CDN 命中节点
CDN(内容分发网络)在世界各地的机房里放着网站内容的副本。你访问一个接入了 CDN 的网站时, 请求不会一路跑到网站的源服务器,而是先落到 CDN 的某一个边缘机房(PoP),由它就地把缓存的内容发给你。 这个机房就是你的命中节点,CDN 通常用就近机场的 IATA 三字码给它命名:HKG 是香港,NRT 是东京成田,LAX 是洛杉矶,FRA 是法兰克福。
各家 CDN 把你分到哪个节点,靠的是两种办法。任播(Anycast):同一个 IP 同时在所有机房宣告, 由互联网路由决定你落到哪一个——Cloudflare 与 Google Cloud 全球负载均衡是这一类,结果主要取决于你的出口在哪、运营商怎么接。 DNS 调度:解析域名时按「替你查询的那台 DNS」的位置返回不同机房的地址——CloudFront、Akamai 等多数 CDN 主要靠它, 于是 DNS 用的是哪一家、在哪里,会直接改变你命中的节点。同一个人访问不同 CDN,节点差出一个大洲并不罕见。
这次检测做了什么
- 对清单里的每一家 CDN,向它公开的测试文件发一次跨域请求(不带 Cookie、不带来源页),读出写着节点信息的那个响应头;Cloudflare 读的是 /cdn-cgi/trace 正文里的 colo,Google Cloud 读的是返回的区域名。
- 连接建好之后再请求一次,这一次的耗时才记作延迟——第一次里含着 DNS 解析、TCP 与 TLS 握手,不代表日常访问的速度。
- 跨域请求被对方拒绝时,换成只测延迟的不透明请求再试一次,区分「连得上但不让读」与「根本连不上」。
- 把节点代码换成城市;再向 Cloudflare 的 speed.cloudflare.com/meta 取它按你的出口 IP 估计的坐标与国家,算出你与每个节点之间的距离,按下文「怎么读」里的规则分档。
全程 6 路并发,每次请求最长等 6 秒;一家 CDN 最多是「读节点、读正文、再测一次延迟」三段首尾相接,约 16 秒封顶。19 家通常十几秒内全部出结果。所有请求都从你的浏览器直接发出,本站服务器不参与、也收不到任何结果。
怎么读检测结果
- 就近接入 / 区域内 / 跨区接入:读到了节点,并且判断得了远近,分档与 Cloudflare 节点检测完全相同。距离在 1000 公里以内,或节点在你出口的周边(如中国大陆访客命中香港、台北、东京、大阪、首尔、新加坡),或与出口同在一个国家/地区且不超过 3000 公里,算就近接入;其余 3000 公里以内的,或与出口同在一个国家/地区的(美国、俄罗斯、巴西这样的大国境内跨几千公里也算),算区域内;剩下的是跨区接入。多数 CDN 都就近接入是理想状态;一两家落在区域内很常见;好几家同时跨区接入,说明你的出口或 DNS 在 CDN 眼里不在你身边。
- 已识别 / 已读取:读到了节点,但判断不了远近,标签是中性的灰色,不代表好坏。已识别是认出了城市或国家,却算不出距离(没拿到你的位置,或这家只给了国家),也不在你的国家/地区或周边——同国或周边的节点即使没有距离,也直接算就近接入。已读取是只拿到了节点编号或节点 IP。读不懂的格式会原样显示,不会被猜成某个城市。
- 可达 · 节点信息未开放:请求成功,但这家 CDN 没有把节点头开放给其他网站读,只能给出延迟。
- 可达,但不允许跨域读取:对方压根不接受跨域读取,换成不透明请求才测到延迟。
- 不可达:超时或连接失败。可能是你的网络到这家 CDN 不通,也可能是测试文件本身下线了;只有一家不可达不必在意。
为什么有的 CDN 只显示延迟
这是浏览器的安全规则决定的,不是检测失败。网页向别的网站发请求,脚本默认只能读到少数几个「安全」的响应头(内容类型、长度、缓存策略之类); CDN 用来标明节点的 x-served-by、x-amz-cf-pop、via 都不在其中, 必须由对方在 Access-Control-Expose-Headers 里点名开放,其他网站才读得到。 jsDelivr 这类面向开发者的公共 CDN 会全部开放,不少测试文件则没有。对于没有开放的几家,本页如实只给延迟,不会编一个节点出来; 想看它们的节点,只能在浏览器开发者工具的「网络」面板里直接查看这些请求的响应头。
Cloudflare 一行只给出命中的机房。它的不同网络(免费版、企业版、中国网络、1.1.1.1)会把同一个人调度到不同节点, 完整的对比、出口 IP、HTTP/3 与 WARP 状态见 Cloudflare 节点检测; 节点普遍偏远、怀疑是 DNS 的问题,可以去 DNS 泄露检测看看替你解析的是谁。
常见问题
- 为什么有几家 CDN 只显示延迟,没有显示节点?
- 浏览器的跨域规则规定:网页向别的网站发请求时,只能读到对方明确开放的响应头。CDN 把节点代码写在 x-served-by、x-amz-cf-pop、via 这类自定义头里,只有对方在 Access-Control-Expose-Headers 里列出它们,其他网站的脚本才读得到。没有开放的那几家,本页只能确认「连得上、要多久」,读不到节点——这不是你的网络有问题,换任何一个网页版检测工具都一样。
- 命中的节点离我很远,是哪里出了问题?
- 最常见的原因有三个。一是出口 IP 的归属与你的实际位置不符:用了代理或 VPN,或者 IP 库把这段地址标到了别处,CDN 只认出口。二是 DNS 调度:CloudFront、Akamai 等多数 CDN 按「替你解析域名的那台 DNS」所在的位置分配节点,DNS 用的是境外公共解析或者走了代理,节点就会跟着 DNS 跑。三是运营商互联:中国大陆访问境外 CDN 时,运营商与 CDN 之间缺少好的互联,常被调度到美国西海岸。可以先用 DNS 泄露检测看看替你解析的是谁。
- 同一家 CDN 每次检测的节点都不一样,正常吗?
- 正常。CDN 会按各机房的负载与链路质量随时调整调度,任播网络的路由也会变化,DNS 调度的结果还受缓存时间影响。在相邻城市之间来回跳(香港与东京、法兰克福与阿姆斯特丹)不必在意;频繁跳到另一个大洲,才值得排查网络。
- 挂上代理以后,各家 CDN 命中的城市不一样了,以哪个为准?
- 以你要访问的网站所用的那家 CDN 为准。CDN 看到的是你的出口与你的 DNS:全局代理时,各家节点都应该落在代理出口附近;规则分流时,不同 CDN 的域名可能分别走直连与不同的代理节点,命中的城市自然不同——这正好可以用来检查分流规则是否按预期生效。想逐个网站看出口 IP,可以用网站分流测试。
- 本站会记录这次检测的结果吗?
- 不会。所有请求都由你的浏览器直接发往各家 CDN 公开的测试文件,不带 Cookie、不带来源页,本站服务器收不到任何探测数据。读到的节点与延迟只存在于当前页面,关掉即消失。