CDN:我的 DNS 怎么可能根据访问者的位置提供不同的 IP?

mgu*_*utt 12 domain-name-system http cdn nameserver

我找到了 CDN 工作原理的解释。但是有一件事我真的不明白。假设在我的位置我设置多个DNS服务器和他们所使用的域名服务器的域dns1.example.comdns2.example.comdns3.example.com。该 DNS 服务器能够根据访问者的位置(ping、地理数据库、浏览器语言或其他任何内容)提供服务器 IP。现在我www.example.org在注册表中为我的域更新此名称服务器设置。

现在,第www.example.org一个使用过期 TTL 的请求尝试解析域。它问:

  1. 本地 .hosts/DNS,如果 TTL 过期:
  2. 互联网提供商的 DNS,如果 TTL 过期:
  3. 根 DNS,如果 TTL 过期:
  4. 我的本地人 dns1.example.com

但是,如果我理解正确,那么新 IP 将添加到所有这些名称服务器缓存中,直到 TTL 再次过期。那么如何根据访问者的位置将其他 IP 发送给访问者呢?

这个答案中, theandym 说请求是“转发”的,但我认为这不是 CDN 的工作方式,因为“转发”意味着延长传输方式,导致加载时间更长。或者 CDN 是否要求域的 TTL 为零?

Update1
通过这个问题,我找到了谷歌的文档,描述了他们如何优化 CDN 性能。它没有解释 CDN 一般是如何工作的,但有一些有趣的解释,如下所示:

此后,每当客户端尝试获取托管在 CDN 上的内容时,客户端都会被重定向到确定其前缀具有最小延迟的节点。但是,此重定向基于与 DNS 名称服务器的 IP 地址相对应的前缀,该服务器代表客户端解析内容的 URL,通常与客户端位于同一位置。

这意味着 Google 首先会检查所有 IP 前缀的延迟,并为所有可用前缀定义 DNS 解析表 (?)。如果访问者拥有 IP 198.51.100.231,则使用 Google 服务器 IP,即为前缀设置198.51.100.0。但同样:Google 的 DNS 如何知道访问者使用的是哪个 IP?大多数访问者通过他们的互联网提供商解析 Google 的域,并且解析是通过这些外部 DNS 服务器完成的吗?

再举一个例子:如果我facebook.com使用不同的在线工具(托管在不同国家/地区)为域启动 DNS 解析,它会解析为具有不同域的不同 IP,例如:

  • 31.13.92.36 反向:edge-star-mini-shv-01-frt3.facebook.com
  • 31.13.76.68 反向:edge-star-mini-shv-01-sea1.facebook.com
  • 31.13.69.228 反向:edge-star-mini-shv-01-iad3.facebook.com
  • 157.240.2.35 反向:edge-star-mini-shv-01-ort2.facebook.com

之后我认为这可能取决于访问者使用的 DNS 服务器位置,但我尝试了自己的(德国电信,德国)、谷歌的(8.8.8.8)和法国的主要服务器(橙色),他们都返回facebook.com了知识产权31.13.92.36

mgu*_*utt 9

好的,我现在可以粗略地回答我自己的问题了。Anurag Bhatia说 CDN 的工作方式有两种:

域名系统

让 DNS 发挥作用,即当来自网络 ISP A 的用户查找 cdn.website.com 时,他们应该得到缓存 A 的单播 IP 地址作为回报,同样对于来自 ISP B 网络的用户,缓存 B 的单播 IP 应该返回。

假设我们有一个 IP1.2.3.4位于美国的服务器和一个 IP2.3.4.5位于德国的缓存服务器。现在访问者尝试解析域example.org。如果他没有更改网络设置,他将使用其互联网服务提供商 (ISP) 的 DNS 服务器。该 ISP 现在要求dns1.example.com(域的名称服务器)提供 IP。现在这取决于 ISP 的位置。如果它位于德国,则dns1.example.com返回2.3.4.5,如果位于美国,则返回1.2.3.4

但是这种方法可能有一个缺点:每次用户更改他的网络设置并使用 EDNS0 (参见 IETF 草案)不兼容的 DNS 提供商(例如公司的中央 DNS 服务器)时,dns1.example.com将再次使用与这些 DNS 最近的 IP 进行应答位置,但这次访问者很可能位于不同的位置,从而导致更高的延迟。

EDNS0 兼容的DNS 提供商将有关用户的信息传递给权威 DNS 服务器。所以权威DNS服务器可以用用户所在位置旁边的IP进行响应:

今天,如果您使用 OpenDNS 或 Google 公共 DNS 并访问网站或使用全球互联网加速中参与网络或 CDN 之一提供的服务,那么您的 IP 地址的截断版本将被添加到 DNS 请求中。Internet 服务或 CDN 将使用此截断的 IP 地址对其响应方式做出更明智的决定,以便您可以连接到最佳服务器。

...

; EDNS: version: 0, flags:; udp: 512
; CLIENT-SUBNET: 130.89.89.0/24/21
Run Code Online (Sandbox Code Playgroud)

任播

基于“任播路由”概念路由到最近的缓存节点。在这里,缓存 A、缓存 B 和缓存 C 将使用相同的 IP 地址,路由将负责到达最近的 IP 地址。

由于 BGP 等原因,我不太了解 Anycast,但我认为 Anurag Bhatia 的进一步解释给出了它如何工作的想法:

  1. 优化基于BGP路由和公告,DNS的作用很小。
  2. 这种设置很难建立和扩展,因为任播要在全球范围内完美运行,每个位置都需要大量的对等互连和一致的传输提供商。如果任何对等点泄漏到上游或其他对等点的路由,由于任播中断,给定集群上可能会出现大量意外流量。
  3. 此设置不依赖于 DNS 递归,因此 Google DNS 或 OpenDNS 工作正常。
  4. 这节省了大量 IP 地址,因为在多个位置使用相同的池。

Anycast 也有一个缺点:路由是灵活的。虽然在 TCP 会话开始时,目标节点可能位于网络 A 中,但它可能会更改为网络 B。因此,任播在实践中仅用于 UDP。UDP 是一种无会话协议。

大多数 CDN 对 HTTP/HTTPS 流量使用 DNS,对 DNS 请求使用 Anycast。

  • 这就是我试图解释的。您可以让多个路由器通告同一个网络。Internet 上的其余路由器将接收到看似相同目的地的所有路由,并且它们将从自己的角度安装最佳路由,通常是最少的 AS 跃点。路由器不知道这些实际上是世界各地的不同位置,它们只知道它们有通往同一目的地网络的多条路由,即使这些目的地位于不同的地理位置。 (2认同)