- DNS域名系统是应用层协议,可以用于UDP或TCP,通常使用 UDP。
DNS的概念和功能见RFC 1034,DNS的规范和实现见RFC 1035。
- DNS域名的层次结构类似于Unix文件系统,各个分支可以有名称相同的结点,但结点是唯一确定的,也可以用别名连接两个结点。
- 顶级域名包括用于地址转换的arpa、3字节的组织域(.com, .org 等)、2字节的地理域(.cn, .uk等,地理代码基于ISO 3166)
- IP到域名的转换转换查询通过DNS服务器的服务实现,DNS缓存并更新域名信息,与其他DNS主机使用分布式交互信息。DNS在UDP或者TCP的知名端口均为 53。
- DNS服务器的根域为根服务器,由美国NIC负责管理或者委托授权。根服务器用于管理全球互联网上的IP分配、域名分配、DNS查询等。根服务器列表可以从NIC的ftp获取或者向nic@sri-nic.arpa发送邮件获取。
- DNS服务器设置在/etc/resolv.conf,此配置文件也可能包含域名映射记录。
- 查询DNS的命令:
host <主机名>
- DNS报文包括首部、查询及三个RR资源记录信息组成。
- 首部共12字节,格式为:
标识(2字节)–标志(2字节)–问题数(2字节)–资源记录数(2字节)–授权资源记录数(2字节)–附加资源记录数(2字节)
标志字段包括(从高位到低位):
- QR(1 bits):查询(0)和应答 (1);
- opcode(4 bits):标准查询(0)、反向查询(1)、服务器状态请求 (2);
- AA(授权回答,1 bits):
- TC(报文可截断,1 bits):为1则此位有效;
- RD(递归要求,1 bits):置0且被请求的DNS服务器没有授权回答,则返回能解答该查询的其他DNS服务器列表;
- RA(递归可用,1 bits):若DNS服务器支持递归查询,在响应中此位置 1;
- left 0 (3 bits):3位未使用,必须置 0;
- rcode (4 bits):通常设置为0(无错误)。若值为3表示域名错误,其值只能从授权DNS服务器返回。
问题数用于查询报文,通常为1,后面三个都为 0;
资源记录通常用于应答报文,回答至少为1,剩下两项可以为0或非 0;
查询名: 在各子域名前包含其长度,并以0结束,
如www.google.cn的报文中的格式应为 3www6google2cn0
类型: 大约有20种,最常用的是A,表示期望获得查询明的 IP;
PTR表示获得一个IP对应的域名,等等。在host命令中可以用-t选项指明这个参数。
类别: 通常为1,表示为互联网IP地址。
* DNS报文中的响应部分(均采用资源记录RR的格式)
域名: 格式于查询部分的查询明相同;
类型: 和查询的类型相同;
类别: 和查询的类别相同,通常是 1;
生存时间: 客户程序保留该记录的秒数,通常为2 天;
资源数据长度: 依赖于类型字段的值,如A类型(IP地址)则为 4;
资源数据: 如A类型(IP地址)则为4个字节的IP地址。
对域名www.google.com的查询,-t a表明查询类型为A
root@mjxian-ubuntu ~
# host -t a www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com is an alias for www-china.l.google.com.
www-china.l.google.com has address 64.233.189.104
tcpdump监听的输出:
13:35:18.761306 IP ubuntu.1061 > dart.scu.edu.cn.domain: 60353+ A? www.google.com. (32)
13:35:18.762104 IP dart.scu.edu.cn.domain > ubuntu.1061: 60353 3/6/6 CNAME www.l.google.com.,[|domain]
13:35:18.762770 IP ubuntu.1062 > dart.scu.edu.cn.domain: 11166+ PTR? 39.32.115.202.in-addr.arpa. (44)
13:35:18.763252 IP dart.scu.edu.cn.domain > ubuntu.1062: 11166* 1/2/2 (140)
dart.scu.edu.cn则为所请求的DNS服务器,其IP为 202.115.32.39, 后缀domain表示采用DNS服务的知名端口 53。
第1行中60353为查询报文的标识,+号表示要求递归,A?表示查询类型,查询名字为www.163.com,报文长度 32。
第2行中3/3/6表示回答RR、授权RR和附加信息RR的数量。CNAME的意思是该域名用了别名指向,[|domain]暂时不明……
第3、4行是tcpdump监听对DNS发出的额外请求,如果采用-n选项则没有这两行。
第3行要求得到202.115.32.39的主机域名,这主要是要求知道发送第2行数据的IP属于哪个主机。
第4行为对第3行的回答,*号表示授权回答;
用于对于指定的IP,要求知道其域名。采用in-addr.arpa域名进行转换。
例如要查询202.115.32.129的主机域名,其在DNS中查询的名字则为129.32.115.205.in-addr.arpa。其转换一般由相关的socket函数完成。
采用in-addr.arpa域主要是为了可以用一个单独的DNS分支查询IP到主机的映射,而不用遍历整个DNS树(从com到net再到 org….)。
查询
root@mjxian-ubuntu ~
# host -t ptr 202.115.32.129
129.32.115.202.in-addr.arpa domain name pointer wjl.scu.edu.cn.
tcpdump的输出:
13:13:20.531126 IP ubuntu.1052 > dart.scu.edu.cn.domain: 17925+ PTR? 129.32.115.202.in-addr.arpa. (45)
13:13:20.531944 IP dart.scu.edu.cn.domain > ubuntu.1052: 17925* 1/2/2 (145)
用于无盘系统的引导,BOOTP比RARP更易于实现。略。