一.准备工作
实验环境为 Windows 8.1 Pro
抓包分析工具使用 WireShark 1.10.8 Stable Version
通过系统自带的 Ping 命令发送 ICMP 报文。
二.开始操作
打开 CMD.exe 并输入:
ping www.oschina.net
系统会自动进行 DNS 域名解析,并默认发送 4 个 ICMP 报文。
启动 Wireshark,选择一个可用网卡并开始抓包。
在控制台执行完成后停止抓包监控。
三.分析阶段
截获到的全部报文如下:

整体来看,共有 2 个 DNS 数据包(对应一次域名解析过程)以及 8 个 ICMP 数据包(对应四次 ping 请求与响应)
下面开始具体分析 DNS 的工作流程:
先打开第一个数据包:

可以看到,DNS 属于应用层协议,下层传输层使用 UDP,再下层网络层为 IP 协议,最底层则是数据链路层的以太网帧。
这里重点需要关注的是应用层实现,也就是 DNS 协议本身。
在分析 DNS 之前,可以先从下层协议中获取一些必要信息:
UDP(User Datagram Protocol)报文中:DNS 的目的端口(Dst Port)为 53
IPv4(Internet Protocol Version 4)报文中的目的 IP 为 192.168.1.1(局域网路由器)
由于 IP 报文在网络层需要经过路由选择,因此数据会先发送到路由器,而不是直接发往最终的 DNS 服务器,这一点其实很好理解。
第一个包是 DNS 请求包,因此其中通常不会直接包含最终 DNS 服务器的地址。
展开 DNS 数据:

首先看到的是 Transaction ID 标识字段,长度为 2 字节,用于标识 DNS 应答报文对应的是哪一个请求报文。
第二个字段是 Flags 标志位,长度同样是 2 字节,每一位都有不同含义,具体可以参考上面那张图,也可以结合下面这张图理解:

QR: 查询/响应,1 表示响应,0 表示查询
Opcode: 查询或响应类型,这里 0 表示标准查询,1 表示反向查询,2 表示服务器状态请求
AA: 授权回答,仅在响应报文中有效,后面再看
TC: 截断,1 表示报文超过 512 字节并已被截断,0 表示未发生截断
RD: 是否希望获得递归回答
RA: 在响应报文中为 1 时表示支持并已得到递归响应
zero: 全 0 保留字段
rcode: 返回码,在响应报文中各取值含义如下:
0 - 无差错
1 - 格式错误
2- 域名服务器出现错误
3 - 域名引用问题
4 -查询类型不支持
5 - 被禁止
6 ~ 15 保留
紧接在标志位后面的字段是
Quetions(问题数),2 字节,通常为 1
Answer RRs(资源记录数)、Authority RRs(授权资源记录数)、Additional RRs(附加资源记录数)通常为 0
字段 Queries 为查询或响应的正文部分,主要分为 Name、Type、Class
Name(查询名称): 这里就是 ping 后面的域名参数,长度不固定,并以 0 结束
Type(查询类型): 2 字节,这里查询的是主机 A 记录。其常见取值含义如下:
值 助记符 说明
1 A IPv4地址。
2 NS 名字服务器。
5 CNAME 规范名称。定义主机的正式名字的别名。
6 SOA 开始授权。标记一个区的开始。
11 WKS 熟知服务。定义主机提供的网络服务。
12 PTR 指针。把IP地址转化为域名。
13 HINFO 主机信息。给出主机使用的硬件和操作系统的表述。
15 MX 邮件交换。把邮件改变路由送到邮件服务器。
28 AAAA IPv6地址。
252 AXFR 传送整个区的请求。
255 ANY 对所有记录的请求。
Class(类): 2 字节,IN 表示 Internet 数据,通常值为 1
下面是截获到的第二个 DNS 数据包:

可以看到,与第一个请求包相比,响应包中多出了一个 Answers 字段,同时 Flags 字段中的每一位也都有了明确含义。
重点关注一下,Flags 中显示 AnswerRRs 为 4,这说明对应的 Answers 字段中会返回 4 项解析结果。
Answers 字段可以理解为一个 List,集合中的每一项都是一个资源记录。除了前面提到的 Name、Type、Class 之外,还包括 Time to
Live、Data length、Addr。
生存时间 TTL(Time to Live):它表示该资源记录在缓存中的有效时长,也就是从取出记录到缓存失效之间经历的时间,单位为秒。这里显示为 0x00 00 00 fd,换算后为 253 秒。
Data length(资源数据长度): 以字节为单位,这里的 4 表示 IP 地址长度为 4 字节,也就是下面 Addr 字段的长度。
Addr(资源数据): 返回的 IP 地址,也就是这次 DNS 解析真正得到的结果。
可以看到一共返回了 4 条资源记录,也就是 4 个不同的 IP 地址,说明域名 www.oschina.net 对应了 4 个 IP 地址,分别是:
112.124.5.74
219.136.249.194
61.145.122.155
121.9.213.124
CMD 中显示的是第一条 IP 地址。我也尝试直接访问上面这些地址的 80 端口(HTTP),
第一个和第二个返回 403 Forbidden
第三个和第四个返回 404 Not Found
每个地址对应的 Server 也并不相同,例如 oscali、oscdb、liubc、ep2。第一个看起来像阿里云服务器,第二个似乎更像数据库服务器,其他几个就暂时无法准确判断了。
Web 服务器看起来像是 Tengine,
暂时还不清楚为什么通过 IP 地址无法直接访问对应的 Web 站点,后面有时间再继续研究一下。
关于 ICMP 协议报文分析,后续会在下一篇文章中继续展开。今天先写到这里。
最后,欢迎大家留言评论交流,也欢迎一起讨论一下 OSC 这里的解析和服务器配置到底是怎么回事。
