其中头部的大小是固定的为12字节。这5个部分不是全部都是必须的,在向服务器发送查询请求的时候,只需要前2个。回复的时候也不一定包含5个(按查询的内容和返回的信息而定)。
Header 部分:
header头部分是必须的,无论发送查询或者返回结果都需要该部分,且长度一定,为12字节。结果如下图
ID:长度为16位,是一个用户发送查询的时候定义的随机数,当服务器返回结果的时候,返回包的ID与用户发送的一致。
QR:长度1位,值0是请求,1是应答。
Opcode:长度4位,值0是标准查询,1是反向查询,2死服务器状态查询。
AA:长度1位,授权应答(Authoritative Answer) – 这个比特位在应答的时候才有意义,指出给出应答的服务器是查询域名的授权解析服务器。
TC:长度1位,截断(TrunCation) – 用来指出报文比允许的长度还要长,导致被截断。
RD:长度1位,期望递归(Recursion Desired) – 这个比特位被请求设置,应答的时候使用的相同的值返回。如果设置了RD,就建议域名服务器进行递归解析,递归查询的支持是可选的。
RA:长度1位,支持递归(Recursion Available) – 这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询。
Z:长度3位,保留值,值为0.
RCode:长度4位,应答码,类似http的stateCode一样,值0没有错误、1格式错误、2服务器错误、3名字错误、4服务器不支持、5拒绝。
QDCount:长度16位,报文请求段中的问题记录数。
ANCount:长度16位,报文回答段中的回答记录数。
NSCOUNT :长度16位,报文授权段中的授权记录数。
ARCOUNT :长度16位,报文附加段中的附加记录数。
Question 部分:
这部分的内容是你要查询的内容。也是必须的
QName:是你要查询的域名,属于不定长字段。他的格式是“长度(1字节)+N字节内容(N由前面的长度定义)+~~~+长度0。以一个长度单位N为开始,然后连续的N字节为其内容,然后又是一个N2长度的一字节,然后后面又是N2个字节内容,直到遇到长度为0的长度标记。
查询名为要查找的名字,它由一个或者多个标示符序列组成。每个标示符已首字节数的计数值来说明该标示符长度,每个名字以0结束。计数字节数必须是0~63之间。该字段无需填充字节。如:gemini.tuc.noao.edu
QType:长度16位,表示查询类型。取值大概如下:
enum QueryType //查询的资源记录类型。
{
A=0×01, //指定计算机 IP 地址。
NS=0×02, //指定用于命名区域的 DNS 名称服务器。
MD=0×03, //指定邮件接收站(此类型已经过时了,使用MX代替)
MF=0×04, //指定邮件中转站(此类型已经过时了,使用MX代替)
CNAME=0×05, //指定用于别名的规范名称。
SOA=0×06, //指定用于 DNS 区域的“起始授权机构”。
MB=0×07, //指定邮箱域名。
MG=0×08, //指定邮件组成员。
MR=0×09, //指定邮件重命名域名。
NULL=0x0A, //指定空的资源记录
WKS=0x0B, //描述已知服务。
PTR=0x0C, //如果查询是 IP 地址,则指定计算机名;否则指定指向其它信息的指针。
HINFO=0x0D, //指定计算机 CPU 以及操作系统类型。
MINFO=0x0E, //指定邮箱或邮件列表信息。
MX=0x0F, //指定邮件交换器。
TXT=0×10, //指定文本信息。
UINFO=0×64, //指定用户信息。
UID=0×65, //指定用户标识符。
GID=0×66, //指定组名的组标识符。
ANY=0xFF //指定所有数据类型。
};
QClass:长度为16位,表示分类。
enum QueryClass //指定信息的协议组。
{
IN=0×01, //指定 Internet 类别。
CSNET=0×02, //指定 CSNET 类别。(已过时)
CHAOS=0×03, //指定 Chaos 类别。
HESIOD=0×04,//指定 MIT Athena Hesiod 类别。
ANY=0xFF //指定任何以前列出的通配符。
};
资源结构:
接下来的3个结构,格式可以说相同。都是如下图的结构和字段。Name:回复查询的域名,不定长。 这里的名字和Question结构的名字是一样的,在这里详细说一下。