![CDN(内容分发网络)如何工作?](https://linux22.com/image/1313781/CDN%EF%BC%88%E5%86%85%E5%AE%B9%E5%88%86%E5%8F%91%E7%BD%91%E7%BB%9C%EF%BC%89%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
将 Akamai 用作 CDN。据我了解,当客户端请求页面时,请求将发送到 Akamai 中央服务器,然后根据客户端的位置,选择 Akamai 边缘服务器,客户端的后续请求将直接发送到此边缘服务器。我的问题是:
当客户端请求一个网站(按名称)时,一旦 DNS 将名称解析为 Akamai 中央服务器的 IP 地址并将其传递给客户端,客户端将保留此 IP 地址,那么后续请求如何能够直接转到 Akamai 边缘服务器的 IP 地址?
或者说,当使用 CDN 时,DNS 解析本身是否应该由 CDN 服务器完成?
谷歌、亚马逊、Facebook 等巨头是否拥有自己的 CDN 服务器,还是依赖 Akamai 等第三方 CDN 提供商?假设谷歌和雅虎都使用 Akamai CDN,那么雅虎和谷歌的内容是否位于同一台服务器上?这难道不会带来潜在的安全问题吗?
答案1
你不只是主持整个网站有了 CDN,您的内容。
我刚刚意识到我之前回答过一个类似的问题:akamaihd.net 是做什么的?
因此,您的网站引用http://akamai/myfile.ext
。这将请求myfile.ext
。akamai
然后akamai
可以发送HTTP 重定向到实际的内容服务器。
现在,当最后一步被缓存时,太好了,所有未来的请求都将发送到最近的内容服务器。
这是如何运作的?
假设这个网站:
<html>
<body>
<img src="http://cdn/oliver.png" />
</body>
</html>
我从自己的网络服务器请求此网站。.html
文件是不是托管于cdn
。我的网络服务器的 DNS 也不是。
初始请求
因此我的浏览器获取了该 HTML 文件并对其进行了解析。它找到了引用的图像并注意到它位于http://cdn/oliver.png
。它请求该文件。
为此,需要找到 的 IP 地址cdn
。在我们的示例中,该 IP 地址是10.10.10.10
。
通过该 IP 地址,它可以连接到cdn
服务器并请求/oliver.png
。
地理位置
现在cdn
意识到,“那家伙来自德国!“。因此,它没有向我发送我想要的精彩图片,而是向我发送了一个 HTTP 重定向,内容是:
/oliver.png 不在这里。它在
10.10.33.33/oliver.png
因此我的浏览器会询问10.10.33.33
(希望离我更近)图片。
严重地?
我并不是说所有 CDN 都是这样运作的,但这是一种方法。
您还可以实现一个 DNS 守护程序,根据发送查询的人的位置返回不同的名称查找结果。
但我怀疑这在实践中是否可行。但也许我只是无法想象如何正确设置它。请参阅fluffy 的回答看看这是如何实现的。
谁运行 CDN?
最多全球参与者在某种程度上,它们都有自己的内容交付网络(或者我假设如此)。一些提供商只是将某些服务卸载到更大的 CDN(例如 Microsoft 对 MSDN 下载所做的那样)。这可能在某种程度上触及了您的第二个主题。
考虑一下,在 MSDN 中,Microsoft 提供产品下载。这些下载由 Akamai 提供。如果您可以确定该下载的 URL,则可以直接下载产品,而无需联系 Microsoft。
这是安全问题吗?其实不是,因为正在下载的内容仍然受到保护(通过产品密钥)。
但其他数据怎么样?
如果你的数据与安全相关,那么它就不是 CDN 材料。如果你不想让某些东西尽可能广泛地传播,不将其放入 CDN。
答案2
CDN 的一个常见方法是使用所谓的“任播”。其工作原理是,您的分布式服务器与以该服务器为目的地进行响应的 DNS 共置;例如,您可能在不同的托管设施中拥有三台服务器,并且它们各自的 DNS 都声称它们的 IP 地址是您服务器的规范 IP 地址(称之为content.example.com
)。每个 DNS 都配置为具有相同的全局 IP 地址,然后每个服务器的设施使用 BGP 更新来使到最近服务器的路由获胜 - 因此当您在 上进行名称查找时content.example.com
,最快/最近/最可用的 DNS 将使用其 HTTP 服务器响应请求。
通过这种方式,就不再需要 GeoIP 技巧,您始终可以通过对您来说最快的服务器获得内容 - 由于互联网的异构性质,这可能与其物理位置有关,也可能无关。
据我了解,Akamai 至少部分是按照这种方式运作的。
答案3
还有 Origin Pull 类型的 CDN 可用。
Amazon Cloudfront 能够使用此技术。
您设置一个 CNAME(如 media.example.com),指向他们分配的服务器名称,并将所有内容保留在您的服务器上。对于您希望通过 CDN 交付的图像和内容,您可以在 URL 中使用 media.example.com。请求将发送到他们的服务器网络,如果内容不可用,他们的服务器将从您的服务器中提取内容。一旦进入系统,内容就会分发到最接近需求所在位置的服务器场,并在分配的 TTL 内保留在那里。您的服务器不再看到缓存内容上的任何流量,直到 TTL 到期并且 Cloudfront 必须刷新它。
答案4
Akamai CDN 工作原理的精彩摘要可以在这里找到
简而言之:
- CDN 服务器具有指向 Akamai 的 DNS 服务器的 CNAME 记录。
- 因此,客户端浏览器向 CDN 服务器发出的第一个请求是在 Akamai 的 DNS 服务器上查找其 DNS,该服务器会使用靠近用户的 Akamai 服务器(称为“边缘服务器”)的 IP 地址进行响应
- 如果最近有其他用户请求过静态元素,这些边缘服务器可能会从本地缓存中提供静态元素,甚至不必返回您的服务器来获取资产的副本。
- 缺失元素或不可缓存的页面通过 Akamai 网络路由到主机附近的另一台边缘服务器。该边缘服务器向主机站点发出实际请求,并通过网络将其传回原始边缘服务器,然后从那里返回给最终用户。
- 由于边缘服务器使用 Akamai 的专有协议进行内部通信并绕过瓶颈,因此流量流动速度比公共互联网快得多。
正如上面博客文章中提到的,一些大公司使用自己的服务器解析 DNS,这可能会抵消使用 CDN 的一些好处。