CDN概念
CDN全称叫作“Content Delivery Network”,中文叫内容分发网络。
原理分析
咱们知道,当咱们使用域名访问某一个网站时,实际上就是将请求包(以Http请求为例)经过网络传输给某台服务器,好比访问“www.baidu.com”时:
首先解析出该域名所对应的IP地址(DNS域名解析)
而后将Http请求包经过网络路由到IP地址所对应的服务器
咱们一般说“服务器的IP地址”,这其实不太准确,IP地址是和网卡绑定的,一个服务器能够有多个网卡,也就是可能有多个IP地址。
咱们先来看第一步:域名解析
域名解析
解析域名分为两种:
将一个域名解析为一个IP地址
将一个域名解析为另一个域名
其实解析思路不难,咱们在域名服务商购买了一个域名以后,须要去映射一个IP地址,能够用Map来表示这个关系:{域名:IP}。
同时咱们也能够给某个域名取一个别名,好比“www.baidu.com”取一个别名“test.baidu.com”,这种关系也能够用Map来表示:{域名:别名}。这里的别名专业一点叫作CNAME,相信你们对这个词有点眼熟,它就是这个意思。
而域名解析,实际上就是解析出指定域名所对应的IP地址,或者该域名的一个CNAME。
而域名解析是由DNS系统来负责的,DNS服务接受外部请求,从请求里提取域名,
若是这个域名对应的是IP地址,则返回这个IP地址,
若是这个域名对应的是CNAME,则继续查找CNAME域名的IP地址,而后将该地址返回给请求发送者。
请求发送者拿到IP地址以后,完成真正的请求调用。
实际上DNS系统是很是庞大的,这里不去多将,你们把它看成一个黑盒子,这个盒子的做用就是上文所描述的,这里用一个简单的图来表示一下。
没有CNAME的状况:
有CNAME的状况:
特别注意:在有CNAME的状况下,咱们能够发现,CNAME实际上在域名解析的过程当中承担了中间人(或者说代理)的角色,这是CDN实现的关键。
CDN原理
首先CDN是为了改善互联网的服务质量的**。**通俗一点说其实就是提升访问速度。
假设百度网站如今只有一台服务器,如今有一我的在上海访问百度,若是该服务器也在上海,那么一般来讲访问比较快,若是该服务器在拉萨,那么相对而言访问就比较慢了。那么这个问题的根本缘由是网络传输是依赖于网线的,网线越长,那么时间确定就越久。
那么怎么解决这个问题呢?其实思路很简单,百度在全国各地都部署如出一辙的服务器就好了,专业一点叫冗余。
思路很简单,但实现仍是比较麻烦的,服务器上的资源分为两种:静态资源与动态资源。
静态资源:这种资源一般是不多变更的,好比图片,视频,css,javascript等等
动态资源:这种资源不一样用户不一样时刻访问一般是不同的,比入php、jsp等等。
那么若是百度要在全国各地都部署服务器,若是说每一个服务器上都有相同的动态资源,那么可能还须要配置相应的数据库,由于动态资源所记录的信息一般会存储在数据库中,那么这就涉及到了数据同步等等问题,这会致使成本很高,这种作法专业一点其实就是**集群,而目前来讲集群架构最可能是三地五中心,**不是说全国多地集群不可能,主要是成本过高。
那么有没有成本比较低的方式呢,有,就是在每一个服务器上只部署静态资源,静态资源一般不涉及到数据库,因此成本也比较低,并且也能提升用户的访问速度。
到这里,介绍了CDN想要达到的目的,那么怎么达到这个目的呢?
如今若是要比较CDN系统,咱们能够考虑两点:
1.CDN系统中存储静态资源服务器的性能以及网速怎么样。
2.CDN系统中全国甚至全球范围内服务器节点的数量以及部署状况。
第一点很好理解,第二点你们应该也能理解了,若是静态资源的服务器节点不少,可以让每一个用户在访问这些静态资源时都不用“跑很远的路程”才能获取到,那么天然这是CDN系统的优势。
有公司看到了这种需求,因此如今其实有不少CDN供应商,好比阿里,腾讯等等都有本身的CDN服务。只要你本身的系统接入了这些大厂所提供的CDN服务,你把本身的静态资源传给CDN服务,那么这些静态资源将自动的分布到全世界各地去。
好,那么如今的问题是,用户在访问静态资源时也是经过域名来访问的,域名会被解析成某一个IP地址,关键的问题就是,DNS系统怎么在作域名解析时,解析出来一个离用户最近的一个IP地址呢。
普通的DNS系统是作不到的,须要一个特殊的DNS服务器,这个特殊DNS须要知道
用户当前所在位置
还须要知道用户如今访问的这个域名对应哪些IP地址,以及这个IP地址分别在哪?
对于第一个问题好解决,直接从用户请求里提取出用户的ip地址,好比这个ip地址被解析为北京电信、上海移动等等。
第二个问题由谁来解决,咱们如今考虑的是CDN,CDN提供商确定知道他们公司在哪些地方部署了机器以及它们的IP地址,因此这个问题只能有CDN提供商来解决,CDN提供商会提供这个特殊的DNS服务器,咱们叫作 CDN专用DNS服务器。
这样的话,只要用户在使用某个域名访问静态资源时,若是用户直接配置本身电脑的DNS地址为CDN专用DNS服务器。那么天然解决了问题,可是咱们须要考虑的时,咱们不能要求世界上全部的用户都去修改本身电脑的DNS地址。因此这个时候就要利用DNS中的CNAME了。
用户使用某个域名来访问静态资源时(这个域名在阿里CDN服务中叫作“加速域名”),好比这个域名为“image.baidu.com”,它对应一个CNAME,叫作“cdn.ali.com”,那么普通DNS服务器(区别CDN专用DNS服务器)在解析“image.baidu.com”时,会先解析成“cdn.ali.com”,普通DNS服务器发现该域名对应的也是一个DNS服务器,那么会将域名解析工做转交给该DNS服务器,该DNS服务器就是CDN专用DNS服务器。CDN专用DNS服务器对“cdn.ali.com”进行解析,而后依据服务器上记录的全部CDN服务器地址信息,选出一个离用户最近的一个CDN服务器地址,并返回给用户,用户便可访问离本身最近的一台CDN服务器了。
对于更多关于架构中须要提速的内容,你们能够加入到架构学习交流群来进一步的研讨。欢迎你们发布讨论