DNS服务:采用服务器/客户端(C/S)的方式工作。当客户端程序要通过一个主机名称访问网络中的一台主机时,它首先需要得到这个主机名称所对应的IP地址,此时就需要用到DNS,来进行域名转换为网络地址的作用
进行DNS服务查询之前,会先进行系统DNS缓存 > HOSTS文件
,然后会请求 DNS服务器中的缓存
,如果没有就开始迭代DNS查询
win查询dns缓存:ipconfig/displaydns
win清除dns缓存ipconfig/flushdns
DNS报文格式:
首先看看Header段中每个字段的含义:
DNS ID号(DNS ID Number): 用来对应DNS查询和DNS响应
查询/响应(Query/Response, QR): 用来指明这个报文是DNS查询还是响应,占1个比特位。为1代表响应,0代表查询
操作代码(OpCode):用来定义消息中请求的类型
权威应答(Authoritative Answer, AA):这个比特位在响应的时候才有意义。则说明这个响应是由域内权威域名服务器发出的
截断(Truncation, TC):用来指出报文比允许的长度还要长,导致被截断
期望递归(Recursion Desired, RD):如果设置了RD,就建议域名服务器进行递归解析,递归查询的支持是可选的。
支持递归(Recursion Available, RA): 当响应中设定了这个值,说明域名服务器支持递归查询
保留(Z): 未使用,用0表示
响应代码(Response Code): 在DNS响应中指明错误,占4个比特位。
问题计数(Question Count): 问题区段中的问题记录数
回答计数(Answer Count):回答区段中的回答记录数
域名服务计数(Name Server Count):权威区段中的记录数
额外记录数(Additional Records Count):在额外信息区段中的记录数
问题区段(Question Section):包含有被发送到DNS服务器的一条或者多条信息
回答区段(Answer Section):含有用来回答查询的一条或者多条资源记录
权威区段(Authority Section):包含权威域名服务器的资源记录
额外信息区段(Additional Information Section): 包含资源记录且大小可变的区段。
分析数据包:
DNS请求数据包:
DNS应答数据包:
需要注意的是:上面的抓到的只是客户端与DNS服务器114.114.114.114之间的递归查询,DNS服务器114.114.114.114还进行了之后的迭代查询
1、递归查询
客户计算机向本地域名服务器的查询一般采用的是递归查询。如果客户机所询问的本地域名服务器无法提供被查询域名的IP地址,那么本地域名服务器就会以DNS客户的身份,向其它根域名服务器继续发出查询请求的报文。
2、迭代查询
本地域名服务器向根域名服务器的查询通常采用的是迭代查询。当根域名服务器收到本地域名服务器的迭代查询请求的报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器“下一步应该向哪个域名服务器进行查询”。然后本地域名服务器就进行后续的查询。
使用wireshark走一遍流程,机器为ubuntu,用linux的dig命令来进行查询下dig www.adexx.xyz +trace
ubuntu向本地DNS服务器发送请求,向根域服务器的ns记录
返回信息如下:
然后向其中的DNS服务器的A记录(自己抓包发现还有请求AAAA的记录)
都拿到了A记录和AAAA记录之后,又向其中DNS服务器的A记录进行DNS查询www.adexx.xyz
的A记录
返回包中,它会返回xyz域的ns记录
然后挑选其中的一条记录z.nic.xyz
,请求dns请求A记录
返回包中,它会返回z.nic.xyz
的A记录
然后请求其IP,尝试获取www.adexx.xyz
的A记录
返回包中却返回了其他服务器的ns记录
然后又继续请求其中的dns服务器(ns记录),请求它的A记录
然后请求dns服务器的A记录,询问www.adexx.xyz
的A记录
最后该dns服务器返回www.adexx.xyz
的A记录
总结:
1、客户端先去向本地DNS服务器请求 根域的NS记录
2、本地DNS服务器查询完之后,向客户端返回了根域的NS记录
3、然后客户端会向本地DNS服务器请求---->这些根域的NS记录中的DNS服务器的A记录
4、本地DNS服务器返回给客户端---->这些根域的NS记录中的DNS服务器的A记录
5、接着客户端就开始向这些DNS服务器请求指定的域名www.adexx.xyz
的A记录
....接着就如上的操作,返回类似.xyz的域名的ns记录 ----> 这些.xyz域的NS记录中的DNS服务器的A记录