mgu*_*utt 12 domain-name-system http cdn nameserver
我找到了 CDN 工作原理的解释。但是有一件事我真的不明白。假设在我的位置我设置多个DNS服务器和他们所使用的域名服务器的域dns1.example.com
,dns2.example.com
和dns3.example.com
。该 DNS 服务器能够根据访问者的位置(ping、地理数据库、浏览器语言或其他任何内容)提供服务器 IP。现在我www.example.org
在注册表中为我的域更新此名称服务器设置。
现在,第www.example.org
一个使用过期 TTL 的请求尝试解析域。它问:
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,例如:
之后我认为这可能取决于访问者使用的 DNS 服务器位置,但我尝试了自己的(德国电信,德国)、谷歌的(8.8.8.8)和法国的主要服务器(橙色),他们都返回facebook.com
了知识产权31.13.92.36
。
好的,我现在可以粗略地回答我自己的问题了。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 地址对其响应方式做出更明智的决定,以便您可以连接到最佳服务器。
...
Run Code Online (Sandbox Code Playgroud); EDNS: version: 0, flags:; udp: 512 ; CLIENT-SUBNET: 130.89.89.0/24/21
任播
基于“任播路由”概念路由到最近的缓存节点。在这里,缓存 A、缓存 B 和缓存 C 将使用相同的 IP 地址,路由将负责到达最近的 IP 地址。
由于 BGP 等原因,我不太了解 Anycast,但我认为 Anurag Bhatia 的进一步解释给出了它如何工作的想法:
- 优化基于BGP路由和公告,DNS的作用很小。
- 这种设置很难建立和扩展,因为任播要在全球范围内完美运行,每个位置都需要大量的对等互连和一致的传输提供商。如果任何对等点泄漏到上游或其他对等点的路由,由于任播中断,给定集群上可能会出现大量意外流量。
- 此设置不依赖于 DNS 递归,因此 Google DNS 或 OpenDNS 工作正常。
- 这节省了大量 IP 地址,因为在多个位置使用相同的池。
Anycast 也有一个缺点:路由是灵活的。虽然在 TCP 会话开始时,目标节点可能位于网络 A 中,但它可能会更改为网络 B。因此,任播在实践中仅用于 UDP。UDP 是一种无会话协议。
大多数 CDN 对 HTTP/HTTPS 流量使用 DNS,对 DNS 请求使用 Anycast。