接下来是:

ID:占16位,2个字节。此报文的编号,由客户端指定。DNS回复时带上此标识,以指示处理的对应请应请求。

QR:占1位,1/8字节。0代表查询,1代表DNS回复

Opcode:占4位,1/2字节。指示查询种类:0:标准查询;1:反向查询;2:服务器状态查询;3-15:未使用。

AA:占1位,1/8字节。是否权威回复。

TC:占1位,1/8字节。因为一个UDP报文为512字节,所以该位指示是否截掉超过的部分。

RD:占1位,1/8字节。此位在查询中指定,回复时相同。设置为1指示服务器进行递归查询。

RA:占1位,1/8字节。由DNS回复返回指定,说明DNS服务器是否支持递归查询。

Z:占3位,3/8字节。保留字段,必须设置为0。

RCODE:占4位,1/2字节。由回复时指定的返回码:0:无差错;1:格式错;2:DNS出错;3:域名不存在;4:DNS不支持这类查询;5:DNS拒绝查询;6-15:保留字段。

QDCOUNT:占16位,2字节。一个无符号数指示查询记录的个数。

ANCOUNT:占16位,2字节。一个无符号数指明回复记录的个数。

NSCOUNT:占16位,2字节。一个无符号数指明权威记录的个数。

ARCOUNT:占16位,2字节。一个无符号数指明格外记录的个数。

其中每个查询的资源记录格式:

1 1 1 1 1 1

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

| |

/ QNAME /

/ /

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

| QTYPE |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

| QCLASS |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

QNAME:不定长,表示要查询的域名。(两边的方框用 / 来表示不定长)

QTYPE:2字节,根据RFC1035及nslookup的帮助文档,我定义以下枚举类型:

enum QueryType //查询的资源记录类型。

{

A=0x01, //指定计算机 IP 地址。

NS=0x02, //指定用于命名区域的 DNS 名称服务器。

MD=0x03, //指定邮件接收站(此类型已经过时了,使用MX代替)

MF=0x04, //指定邮件中转站(此类型已经过时了,使用MX代替)

CNAME=0x05, //指定用于别名的规范名称。

SOA=0x06, //指定用于 DNS 区域的“起始授权机构”。

MB=0x07, //指定邮箱域名。

MG=0x08, //指定邮件组成员。

MR=0x09, //指定邮件重命名域名。

NULL=0x0A, //指定空的资源记录

WKS=0x0B, //描述已知服务。

PTR=0x0C, //如果查询是 IP 地址,则指定计算机名;否则指定指向其它信息的指针。

HINFO=0x0D, //指定计算机 CPU 以及操作系统类型。

MINFO=0x0E, //指定邮箱或邮件列表信息。

MX=0x0F, //指定邮件交换器。

TXT=0x10, //指定文本信息。

AAAA=0x1c,//IPV6资源记录。

UINFO=0x64, //指定用户信息。

UID=0x65, //指定用户标识符。

GID=0x66, //指定组名的组标识符。

ANY=0xFF //指定所有数据类型。

};

QTYPE:2字节。 根据RFC1035及nslookup的帮助文档,我定义以下枚举类型:

enum QueryClass //指定信息的协议组。

{

IN=0x01, //指定 Internet 类别。

CSNET=0x02, //指定 CSNET 类别。(已过时)

CHAOS=0x03, //指定 Chaos 类别。

HESIOD=0x04,//指定 MIT Athena Hesiod 类别。

ANY=0xFF //指定任何以前列出的通配符。

};

QTYPE中的A,MX,CNAME为常用,QCLASS中的IN为常用。


相关内容