CDN 概念
CDN,全称为 Content Delivery Network,意为内容分发网络,是一种通过在全球各地部署服务器节点来加速内容传输的网络架构。
传统上,当用户访问一个网站或应用时,请求会直接发送到托管网站的服务器。但是,由于网络延迟和带宽限制等因素,用户可能会面临加载速度慢的问题,尤其是当用户与服务器之间的物理距离较远时。
要解决这个问题,可以将服务器备份多个到世界各地,但这也有一个问题,部署/维护服务器的成本是十分高昂的。在现实生活中,有一些服务商就会在世界各地部署节点服务器,这些服务器就形成了一种虚拟网络,这个网络就是CDN-内容分发网络。
在这个网络中会有多台边缘服务器为用户服务,这里的边缘的服务器是指离用户最近的服务器,CDN的作用就是帮服务器近距离向用户分发网页的内容。
CDN 负责分发网页上的内容,这些内容可以分为静态内容和动态内容
静态内容:
静态内容指的是在服务器上保存的固定不变的文件,如图片、CSS 文件、JavaScript 文件、HTML 页面等。这些文件在被访问时不需要进行任何处理或计算,只需要直接传输给用户即可。静态内容一般由网站开发者提前准备好,并存储在服务器上的特定位置。
动态内容:
动态内容则是根据用户的请求或其他条件在服务器上实时生成的内容。例如,用户登录后显示的个人信息、评论内容、购物车信息等属于动态内容。动态内容通常需要从数据库或其他资源中获取相关数据,并进行一些计算或处理后才能生成最终的响应。
CDN 主要用于加速静态内容的传输,通过将静态文件缓存在全球各地的节点上,在用户请求时直接从最近的节点获取内容,提高访问速度。对于动态内容,由于其实时生成的特性,无法像静态内容一样进行缓存和分发。因此,CDN 通常只用于加速静态资源的传输,而动态内容的传输仍然依赖于原始服务器的处理能力和网络延迟。
当然静态内容也不是一直保存在 CDN 里面,源服务器发送文件给 CDN 时可以在HTTP头部的cache-control中设置文件的缓存形式,这样 CDN 就知道哪些文件要缓存,缓存多久。
CDN 分发的流程
CDN 中没有是网页的源内容的,所以需要源服务器提前把网页的源内容发给CDN ,这一步叫 Push,这样当世界各地的用户访问网页的时候,就近的 CDN 服务器就会把静态内容提供给用户,不需要每次都去向源服务器发送请求。
如果源服务器没有提前把网页的内容发给 CDN ,那么当用户访问网页时,CDN 就得向源服务器索取对应的静态内容,这一步叫 Pull,源服务器还可以让 CDN 做备份,CDN 得到内容后再提供给用户。因为有了备份,其他同时做出请求的用户也可以马上拿到网页内容。
CDN 的存在相当于在用户和源服务器中间增加了一道墙,用户发送请求不再直接发送给源服务器了,而是必须通过 CDN 来进行沟通,这样一来,源服务器就不用担心DDos攻击了。
现在源服务器是不用担心攻击的问题了,但是如果CDN承受不了攻击宕机了怎么办?
为了避免这个问题,CDN 服务商会部署多台 CDN 服务器在各个地方,然后监控这些服务器的负载情况,如果某一台服务器超载了,就会把用户的请求转移到没有超载的 CDN 服务器,目的是为了平均分配网络的流量,也叫负载均衡,这里用到了任播这一技术。
除了上述所说的防护措施,CDN 还会采用TLS/SSL证书来给网站进行保护。
CDN 的加速功能
CDN 的加速功能主要通过以下几个原理来实现:
- 内容缓存: CDN 会将静态内容(如图片、CSS 文件、JavaScript 文件等)缓存到分布在全球各地的服务器节点上。当用户请求这些内容时,CDN 会尽可能地从离用户更近的节点获取内容,减少了网络传输的时间和延迟。
- 就近访问: CDN 会根据用户的地理位置,选择离用户最近的服务器节点来响应请求。这样一来,用户可以从距离更近的节点获取内容,减少了数据传输的距离和网络延迟。
- 负载均衡: CDN 可以根据服务器节点的负载情况和用户请求的流量分布,动态地将用户请求分配到不同的节点上,从而减轻了单个服务器的压力,提高了整体的响应速度。
- 预加载和预热: 针对热门内容或即将大量请求的内容,CDN 可以提前将这些内容预先加载到服务器节点上,以便在用户请求到来时能够立即响应,减少了获取内容的时间。
除了上面提到几种实现加速的方法,CDN 还有一种实现加速的方法,因为网络请求的内容无非就是各种文件,根据这一点,CDN 会帮你把文件最小化或者压缩文档 。
例如这一段代码,可以看到为了方便程序员阅读和维护,代码里面夹杂了很多的空格。
function printTest () {
return "Hello World"
}
CDN 会帮你把代码文件中的空格去掉,以节省文件的大小,去掉空格的代码如下。
function printTest () {return "Hello World"}