关于CNAME与Aliases的解析问题

最近学习DNS相关的知识,看到了CNAME的相关问题,这里作个总结:web

CNAME也就是Canonical Name(规范名称),Aliases(别名)。缓存

这个很好理解,以www.baidu.com为例。在咱们在ping www.baidu.com时会发现ping的结果以下:服务器

C:\Windows\System32>ping www.baidu.com
正在 Ping www.a.shifen.com [119.75.216.20] 具备 32 字节的数据:
来自 119.75.216.20 的回复: 字节=32 时间=3ms TTL=50
来自 119.75.216.20 的回复: 字节=32 时间=3ms TTL=50
来自 119.75.216.20 的回复: 字节=32 时间=3ms TTL=50
来自 119.75.216.20 的回复: 字节=32 时间=3ms TTL=50
119.75.216.20Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 3ms,最长 = 3ms,平均 = 3ms

很明显这里能够看出www.baidu.com是www.a.shifen.com的别名。
那么实际的查询过程是什么样子的呢?
我的认为查询过程为(假设如今缓存中没有相关内容):
1. 客户机提交查询www.baidu.com的A记录的请求给本地域名服务器,本地域名服务器则会向
根域名服务器(假设为d.root-servers.net)提交www.baidu.com这个域名的A记录查询
请求,而后d.root-servers.net返回给本地域名服务器一个或多个能够处理.com域的顶
级域名服务器(假设为j.gtld-servers.net)的A记录。
2. 本地域名服务器向j.gtld-servers.net提交关于www.baidu.com的A记录的查询请求,然
后j.gtld-servers.net返回一个或者多个能够处理baidu.com这个域的域名服务器(假设
为ns1.baidu.com)的A记录给本地域名服务器。
3. 本地域名服务器向ns1.baidu.com提交关于www.baidu.com的A记录的查询请求,这时
ns1.baidu.com发现他的记录信息以下:
www.baidu.com. 1200 IN CNAME www.a.shifen.com.
a.shifen.com. 86411 IN NS ns1.a.shifen.com.
a.shifen.com. 86411 IN NS ns5.a.shifen.com.
a.shifen.com. 86411 IN NS ns3.a.shifen.com.
a.shifen.com. 86411 IN NS ns6.a.shifen.com.
也就是说他不能找到www.baidu.com这台主机的IP地址,这时候他就会查看www.baidu.com是否是经过cname获得的Aliases,通过查询发现确实是这样,此时
ns1.baidu.com服务器会将www.baidu.com 1200 IN CNAME www.a.shifen.com这条记
录放入响应报文Rsponse1中,同时他会在他本机上启动一个关于 www.a.shifen.com的A记
录的查询请求,而后将查询结果:
a.shifen.com. 86411 IN NS ns1.a.shifen.com.
a.shifen.com. 86411 IN NS ns5.a.shifen.com.
a.shifen.com. 86411 IN NS ns3.a.shifen.com.
a.shifen.com. 86411 IN NS ns6.a.shifen.com.
同时添加进入刚才的响应报文Rsponse1中,一并返回给本地域名服务器。
4. 本地域名服务器接下来根据刚才的响应报文会找ns1.a.shifen.com去查询
www.a.shifen.com的A记录,这时候ns1.a.shifen.com就会返回给本地域名服务器关于
www.a.shifen.com 的A记录也就是202.108.22.5之类的信息,而后本地域名服务器就会将
结果返回给客户了。客户就可使用获得的IP地址与对应的主机创建链接了。
以上过程只是我的对DNS查询过程的简单分析和理解。
RFC1034 3.6.2中也能够找到相关的描述以下(附上我拙劣的翻译,呵呵将就着看吧):dom

CNAME RRs cause special action in DNS software. When a name server fails to find a desired RR in the resource set associated with the domain name, it checks to see if the resource set consists of a CNAME record with a matching class. If so, the name server includes the CNAME record in the response and restarts the query at the domain name specified in the data field of the CNAME record. The one exception to this rule is that queries which match the CNAME type are not restarted.svg

cname资源记录会引发dns软件特殊的处理动做。当一个域名服务器不能解释所要请求的资源记录时,他会查看这个请求的资源记录是否包含了一个cname记录。若是是,那么这个域
名服务器将会将对应的cname放入响应报文中,同时启动一次针对数据域中关于cname的记录
的查询。学习

For example, suppose a name server was processing a query with for USC- ISIC.ARPA, asking for type A information, and had the following resource records:
USC-ISIC.ARPA IN CNAME C.ISI.EDU
C.ISI.EDU IN A 10.0.0.52
Both of these RRs would be returned in the response to the type A query, while a type CNAME or * query should return just the CNAME.
好比,假设一个域名服务程序在处理一个关于USC-ISIC.ARPA的A记录的查询,同时他拥
有以下的资源记录:
USC-ISIC.ARPA IN CNAME C.ISI.EDU
C.ISI.EDU IN A 10.0.0.52ui

以上两条资源记录都会包含在针对A记录查询的响应报文中。若是查询报文的类型是CNAME的
话,那么查询结果就只包含关于CNAME的记录。this