什么是DNS
DNS指的是域名系统,它在内部有一个存储域名和对应IP地址的数据库,用于将网站的域名转换为服务器的具体IP地址。
例如,我们在浏览器打开baidu.com时,浏览器需要先请求DNS服务器获取域名baidu.com对应服务器的IP地址,然后浏览器与该IP建议消息通道来传输数据。
我们可以在系统命令行中通过nslookup命令来查询某个域名的DNS的记录,如下图所示:
这里我们指定使用阿里云的DNS服务器 223.5.5.5 来查询域名baidu.com映射的IP地址。从图中可以看到,查询结果返回了baidu.com映射的两个IP地址。
接下来我们使用Wireshark来抓包看看这个过程发生了什么。
Wireshark抓包
首先,我们打开Wireshark,选择正确的网卡并点击开始录制。
然后在命令行中使用如下命令先清除DNS缓存,以便我们可以看到无缓冲下的请求情况。
sudo dscacheutil -flushcache;sudo killall -HUP mDNSResponder;say flushed
输入密码后,听到flushed的语音表示清除DNS缓存成功。
接着再次输入 nslookup baidu.com 223.5.5.5 命令来让Wireshark进行抓包,并在抓包结果中输入dns关键字来过滤结果中所有的dns查询记录,如下图所示:
从图中可以看到,在输入上面的命令后,从172.20.81.29发送了一条DNS请求到223.5.5.5,并且223.5.5.5给172.20.81.29进行了回复。
在info一栏,可以看到请求解析的域名和返回的IP地址列表。
点击请求和返回的记录,能在详情中看到更多的信息,如下图所示:
request:
response:
关键信息
Transcation ID
Transcation ID 为查询事物标识,它与返回记录中的Transcation ID 想对应。如果两条DNS通信记录中的Transcation ID 相同 ,可以判断它们是一对请求和返回。
Recursion desired
Recursion desired如果标志为1,则表示该DNS请求可以在服务器链路中递归的进行查询。在中间服务器查询不到记录时,一直递归的DNS根服务器。
Queries
Queries包含DNS request的域名的字符串,在本示例中为baidu.com。
Reply code
DNS response的状态码,可以在这个字段的信息中查看response是否成功。在失败的情况下也可以查看失败对应的原因。
Answers
DNS服务器返回的IP地址列表。点开Answers详情,还可以看到该DNS缓存的有效时间,如下图所示: