当前位置: 首页 > 后端技术 > Node.js

网络协议18-CDN:家门口的小店

时间:2023-04-03 23:05:45 Node.js

【前五篇】系列文章传送门:网络协议13-HTTPS协议:无尽的加密之路网络协议14-流媒体协议:说爱你不容易网络协议15——P2P协议:小种子大学网络协议16——DNS协议:网络世界中的通讯录网络协议17——HTTPDNS:私有自定义DNS服务到现在为止,我们已经基本了解了网络协议中的大部分常用协议,并且熟悉整个HTTP请求流程。从零开始之后,我们要考虑如何优化“存在”的过程,这是我们共同的请求优化。在目前的技术栈中,CDN是最常用的方式。在了解CDN之前,我们可以先了解一下现代社会的物流配送。比如我们去电商网站下单买东西,这个东西一定要从电商总部的中央仓库发货吗?在电子商务的早期,所有交货都是从中央仓库进行的,因此买家可能需要很长时间才能收到他们的产品。但是后来,电子商务网站的物流系统变得更加智能。他们在全国建立了很多仓库,而不是只有总部的中央仓库可以发货。据统计,电商网站大概知道北京、上海、广州、深圳、杭州等地每天能卖出多少书本、纸巾、包包、电器等保存期限长的商品,以及这些商品分布存放在各个仓库中,一旦客户下单,货物就会从就近的仓库发货,大大减少了运输时间,提高了用户体验。同样,互联网也借鉴了“就近送货”的思想。就近的CDN分布?全世界的数据中心非常多,无论你去哪里上网,基本上不远处就有数据中心。每个数据中心可以部署几台机器组成一个缓存集群,缓存一些热点数据,这样用户访问数据的时候,就近访问。这些分布在各地各个数据中心的节点,统称为边缘节点。由于边缘节点数量很多,但是每个集群的规模都比较小,不可能把所有的都缓存起来,所以可能打不中,所以会在边缘节点上形成区域节点。区域内节点规模更大,缓存数据更多,命中概率更大。在区域节点之上是中心节点,其规模更大,缓存数据更多。这样,数据被缓存在这样的节点层中,以提高响应速度。但是所有节点都不缓存数据,只返回源网站访问。如上图所示,就是CDN分发系统的架构。CDN系统的缓存是分层的。如果您无法访问源数据,您将无法访问它。这也是电商网站物流系统的思路。如果在广州找不到,可以找华南局。如果找不到华南局,可以找华南局。有了这个分布式系统,客户端如何找到对应的边缘节点进行接入呢?还记得我们之前学过的基于DNS的全局负载均衡吗?这种负载均衡主要用于选择就近的同一运营商的服务器接入。同样,CDN分发网络也可以用同样的思路来选择最合适的边缘节点。如上图所示,CDN负载均衡的流程图。1)没有CDN时(图中虚线)。当用户在浏览器中输入域名www.web.com,当客户端访问本地DNS服务器时,如果本地DNS服务器有缓存,就会返回该网站的地址。如果不是,则递归查询该网站的权威DNS服务器,该权威DNS服务器负责web.com,它会返回该网站的IP地址。本地DNS服务器缓存IP地址并返回IP地址,然后客户端直接访问IP地址访问网站。2)有CDN时(图中实线)。这时,在权威DNS服务器web.com上,会设置一个CNAME别名,指向另一个域名www.web.cdn.com,返回给本地DNS服务器。当本地DNS服务器获取到新域名后,需要继续解析新域名。此时再次访问的不是web.com的权威DNS服务器,而是web.cdn.com的权威DNS服务器,也就是CDN本身的权威DNS服务器。在这台服务器上,仍然会设置一个CNAME指向另一个域名,即CDN网络的全局负载均衡器。接下来,本地DNS服务器请求CDN的全局负载均衡器解析域名。全局负载均衡器会选择合适的缓存服务器为用户提供服务。选择的依据包括:根据用户的IP地址判断哪个服务器距离用户最近;用户的运营商;承载内容的名词,决定哪个服务器有用户需要的内容;查询每台服务器当前的负载情况,判断哪台服务器还有服务能力。根据以上条件,综合分析后,全局负载均衡器会返回一个缓存服务器的IP地址。本地DNS服务器缓存这个IP地址,然后将IP返回给客户端,客户端访问边缘节点下载资源。缓存服务器响应用户的请求,将用户需要的内容传递给用户。如果这台缓存服务器上没有用户想要的内容,那么这台服务器就会向它的上级缓存服务器请求内容,直到可以追溯到网站的源服务器,将内容拉取到本地。CDN缓存内容保质期长的日用品不易过期,更容易缓存。同样,互联网上的静态页面、图片等几乎没有变化,所以也适合做缓存。对于存储时间短的,比如生鲜,对应互联网上的动态资源,需要动态CDN。静态资源缓存大家还记得上图中接入层缓存的架构吗?在进入数据中心时,我们希望通过最外层访问层的缓存来阻断对边缘大部分静态资源的访问。CDN更进一步,将这些静态资源缓存在更靠近用户的数据中心之外。总的来说就是缩短用户的“接入距离”。离客户越近,客户接入性能越好,时延越低。流媒体CDN在静态内容方面,流媒体也大量使用了CDN。CDN支持流媒体协议。比如前面提到的RTMP协议。很多时候,这相当于一个代理,从上层缓存中读取内容,转发给用户。由于流媒体往往是连续的,可以实现预缓存策略,也可以提前推送到用户客户端。对于静态页面,内容分发往往采用pull的方式。也就是发现有cachemiss,再去上层拉取。这种方法不适用于流媒体。流媒体数据量大,如果有回源,压力会比较大,所以往往采用主动推送的方式,将热点数据主动推送到边缘节点。对于流媒体,很多CDN也提供预处理服务。即在分发文件之前,进行一定的处理。例如,可以将视频转换成不同的码流,以满足不同网络带宽用户的需求。又如对视频进行分段,以减轻存储压力,也可以让客户端选择使用不同的码率来加载不同的片段。也就是我们常见的,超清、标清、流畅等等。此外,流媒体CDN还有一个关键的防盗链问题。因为视频的版权要花很多钱,如果流媒体被其他网站盗用,在其他网站播放,损失将是巨大的。防止盗链的最常见和最简单的方法是使用HTTP标头的引用字段。浏览器在发送请求时,通常会带上refer。告诉服务器是从哪个页面链接过来的,服务器可以据此获取一些信息进行处理。如果引用信息不是来自本站,则阻止访问或跳转到其他链接。refer的机制相对容易破解,所以需要其他机制。一种常用的机制是时间戳防盗链。使用CDN的管理员可以在配置界面与CDN供应商约定加密字符串。客户端访问时,取出当前时间戳、要访问的资源及其路径,使用联通加密字符串进行前面的算法得到一个字符串,然后生成下载链接,把前面的字符串和访问CDN的截止时间戳。在服务端,取出过期时间,与当前CDN节点时间进行比较,确认请求是否过期。然后CDN服务器根据请求的资源和路径、时间戳、约定的加密字符串进行签名。只有当签名与客户端发送的签名一致时,资源才会返回给客户端。动态资源缓存对于动态资源,使用动态CDN。动态CDN主要有两种模式:1)“生鲜超市模式”,即边缘计算模式。由于数据是动态生成的,因此数据的逻辑计算和存储也应该相应地放在边缘节点上。其中,存储数据每隔一定时间从源数据同步,然后在边缘节点进行计算得到结果。这种方式和现在的生鲜超市很像。新鲜的海鲜餐是动态的,很难提前缓存。所以,在家旁边放一个生鲜超市,既可以送货上门,也可以现做现做。这是边缘计算的一种体现。2)“冷链运输模式”,即路线优化模式。数据不是在边缘计算产生的,而是在源站产生的,但可以通过CDN网络进行数据分发,优化路径。因为CDN节点很多,所以可以找到离源站很近的边缘节点,也可以找到离用户很近的边缘节点。中间环节完全由CDN规划,选择更靠谱的路径,使用专线接入。另外,在传输这些资源的时候,由于TCP的流量控制和拥塞控制,可以在CDN加速网络中调整TCP的参数,使得TC可以更积极地传输数据。这一切手段就像是冷链传输,优化整个物流运输,全程冷藏高速运输。无论是从家附近的超市派送,还是原产地派送,都保证新鲜到家。总结CDN就像电子商务系统的分布式仓储系统一样,分为中心节点、区域节点和边缘节点,从而将数据缓存在离用户最近的位置。CDN最擅长缓存的就是缓存静态数据。此外,还可以缓存流媒体数据。这时候就要注意防盗链的问题了。还支持动态数据的缓存,一个是边缘计算,一个是链路优化。参考:什么是CDN?;[维基百科-内容分发网络](https://en.wikipedia.org/wiki...;刘超-网络协议趣谈系列;