在以前,人们用 IP 进行互访,后来发现 IP 太多不好记忆,便有了域名,比如 www.baidu.com,你一看就知道是百度搜索引擎,而不需要管他的服务器 IP 是多少,但是在最开始通信的时候,路由器不认识域名,只认得 IP 啊,要怎么去获得对应的 IP 呢,这时候有了域名解析,就是去请求网络上的 DNS 服务器,让他们来告诉你这个域名对应的 IP 是多少,至于请求 DNS 解析的详细过程,这里不赘述。
在说 CNAME 之前,要提到一个东西叫 A 记录:
A 记录
A 记录,即 Address 记录,它并不是一个 IP 或者一个域名,我们可以把它理解为一种指向关系:
域名 www.xx.com → 111.111.111.111
主机名 DD → 222.222.222.222
也就是当你访问这些域名或者主机名的时候,DNS 服务器上会通过 A 记录会帮你解析出相应的 IP 地址,以达到后续访问目的。所以 A 记录是 IP 解析,直接将域名或主机名指向某个 IP。
CNAME
CNAME 记录,也叫别名记录,相当于给 A 记录中的域名起个小名,比如 www.xx.com 的小名就叫 www.yy.com 好了,然后 CNAME 记录也和 A 记录一样,是一种指向关系,把小名 www.yy.com 指向了 www.xx.com,然后通过 A 记录,www.xx.com 又指向了对应的 IP:
www.yy.com → www.xx.com → 111.111.111.111
这样一来就能通过它的小名直接访问 111.111.111.111 了。
这时候有人问:这不多了一步嘛,不嫌麻烦?
假如这个时候我又想给原域名取几个小名,分别叫 www.cc.com 和 www.kk.com 那么存在下列指向关系:
www.yy.com → www.xx.com → 111.111.111.111
www.cc.com → www.xx.com → 111.111.111.111
www.kk.com → www.xx.com → 111.111.111.111
突然服务器的 IP 地址因为一些不可描述的原因要换了,不再是 111.111.111.111 了,换成了 333.333.333.333,这时候你发现,只要把 www.xx.com 的指向修改一下即可:
www.xx.com → 333.333.333.333
这时候你又发现了,原来他的小名不需要做更改,直接就能访问服务器,因为他们都只指向了 www.xx.com,服务器 IP 改没改它们不管。
那么假如不用 CNAME,直接做 A 记录会怎样?
www.yy.com → 111.111.111.111
www.cc.com → 111.111.111.111
www.xx.com → 111.111.111.111
www.kk.com → 111.111.111.111
那么当 111.111.111.111 更改的时候,全部相关 A 记录指向关系都要做更改,这才叫麻烦。
CNAME 的应用
CNAME 常用于 CDN 加速上,下面举个例子。
假如你是 DD 公司老板,你公司中的一台 IP 为 1.1.1.1 的服务器,注册了域名为 www.dd.com,要对外提供客户访问。随着公司越做越大,访问量也越来越多,服务器顶不住了,你去找 CDN 提供商购买 CDN 加速服务,这个时候他们要求你的域名做个 CNAME 指向他们给你的一个域名叫 www.dd.cdn.com。
www.dd.com → www.dd.cdn.com
当用户访问 www.dd.com 的时候,本地 DNS 会获得 CDN 提供的 CNAME 域名:www.dd.cdn.com,然后再次向 DNS 调度系统发出请求,通过 DNS 调度系统的智能解析,把离客户端地理位置最近的(或者相对负载低的,主要看 CDN 那边智能解析的策略)CDN 提供商的服务器 IP 返回给本地 DNS,然后再由本地 DNS 回给客户端,让用户就近取到想要的资源(如访问网站),大大降低了延迟。
参考
https://blog.csdn.net/DD_orz/article/details/100034049