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

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

这个很好理解,以为例。在我们在Ping 时会发现PING的结果如下:

ping
PING (202.108.22.142) 56(84) bytes of data.
64 bytes from xd-22-142-a8.bta.net.cn (202.108.22.142): icmp_seq=1 ttl=128 time=1.69 ms
64 bytes from xd-22-142-a8.bta.net.cn (202.108.22.142): icmp_seq=2 ttl=128 time=2.01 ms
64 bytes from xd-22-142-a8.bta.net.cn (202.108.22.142): icmp_seq=3 ttl=128 time=1.61 ms
64 bytes from xd-22-142-a8.bta.net.cn (202.108.22.142): icmp_seq=4 ttl=128 time=1.96 ms

很明显这里可以看出是的别名。

那么实际的查询过程是什么样子的呢?

个人认为查询过程为(假设现在缓存中没有相关内容):

1.客户机提交查询的A记录的请求给本地域名服务器,本地域名服务器则会向

根域名服务器(假设为d.root-servers.net)提交这个域名的A记录查询

请求,然后d.root-servers.net返回给本地域名服务器一个或多个可以处理.com域的顶

级域名服务器(假设为j.gtld-servers.net)的A记录。

2.本地域名服务器向j.gtld-servers.net提交关于的A记录的查询请求,然

后j.gtld-servers.net返回一个或者多个可以处理baidu.com这个域的域名服务器(假设

为ns1.baidu.com)的A记录给本地域名服务器。

3.本地域名服务器向ns1.baidu.com提交关于的A记录的查询请求,这时

ns1.baidu.com发现他的记录信息如下:

.  1200 IN CNAME .
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.

也就是说他不能找到这台主机的IP地址,这时候他就会查看是不是通过cname得到的Aliases,经过查询发现确实是这样,此时

ns1.baidu.com服务器会将 1200 IN CNAME 这条记

录放入响应报文Rsponse1中,同时他会在他本机上启动一个关于 的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去查询

的A记录,这时候ns1.a.shifen.com就会返回给本地域名服务器关于

的A记录也就是202.108.22.5之类的信息,然后本地域名服务器就会将

结果返回给客户了。客户就可以使用得到的IP地址与对应的主机建立连接了。

以上过程只是个人对DNS查询过程的简单分析和理解。

RFC1034 3.6.2中也可以找到相关的描述如下(附上我拙劣的翻译,呵呵将就着看吧):

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.

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.52

以上两条资源记录都会包含在针对A记录查询的响应报文中。如果查询报文的类型是CNAME的

话,那么查询结果就只包含关于CNAME的记录。