我发现了这个解释CDN 是如何工作的。但有一件事我真的不明白。假设我在我的位置设置了多个 DNS 服务器,它们使用名称服务器域dns1.example.com
,dns2.example.com
并且dns3.example.com
. 该 DNS 服务器能够根据访问者的位置(ping、地理数据库、浏览器语言或其他)提供服务器 IP。www.example.org
现在我在注册表中为我的域更新此名称服务器设置。
现在,www.example.org
带有过期 TTL 的第一个请求会尝试解析域。它问:
- 本地 .hosts/DNS,如果 TTL 过期:
- 互联网提供商 DNS,如果 TTL 过期:
- 根 DNS,如果 TTL 过期:
- 我当地的
dns1.example.com
但是,如果我理解正确,那么新 IP 将被添加到所有这些名称服务器缓存中,直到 TTL 再次过期。那么如何根据访问者的位置向访问者发送其他 IP 呢?
在this answer theandym说请求是“转发”的,但我不认为这是CDN的工作方式,因为“转发”意味着延长传输方式导致更长的加载时间。或者 CDN 是否要求域的 TTL 为零?
Update1
通过这个问题,我找到了Google 的文档,描述了他们如何优化 CDN 性能。它没有解释 CDN 的一般工作原理,但有一些有趣的解释,如下所示:
此后,每当客户端尝试获取托管在 CDN 上的内容时,客户端都会被重定向到被确定为其前缀具有最短延迟的节点。但是,此重定向基于与代表客户端解析内容 URL 的 DNS 名称服务器的 IP 地址相对应的前缀,通常与客户端位于同一位置。
这意味着 Google 首先会检查所有 IP 前缀的延迟,并为所有可用的前缀定义一个 DNS 解析表 (?)。如果访问者拥有 IP 198.51.100.231
,则使用 Google 服务器 IP,即为 prefix 设置198.51.100.0
。但又一次:Google 的 DNS 如何知道访问者使用的是哪个 IP?大多数访问者通过他们的互联网提供商解析谷歌的域,并且解析是通过那些外部 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
。
好吧,看来我现在可以粗略回答我自己的问题了。Anurag Bhatia说 CDN 的工作方式有两种:
域名系统
假设我们有一个 IP
1.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进行响应:
任播
由于 BGP 等原因,我不太了解 Anycast,但我认为对 Anurag Bhatia 的进一步解释给出了它如何工作的想法:
Anycast 也有一个缺点:路由很灵活。在 TCP 会话开始时,目标节点可能位于网络 A 中,它可能会更改为网络 B。因此,Anycast 在实践中仅用于 UDP。UDP 是一种无会话协议。
大多数 CDN 使用 DNS 处理 HTTP/HTTPS 流量,使用 Anycast 处理 DNS 请求。
您的应用程序将指向 CDN(用于资产、图像、API 等)。然后 CDN 将使用缓存或从您的服务器获取数据/文件。在您的示例中,您将指向 cdn.example.com,CDN 会将其路由到 dns1.example.com。cdn.example.com 将从任播网络上最近的位置获取数据,因此 IP 可以不同。
资源:
https://www.youtube.com/watch?v=JX2qrdp0WT4
https://www.akamai.com/blog/developers/how-cdn-can-make-your-apis-more-powerful