CDN与DNS原理和应用

一. CDN

1. 概念:

Content Delivery Network,内容分发网络,使用户可以就近取得所需的内容,是一种提高用户访问速度的技术。

在大中型公司里面,CDN 的应用非常的普遍,大公司为了提供更稳定的 CDN 服务会选择自建 CDN,而大部分公司基于成本的考虑还是会选择专业的 CDN 厂商,网宿、阿里云、腾讯云、
蓝汛等等。

2. CDN加速原理和应用:
  1. 内容缓存
  2. 分布在全国各地的网络节点
  3. 多线路(联通、移动、电信)支持(减少跨网访问)
3. 适用范围
  • 静态和更新频率低的内容更适用
  • 数据流量大的产品更适用 (视频网站、直播网络等)
4. 如何接入CDN?

要搭建一个 CDN 系统需要考虑哪两点:

  1. 如何将用户的请求映射到 CDN 节点上;
  2. 如何根据用户的地理位置信息选择到比较近的节点;

如何做到第一点呢?这就需要依靠 DNS 来帮我们解决域名映射的问题了。
DNS(Domain Name System,域名系统)实际上就是一个存储域名和 IP 地址对应关系的分布式数据库。而域名解析的结果一般有两种,一种叫做A 记录,返回的是域名对应的 IP 地址;另一种是CNAME 记录,返回的是另一个域名,也就是说当前域名的解析要跳转到另一个域名的解析上。

比如你的公司的一级域名叫做 example.com,那么你可以给你的图片服务的域名定义为“img.example.com”,然后将这个域名的解析结果的 CNAME 配置到 CDN 提供的域名上,比如uclound 可能会提供一个域名是“80f21f91.cdn.ucloud.com.cn”这个域名。这样你的电商系统使用的图片地址可以是“http://img.example.com/1.jpg”。用户在请求这个地址时,DNS 服务器会将域名解析到 80f21f91.cdn.ucloud.com.cn 域名上,然后再将这个域名解析为 CDN 的节点 IP,
这样就可以得到 CDN 上面的资源数据了。

当你在浏览器输入一个域名,首先通过DNS解析出IP,然后这个IP通过网络打到目标服务器上。
同理,如果给某一个应用增加CDN服务,首先你需要给你当前的域名开通CDN服务,然后在你的域名解析设置后台添加一条CDN专用的DNS解析配置 ,这条解析配置会让域名被解析之后指向一个CDN网络专用的处理DNS请求的服务器。这个服务器会根据当前系统负载等情况给你返回一条合适的链路。

参考链接:https://www.bilibili.com/video/BV12T4y1P7Fh/?spm_id_from=333.337.search-card.all.click&vd_source=4c263677a216945c0d21ca65ee15a5f9

5. CDN回源

回源是指浏览器访问CDN集群上静态资源时,文件缓存过期,直接穿透CDN集群而直接访问源站机器的形式。

6. CDN缓存 - 阿里云设置缓存过期时间

缓存过期时间指源站资源在CDN节点缓存的时长,达到预设时间,资源将会被CDN节点标记为失效资源。如果客户端向CDN节点请求的资源已经失效,CDN会回源站获取最新资源并缓存到CDN节点(这个过程是两条路线,第一条是客户端向源站请求资源,第二条是CDN回源站获取最新的资源并缓存到CDN上)。您可以根据业务需求,按目录或文件后缀名配置静态资源的缓存过期时间。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7. 揭秘CDN缓存加速访问网络原理
8. 总结:
1. 如何让用户的请求到达CDN节点

将用户的请求映射到 CDN 服务器上,是使用 CDN 时需要解决的一个核心的问题,而 CNAME 记录在 DNS 解析过程中可以充当一个中间代理层的角色,通过将你的域名解析到CDN提供的域名上,然后在根据CDN提供的域名映射到cdn服务器所在的IP上,这样就可以把将用户最初使用的域名代理到正确的 IP 地址上。如图:
在这里插入图片描述

2. 如何找到离用户最近的CDN节点

GSLB(Global Server Load Balance,全局负载均衡), 它的含义是对于部署在不同地域的服务器之间做负载均衡,下面可能管理了很多的本地负载均衡组件。它有两方面的作用:
一方面,它是一种负载均衡服务器,负载均衡,顾名思义嘛,指的是让流量平均分配使得下面管理的服务器的负载更平均;
另一方面,它还需要保证流量流经的服务器与流量源头在地缘上是比较接近的。
GSLB 可以通过多种策略实现,这里就先不一一展开。

有了 GSLB 之后,节点的解析过程变成了下图中的样子:
在这里插入图片描述

二. DNS

1. 概念:

Domain Name System,域名系统。将域名和IP地址做映射。
DNS本质是用于TCP/IP应用程序的数据库,该数据库中记录了域名和IP的对应关系,同时也是一种用于客户端和服务端通讯的应用层的计算机网络协议。计算机要将域名解析成IP(或者将IP反解成域名),需要先去询问DNS服务器的数据库,查询得到域名和IP的对应关系,才能开始使用IP地址进行计算机通讯。

2. DNS的特点:

DNS服务器具有分布式阶层式的特点。

全球有那么多的计算机,要让一台服务器记录所有的域名和IP的对应关系的数据库,那这台服务器肯定要炸了,因此人们想到了将这些庞大的数据库分布式地存储于不同的计算机中,让他们共同提供查询域名和IP的功能,目前全球共有13台根服务器,其中1台主根服务器,12台辅助根服务器;

同时为了方便管理这些域名,人们规定域名的命名采用分层的结构,即采用类似树状结构的命名方式。在这棵倒状树中,每个节点有一个最多63个字符的标识,树的最顶端的根用 . 来标识,从最底部的节点到最顶部的根节点的标识串联起来,不同节点的标识之间也用 . 来分割,这样的一组就表示一个完整的域名(FQDN),例如www.baidu.com.,不过人们通常将最后. 去掉,即www.baidu.com,这是不完整域名。
在这里插入图片描述

3. DNS理论知识
3.1 域名的层次结构

域名系统必须要保持唯一性。

为了达到唯一性的目的,因特网在命名的时候采用了层次结构的命名方法:

  1. 每一个域名(本文只讨论英文域名)都是一个标号序列(labels),用字母(A-Z,a-z,大小写等价)、数字(0-9)和连接符(-)组成
  2. 标号序列总长度不能超过255个字符,它由点号分割成一个个的标号(label)
  3. 每个标号应该在63个字符之内,每个标号都可以看成一个层次的域名。
  4. 级别最低的域名写在左边,级别最高的域名写在右边。

域名服务主要是基于UDP实现的,服务器的端口号为53。

关于域名的层次结构,如下图所示:

在这里插入图片描述

例如:
一个域名“www.baidu.com.”由4部分:第1部分“.”代表根服务器、第2部分“.com.”代表顶级域名服务器、第3部分“baidu.com.”代表域名所有者服务器、第4部分“www.baidu.com.”代表主机域名。
域名体系是一个分级体系,最高级是根服务器,最低级是本地服务器(如114.114.114.114),域名查询需要逐级递归查询。

说明:在第3部分中的域名所有者也就是是我们平常所说的一级域名,而如果自己通过云解析设置一个zhidao.baidu.com,则这个就变成了二级域名。

4. DNS工作原理:

在这里插入图片描述
DNS的解析过程中最重要的两个概念是递归查询迭代查询

当你在浏览器输入www.baidu.com的时候,先查询浏览器的缓存中是否有域名和IP的映射关系,如果没有则查询本地hosts文件,然后查询客户端DNS缓存(如果存在客户端缓存的话),下一步是本地DNS服务器,检查本地DNS服务器的hosts文件和DNS缓存,如果还没有则下一步是ISP,ISP检查缓存还是没有;则ISP向根服务器发起询问请求,根服务器向ISP返回com.的IP地址,ISP向com.发起询问请求,com.向ISP返回baidu.com.的IP,则ISP再向baidu.com.发起询问,刚好baidu.com.有www.baidu.com.的IP,向ISP返回该IP地址,ISP得到www.baidu.com的IP后,将IP返回本地DNS服务器,本地DNS服务器在返回给客户端。这样完成整个流程。

DNS中的递归和迭代的重要区别是:递归是查询者变化,迭代是查询者不变。

5.DNS解析的过程:

在这里插入图片描述
当一个用户在地址栏输入www.taobao.com时,DNS解析有大致十个过程,如下:

  1. 浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。(DNS中的TTL(Time To Live)表示一条域名解析记录在DNS服务器上的缓存时间)。

  2. 如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts的文件来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址.
    在这里插入图片描述
    但是这种操作系统级别的域名解析也会被很多黑客利用,通过修改你的hosts文件里的内容把特定的域名解析到他指定的ip地址上,造成所谓的域名劫持。所以在windows7中将hosts文件设置成了readonly,防止被恶意篡改。

  3. 如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)(也就是你的运营服务商)来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。

  4. 如果LDNS仍然没有命中,就直接跳到Root Server 域名服务器请求解析

  5. 根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址。

  6. 此时LDNS再发送请求给上一步返回的gTLD

  7. 接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器。

  8. Name Server根据映射关系表找到目标ip,返回给LDNS

  9. LDNS缓存这个域名和对应的ip

  10. LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束

参考链接:https://www.imooc.com/learn/917
参考链接:https://blog.csdn.net/m0_37812513/article/details/78775629

参考链接: 小册


CDN加速原理以及缓存过程分析 - 分享版

一. 概念

CDN:Content Delivery Network,内容分发网络,使用户可以就近取得所需的内容,是一种提高用户访问速度的技术。
在大中型公司里面,CDN 的应用非常的普遍,大公司为了提供更稳定的 CDN 服务会选择自建 CDN,而大部分公司基于成本的考虑还是会选择专业的 CDN 厂商,如:京东云、阿里云、腾讯云、蓝汛等等。

二. 接入CDN的优势

  • 提高用户访问速度
  • 降低服务器压力(动静分离)
  • 系统稳定性更有保障

三. 如何接入CDN

需要解决两个核心问题:

  1. 如何将用户的请求映射到 CDN 专用网络节点上?
  2. 如何根据用户的地理位置信息选择到比较近的节点?

DNS(Domain Name System,域名系统)实际上就是一个存储域名和 IP 地址对应关系的分布式数据库。而域名解析的结果一般有两种,一种叫做A 记录,返回的是域名对应的 IP 地址;另一种是CNAME 记录,返回的是另一个域名,也就是说当前域名的解析要跳转到另一个域名的解析上。

在这里插入图片描述

GSLB(Global Server Load Balance,全局负载均衡), 它的含义是对于部署在不同地域的服务器之间做负载均衡。GSLB有两方面的作用:一方面,它是一种负载均衡服务器,指的是让流量平均分配使得下面管理的服务器的负载更平均;另一方面,它还需要保证流量流经的服务器与流量源头在地缘上是比较接近的。

有了 GSLB 之后,节点的解析过程变成了下图中的样子:
在这里插入图片描述

四. CDN缓存

缓存过期时间指源站资源在CDN节点缓存的时长,达到预设时间,资源将会被CDN节点标记为失效资源。如果客户端向CDN节点请求的资源已经失效,CDN会回源站获取最新资源并缓存到CDN节点。回源是指浏览器访问CDN集群上静态资源时,文件缓存过期,直接穿透CDN集群而直接访问源站机器的形式。
在这里插入图片描述

五. 缓存过程分析

浏览器与服务器通信的方式为应答模式,即:浏览器发起HTTP请求 – 服务器响应该请求,那么浏览器怎么确定一个资源该不该缓存,如何去缓存呢?浏览器第一次向服务器发起该请求拿到请求结果后,将请求结果和缓存标识存入浏览器缓存,浏览器对于缓存的处理是根据第一次请求资源时返回的响应头来确定的。具体过程如下图:
在这里插入图片描述

由上图我们可以知道:

  • 浏览器每次发起请求,都会先在浏览器缓存中查找该请求的结果以及缓存标识
  • 浏览器每次拿到返回的请求结果都会将该结果和缓存标识存入浏览器缓存中

以上两点结论就是浏览器缓存机制的关键,它确保了每个请求的缓存存入与读取。

六. 缓存的分类

通常浏览器缓存策略分为两种:强缓存和协商缓存,并且缓存策略都是通过设置 HTTP Header 来实现的。

1. 强缓存:

定义:强制缓存,只要在有效的时间范围内就不会去服务器发送请求索取资源,而是直接用本地缓存的。

主要http字段:

  • Expires Expires: Mon, 25 Jun 2029 06:17:58 GMT
  • Cache-Control Cache-Control: max-age=315360000

Expires和Cache-Control的区别:

  • Expires指的是服务器的时间,而客户端时间和服务器时间可能不一致,因为有传输过程的时间消耗,而导致的不准,所以后来又有了Cache-Control。
  • Cache-Control指浏览器时间,并以这个为准,其中max-age的单位为秒。
  • 具体是存在Expires字段还是Cache-Control字段,根据服务器的配置来定,如果都存在,那么以Cache-Control为准。
2. 协商缓存:

定义:强制缓存的时间过期了,那么就需要去服务器去问一下,这个缓存的文件到底还能不能用。

  • Last-Modified: Fri, 22 Feb 2019 06:52:34 GMT
  • If-Modified-Since

当服务器下发一个文件时,会在响应头返回一个Last-Modified字段,也就是一个时间戳,当强缓存过期时,浏览器发送请求的时候就会拿着If-Modified-Since这个字段去向服务器问这个缓存的文件还能不能继续使用,这个字段的时间戳是和下发的时间戳一样的,如果能用,OK,继续用缓存的,否则需要服务器重新下发。

缺点:

  • 如果修改时间变了,但是内容没有变,还得需要重新下发。
  • Last-Modified 的单位时间是秒,如果文件在 1 秒内改变了多次,那么这时候的 Last-Modified 并不会体现出来被修改过。

替代方案:

  • Etag Etag: “196f-582760919f080”
  • If-None-Match

Etag是服务器下发文件的时候给请求头返回的一个字段,其值为一段哈希值。当强缓存过期时,浏览器拿着If-None-Match 这个字段,其实也就是Etag的哈希值去问服务器内容有没有变化,如果有变化(即两个哈希值不一样了),那么就需要重新下发文件了,否则继续使用之前缓存的。

服务端缓存是否可用逻辑代码实现:
let http = require('http');
let path = require('path');
let fs = require('fs');
let express = require('express');
let md5 = require('md5');

let app = new express();

// app.set('views', path.join(__dirname, 'views'));
// app.set('view engine', 'ejs');

app.get('/', (req, res) => {
    res.sendFile(path.resolve(__dirname, './public/index.html'));
})
app.get('/style.css', (req, res) => {
    let relativePath = path.resolve(__dirname, 'public/style.css');
     //last-modified-since
     fs.stat(relativePath, (err, stat) => {
        if (err) return;
        let ifModifiedSince = req.headers['if-modified-since'];
        let mtime = stat.mtime.toUTCString();
        if (ifModifiedSince == mtime) {//文件最后一次修改时间(文件虽然修改,但是里面的内容可能没有发生变化)
            res.writeHead(304, 'Not Modified');
            res.end();
        } else {
            res.setHeader('Last-Modified', mtime);//if-modified-since
            //res.setHeader('Cache-Control', 'public,max-age=10');//设置最大缓存时间限制
            //res.setHeader('Expires',new Date(Date.now() + 30000));
            res.writeHead(200, 'OK');
            res.end(content);
        }

    })

    //etag
    fs.readFile(relativePath, (err, content) => {
        let etag = md5(content); //可以以文件的内容是否修改对文件进行标记
        let ifNoneMatch = req.headers['if-none-match'];
        if (ifNoneMatch == etag) {
            res.writeHead(304, 'Not Modified');
            res.end();
        } else {
            res.setHeader('ETag', etag); //if-none-match
            //res.setHeader('Cache-Control', 'public,max-age=10');//设置最大缓存时间限制(强制缓存)
            //res.setHeader('Expires',new Date(Date.now() + 30000));
            //为了兼容低版本HTTP通常也会设置响应头Expires,Expires的时间为GMT时间格式
            res.writeHead(200, 'OK');
            res.end(content);
        }
    })
})

app.listen(3000);

七. dns解析失败问题分析

我测了运营商客户经理给的河南电信dns 222.85.85.85是正常的,之前截图里面用户的dns 219.150.188.229 和222.88.88.88确实不行

  1. 查看本机IP地址:
    Mac下,在shell命令行输入ifconfig -a,找到en0,en代表以太网
    在这里插入图片描述
    另外,也可以在网络设置中查看:
    在这里插入图片描述

  2. 查看本地IP和DNS的网页小工具 :https://nstool.netease.com/

  3. nslookup指令

    查看当前域名的dns服务器和当前域名的ipv4:nslookup www.baidu.com

    如果有指定的dns服务器,则用指定的dns服务器解析域名:
    nslookup www.baidu.com 114.114.114.114

    其中:
    114.114.114.114 ---- 114.114.114.114是国内移动、电信和联通通用的dns
    8.8.8.8 -----8.8.8.8是Google提供的公共DNS服务器地址,Google将这个DNS服务器地址开放给了全球用户,并保证了其可用性和可靠性。

  4. dns拨测
    https://boce.aliyun.com/ 切换到dns选项

学习资源:https://www.bilibili.com/video/BV1AF41167E5/?spm_id_from=333.337.search-card.all.click&vd_source=4c263677a216945c0d21ca65ee15a5f9

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

. . . . .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值