cdn到底是个什么鬼?看完这篇你就懂了(代码片段)

经济人 经济人     2022-12-26     741

关键词:

CDN概念

CDN全称叫做“Content Delivery Network”,中文叫内容分发网络

实际上CDN这个概念是在1996年由美国麻省理工学院的一个研究小组为改善互联网的服务质量而提出的。那么它到底是怎么改善互联网服务质量的呢?

原理分析

我们知道,当我们使用域名访问某一个网站时,实际上就是将请求包(以Http请求为例)通过网络传输给某台服务器,比如访问“www.baidu.com”时:

  1. 首先解析出该域名所对应的IP地址(DNS域名解析)

  2. 然后将Http请求包通过网络路由到IP地址所对应的服务器

我们通常说“服务器的IP地址”,这其实不太准确,IP地址是和网卡绑定的,一个服务器可以有多个网卡,也就是可能有多个IP地址。

我们先来看第一步:域名解析

域名解析

解析域名分为两种:

  1. 将一个域名解析为一个IP地址

  2. 将一个域名解析为另外一个域名

其实解析思路不难,我们在域名服务商购买了一个域名之后,需要去映射一个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等等

  • 动态资源:这种资源不同用户不同时刻访问通常是不一样的,比如ftl,jsp等等。

那么如果百度要在全国各地都部署服务器,如果说每个服务器上都有相同的动态资源,那么可能还需要配置相应的数据库,因为动态资源所记录的信息通常会存储在数据库中,那么这就涉及到了数据同步等等问题,这会导致成本很高,这种做法专业一点其实就是集群,而目前来说集群架构最多是三地五中心,不是说全国多地集群不可能,主要是成本太高。

大家想了解三地五中心的,可以看https://mp.weixin.qq.com/s/uGyGldbwmShDDPDau5pAPw这篇文章,也是本人写的。

那么有没有成本比较低的方式呢,有,就是在每个服务器上只部署静态资源,静态资源通常不涉及到数据库,所以成本也比较低,而且也能提高用户的访问速度。

到这里,介绍了CDN想要达到的目的,那么怎么达到这个目的呢?

现在如果要比较CDN系统,我们可以考虑两点:

  1. CDN系统中存储静态资源服务器的性能以及网速怎么样。

  2. CDN系统中全国甚至全球范围内服务器节点的数量以及部署情况。

第一点很好理解,第二点大家应该也能理解了,如果静态资源的服务器节点很多,能够让每个用户在访问这些静态资源时都不用“跑很远的路程”才能获取到,那么自然这是CDN系统的优点。

有公司看到了这种需求,所以现在其实有很多CDN供应商,比如阿里,腾讯等等都有自己的CDN服务。只要你自己的系统接入了这些大厂所提供的CDN服务,你把自己的静态资源传给CDN服务,那么这些静态资源将自动的分布到全世界各地去。

好,那么现在的问题是,用户在访问静态资源时也是通过域名来访问的,域名会被解析成某一个IP地址,关键的问题就是,DNS系统怎么在做域名解析时,解析出来一个离用户最近的一个IP地址呢

普通的DNS系统是做不到的,需要一个特殊的DNS服务器,这个特殊DNS需要知道

  1. 用户当前所在位置

  2. 还需要知道用户现在访问的这个域名对应哪些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服务器了。

技术图片

总结

通过上面的文章我们可以发现,CDN的实现原理依赖于DNS,因为本人不是专门搞网络的,所以文中如果有不准确的地方,还请各位大佬指出。

重点有痛点才有创新,一个技术肯定都是为了解决某个痛点才出现的。  

来源: 程序员DD, 程序员小灰, macrozheng

cdn百科第六讲|怎样用cdn抵御***?看完这篇漫画你就懂了

查看详情

面试阿里,字节跳动99%会被问到的java线程和线程池,看完这篇你就懂了!

前言:最近也是在后台收到很多小伙伴私信问我线程和线程池这一块的问题,说自己在面试的时候老是被问到这一块的问题,被问的很头疼。前几天看到后帮几个小伙伴解决了问题,但是问的人有点多我一个个回答也回答不过来... 查看详情

android程序员如何跨35岁这道坎?看完这篇你就懂了(代码片段)

...瓶颈是真的存在吗?在我看来,程序员之所以35岁是个坎,是有一定原因的。经济压力:这个年龄一般都有房贷、车贷、子女教育等,我认识很多同事,光房贷每月基本都要6K-7K,再算每月的生活支出&#x... 查看详情

2021百度java岗面试真题收录解析,看完这一篇你就懂了

阅读源码程序员每天都和代码打交道。经过数年的基础教育和职业培训,大部分程序员都会「写」代码,或者至少会抄代码和改代码。但是,会读代码的并不在多数,会读代码又真正读懂一些大项目的源码的,... 查看详情

java读取文件内容并且换行符,看完这一篇你就懂了

正文这次写一下springboot与redis的结合,这里使用的是redis集群模式(主从),主从环境的搭建,请参考redis集群搭建搭建完redis集群环境后,开始springboot之旅1、REDIS介绍redis的介绍及应用场景参考redis介绍2、... 查看详情

全网最经典26道spring面试题总结,看完这一篇你就懂了

本文框架如下第一部分,主要是在阅读代码过程中的日志和笔记;第二部分,主要介绍了Redis的主要框架,以及Redis是如何提供服务的,从一个最简单的命令开始讲起;第三部分,主要介绍Redis底层用作... 查看详情

深度分析:面试90%被问到的sessioncookietoken,看完这篇你就掌握了!(代码片段)

...Cookie的主要目的就是为了弥补HTTP的无状态特性。Session是什么客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个对象便是Session对象,存储结构为?ConcurrentHashMap。Session弥补了HTT 查看详情

企业为什么要制定精益标准工时?看完这篇就懂了!

...管理企业,从而获得更加广阔的发展空间。那企业为什么要制定精益标准工时?看完这篇就懂了!一、精益标准工时对生产管理的重要性在企业当中,精益标准工时是衡量一切工作的水准,具有很好的客观性... 查看详情

软件测试方法有多少种?看完这篇文章你就懂了

1.按照代码运行划分静态测试指不实际运行被测对象,而只是静态地检查程序代码、界面或文档中可能存在错误的过程代码测试:主要测试代码是否符合相应的标准和规范界面测试:主要测试软件的实际界面与需求中... 查看详情

疑惑?人工智能兴起为什么带火了python,看完这篇你就明白了

人工智能(缩写为AI)在计算机领域内,得到了愈加广泛的重视。并在机器人,经济政治决策,控制系统,仿真系统中得到应用。人工智能上电视著名的美国斯坦福大学人工智能研究中心尼尔逊教授对人工... 查看详情

阿里巴巴为什么能抗住90秒100亿?看完这篇你就明白了!

1、概述本文以淘宝作为例子,介绍从一百个并发到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计... 查看详情

看懂了这篇,你就懂了函数式接口(代码片段)

看懂了这篇-你就懂了函数式接口​函数式编程是一种编程规范或一种编程思想,简单可以理解问将运算或实现过程看做是函数的计算。Java8为了实现函数式编程,提出了3个重要的概念:Lambda表达式、方法引用、函数... 查看详情

oracle数据库为什么提示用户密码重置?看完你就懂了(代码片段)

作者简介作者:LuciferLiu,中国DBA联盟(ACDU)成员。目前主要从事OracleDBA工作,曾从事Oracle数据库开发工作,主要服务于生产制造,汽车金融等行业。现拥有OracleOCP,OceanBaseOBCA认证,擅长Oracle数据库运维... 查看详情

oracle数据库为什么提示用户密码重置?看完你就懂了(代码片段)

作者简介作者:LuciferLiu,中国DBA联盟(ACDU)成员。目前主要从事OracleDBA工作,曾从事Oracle数据库开发工作,主要服务于生产制造,汽车金融等行业。现拥有OracleOCP,OceanBaseOBCA认证,擅长Oracle数据库运维... 查看详情

mysql7种join理论,看完你就懂了(代码片段)

select*fromtbl_empainnerjointbl_deptbona.deptId=b.id;select*fromtbl_empaLEFTJOINtbl_deptbona.deptId=b.id;select*fromtbl_empaRIGHTJOINtbl_deptbona.deptId=b.id;select*fromtbl_empaLEFTJOINtbl 查看详情

用arraylist还是linkedlist?看完你就懂了!(代码片段)

本文旨在为Java开发这择合适的顺序数据结构提供指导。ArrayList和LinkedList是Java集合框架中用来存储对象引用列表的两个类。ArrayList和LinkedList都实现List接口。首先,让我们了解一下它们最重要的父接口——List。1.List接口列表(lis... 查看详情

python装饰器听了n次也没印象,读完这篇你就懂了

参考技术A装饰器其实一直是我的一个"老大难"。这个知识点就放在那,但是拖延症。。。其实在平常写写脚本的过程中,这个知识点你可能用到不多但在面试的时候,这可是一个高频问题。所谓的装饰器,其实就是通过装... 查看详情

用arraylist还是linkedlist?看完你就懂了!(代码片段)

本文旨在为Java开发这择合适的顺序数据结构提供指导。ArrayList和LinkedList是Java集合框架中用来存储对象引用列表的两个类。ArrayList和LinkedList都实现List接口。首先,让我们了解一下它们最重要的父接口——List。1.List接口列表&... 查看详情