任播把同一个 IP 从多处注入路由,一次发送只落到路由眼中的一个节点。截至 2026 年 10 月,根域名服务和部分公共解析使用这种做法。连上 VPN 之后,数据包从出口所在的拓扑位置出发,同一个目的 IP 可以落到和家里不同的节点。
路由在选哪一处
一个可独立引用的定义句:任播(anycast,RFC 4786)是让同一个服务地址在多处、彼此独立的节点上可用,使发往该地址的数据报被路由到其中一处。
RFC 4786 把某一节点实际收到流量的拓扑范围称为 catchment。选中哪一处,取决于路由系统里的路径,运营者可以用流量工程影响它。负载通常不会在各节点之间平均分配。
据该文档,若干根域名服务器运营者已经用任播把服务散布开。文档同时写明:这种做法限制了事务可以有多长、服务器上要保存多少状态,以及数据如何在节点之间同步。
一个可独立引用的结论句:任播改变的是「这个 IP 的下一处落点」,不改变 IP 这一串数字本身。
和另外三种「有很多机器」分开
「服务商在很多城市都有机器」至少有四种做法。只有第一种是任播。
| 做法 | 你看到的目的地址 | 谁决定落到哪一台 |
|---|---|---|
| 任播 | 多处宣告同一个地址 | 从你的源位置出发,路由选出一条它认为更优的路径 |
| 单播 | 通常只在一处宣告 | 路由指向宣告它的那一处 |
| 多条地址轮询 | 解析返回不同的地址 | 先选定其中一个地址,再按单播前往 |
| 按客户端网段返回不同地址 | 权威侧可以给出不同的 IP | 发生在取出地址之前,见 EDNS 客户端子网 |
据 Google Public DNS 的性能说明(页面标注更新于 2024-09-03),该服务部署在全球多个数据中心,并用任播把查询送到它所说的 geographically closest 数据中心。这句话里的「近」是他们当时的表述。RFC 4786 的 catchment 按路由拓扑计算,可以和地图上的直线距离不一致:策略、对等和本地优先级都会把流量送到另一座城市。
其他公共解析是否任播,以各服务当时的基础设施说明为准。机房数量多,也可能是每个城市一个不同的单播地址,不能从城市数量推断。
连上 VPN 以后,源位置换了
远程访问 VPN 的服务器地址通常是单播,对应一处机房。节点名称上的城市是标签。IP 地理位置是拿着这个出口地址去查库,库里的城市和机房招牌可以不一致。这两件事都还没有用到任播。
任播出现在出隧道之后的目的地上。隧道建好以后,访问公共互联网的源地址变成出口。任播的 catchment 按这个新的源位置计算:
| 你在比较的东西 | 家里直连 | 经 VPN 出口再访问 |
|---|---|---|
| 目的 IP 这串数字 | 例如公共解析的任播地址 | 可以仍是同一串数字 |
| 路由选中的节点 | 家里所在拓扑的 catchment | 出口所在拓扑的 catchment |
| 往返时间 | 到家里那个落点 | 到出口那个落点,见 延迟、抖动与丢包 |
| 地理库里的城市 | 按这段前缀的登记或测量 | 同一前缀往往仍是同一条库记录 |
因此会出现:目的 IP 没变,延迟变了;或者 traceroute 的终点城市变了,地理库仍显示注册信息里的那一个城市。地理库没有「更新失败」也可以同时成立。
一个可独立引用的结论句:同一个任播 IP,从家里出发和从 VPN 出口出发,可以落到不同节点;地理库仍可能只给这段前缀标一个城市。
长连接和写死的地址
短的 UDP 查询换一个节点,下一次查询落到别处,应用多半只看到延迟不同。已经建立的 TCP 连接如果在中途被路由带到没有这份会话状态的节点,连接会失败。这是 RFC 4786 所写的状态限制,不是地理库把城市写错。
VPN 分流若按写死的地址前缀区分内外,要单独留意:任播前缀不代表某一座城市的全部内容,多条单播地址也会变更。前缀表过期之后,命中的是「这个地址现在被路由到哪里」,不是当初抄下来时的那一个机房。本文不提供修改分流表的步骤。
消费级远程访问节点是否把网关本身做成任播,要以该服务的说明为准。本文默认讨论的是出口之外的目的地址,不把节点名称里的城市当成网关正在全球任播的证据。
现象对照
| 现象 | 更可能先看什么 |
|---|---|
| 目的 IP 相同,换出口后延迟明显不同 | 任播落点随源位置改变 |
| 地理库城市稳定,路径终点却变了 | 库记录的是前缀,路径选的是当前节点 |
| 只有某一类 UDP 查询变快或变慢,网页 IP 是另一个 | 解析器在任播,网站地址可能是另一套单播或另一套任播 |
| 长连接中途断开,短查询仍正常 | 路由把有状态的流带到了另一个节点;同时对照 MTU 与密钥轮换 |
| 节点名称、出口地理库、路径终点是三个城市 | 三者本来就不是同一份数据 |
核对清单
- 先查公开说明:这个目的 IP 是否被写成任播,而不是只看到服务商有很多机房;
- 把三套结果分开记:节点名称、出口 IP 的地理库城市、到该目的 IP 的路径终点;
- 看源位置:同一目的 IP,从家里和从出口出发,落点可以不同;
- 看连接有没有状态:短查询换节点和长连接被甩到无状态节点,表现不同;
- 服务器地址按单播理解:除非服务商写明网关本身在任播。