DNS基础
DNS的名字空间和Unix的文件系统相似,也具有层次结构,如下图所示:
每个节点有最多63个字符串的标识,根节点是没有任何标识的特殊节点。 命名标识一律不区分大小写,命名树上任何一个节点的域名就是把从该节点到最高层的标识符串连起来,中间使用”.”来作分隔符。 域名树中的每一个节点必须有一个唯一的域名,但域名树中的不同节点可使用相同的标识。
以”.”结尾的域名称为绝对域名或完全合格的域名FQDN(Full Qualified Domain Name),例如ruleless.net.。 如果一个域名不以”.”结尾,则认为该域名是不完全的,如何使域名完整依赖于使用的DNS软件。
顶级域被分为三个部分:
- 用作逆向DNS解析的特殊域(arpa)
- 7个3字符长的普通域
- 2字符串长度的国家域
7个普通域的划分含义如下:
com
商业组织edu
教育机构gov
其他美国政府部门int
国际组织mil
美国军事网点net
网络org
其他组织
DNS报文格式
DNS定义了一个用于查询和响应的报文格式,如下:
标识字段由客户端程序设置并由服务器返回,客户程序通过它来确定响应和查询是否匹配。 16bit的标志字段被划分为若干个子字段,如下:
各字段含义如下:
QR
0表示查询报文,1表示响应报文opcode
0表示标准查询,1表示反向查询,2表示请求服务器状态AA
表示”授权回答”TC
表示”可截断的”,使用UDP时,它表示当应答的总长度超过512字节时,只返回前512个字节RD
表示”期望递归”。该bit能在一个查询中设置,并在响应中返回。 这个标志告诉名字服务器必须处理这个查询,也称一个递归查询。 如果该位为0,且被请求的名字服务器没有一个授权回答,它就返回一个能解答该查询的其他名字服务器列表。 这称为迭代查询。RA
表示”可用递归”。如果名字服务器支持递归查询,则在响应中将该bit设为1(zero)
必须填0rcode
返回字段码。0表示没有差错,3表示名字差错。名字差错只能从一个授权名字服务器返回,它表示在查询中指定的域名不存在。
随后的4个16bit字段表示后续变长字段中包含的条目数。对于查询报文,问题数通常为1,而其他3项均为0。 类似的,对于应答报文,回答数至少是1。
DNS报文中的问题部分
每个问题的格式如下:
查询名是要查找的名字,它是一个或多个标识符的序列。 每个标识符的首字节存储标识符长度,随后是标识符串,长度为0的标识符是根标识符。
每个问题有一个查询类型,而每个资源记录也有一个类型。前者是后者的超集。 下面列举了一些常用的类型,如果未做特殊说明,则可同时用于问题和资源记录。
A
值=1,IP地址NS
值=2,名字服务器CNAME
值=5,规范名称PTR
值=12,指针记录HINFO
值=13,主机信息MX
值=15,邮件交换记录AXFR
值=252,对区域转换的请求(只可用于问题)*或ANY
值=255,对所有记录的请求(只可用于问题)
在问题中最常用的查询类型为A类型,表示期望获得查询名的IP地址。
查询类通常为1,表示互联网地址(某些站点也支持其他非IP地址)。
DNS响应报文中的资源记录部分(Resource Record)
DNS报文中的最后三个字段(资源记录/授权的资源记录/额外的资源记录)均采用一种称为资源记录(Resource Record)的相同格式。
域名用于记录中资源数据对应的名字,它的格式与查询名一致。
类型字段已在前面讨论,类通常为1,指Internet数据。
生存时间是客户程序保留该资源记录的秒数。资源记录通常的生存时间为2天。
资源数据的格式由类型确定,例如,A记录的资源数据是4字节的IP地址。
«Previous: Linux平台下的网络工具