DNS报文头说明
头部(大端字节序)
-
标识ID
-
标志
-
QR:1为响应 0为查询
-
OPCODE:查询或者响应类型 0为标准查询 1为反向查询 2为服务器状态查询
-
AA:1表示名字服务器是权威服务器(应答包使用)
-
TC:截断标志 1标识数据超过512字节并且被截断
-
RD:1表示客户端希望得到递归回答(查询使用 应答包此值相同)
-
RA:1表示可以得到递归响应(应答包使用)
-
Z:ZERO 0 保留字段
-
RCODE:返回码通常为0和3
-
0:无错误
-
1:格式错误
-
2:问题在域名服务器上
-
3:域名不存在 域参照问题
-
4:查询类型不支持
-
5:DNS拒绝查询 管理上被禁止
-
问题数
-
对应数量(我试过把此值设置为2 然后后面附带两个问题区域 尝试一个包同时查询两个域名 谷歌DNS值返回了第一个域名的 而其他DNS直接数据错误)
-
回答RR数
-
权威RR数
-
附加RR数
问题区域(数据包个数应该与上面问题数对应)
问题区域长度并非固定 如上图分为三部分
-
域名部分
-
域名部分数据格式为[(长度+数据)...+0] 0表示终止 如上图为查询(test.st233.com)的数据包
-
查询类型
-
0x01(A) :指定计算机 IP 地址。
-
0x02(NS) :指定用于命名区域的 DNS 名称服务器。
-
0x03(MD) :指定邮件接收站(此类型已经过时了 使用MX代替)
-
0x04(MF) :指定邮件中转站(此类型已经过时了 使用MX代替)
-
0x05(CNAME) :指定用于别名的规范名称
-
0x06(SOA) :指定用于 DNS 区域的起始授权机构
-
0x07(MB) :指定邮箱域名
-
0x08(MG) :指定邮件组成员
-
0x09(MR) :指定邮件重命名域名
-
0x0A(NULL) :指定空的资源记录
-
0x0B(WKS) :描述已知服务
-
0x0C(PTR) :如果查询是IP地址 则指定计算机名 否则指定指向其它信息的指针
-
0x0D(HINFO) :指定计算机CPU以及操作系统类型
-
0x0E(MINFO) :指定邮箱或邮件列表信息
-
0x0F(MX) :指定邮件交换器
-
0x10(TXT) :指定文本信息
-
0x1C(AAAA) :IPV6资源记录
-
0x64(UINFO) :指定用户信息
-
0x65(UID) :指定用户标识符
-
0x66(GID) :指定组名的组标识符
-
0xFC(AXFR) :传送整个区域的请求
-
0xFF(ANY) :指定所有数据类型
-
类
-
通常为1
-
0x01(IN) :指定Internet类别
-
0x02(CSNET) :指定CSNET类别(已经过时)
-
0x03(CHAOS) :指定CHAOS类别
-
0x04(HESIOD) :指定MIT Athena Hesiod类别
-
0xFF(ANY) :指定任何以前列出的通配符
回答、权威、附加区域(数据包个数应与上面RR数对应)
-
域名(两字或者不定长)
-
记录中资源数据对应的名字 它的格式和查询名字段格式相同 当报文中域名重复出现时 就需要使用2字节的偏移指针来替换 例如 在资源记录中 域名通常是查询问题部分的域名的重复 就需要用指针指向查询问题部分的域名 即2字节的指针 最前面的两个高位是11用于表示是指针 其他14位标识从报文开始处的偏移字节数 一般响应报文中 资源部分的域名都是指针C00C(1100000000001100 12正好是首部区域的长度) 刚好指向请求部分的域名
-
查询类型
-
类
-
生存时间
-
该字段表示资源记录的生命周期(秒) 一般本地解析程序取出记录后决定缓存的时间 极为稳定的信息一般会被分配一个很大的值
-
数据长度
下面是对ping www.baidu.com 的一组抓包数据(ping 的时候会进行DNS域名解析)
一个是查询包 一个是应答包 查询包数据如下
应答包数据如下