3.2 Question段的格式
Question段包含的是查询的“问题”,其格式如图5所示。
图5 Question段格式
3.2.1 QNAME
QNAME中包含了一些列的标签,每个标签由两个十六进制的数(1个字节)和要查询的子域组成,如图6所示,其中的Queries就是Question段。
图6 Question段数据
本次要查询的子域名是“a.baidu.com”的A记录,因此,在QNAME中将要查询的子域名分为三个部分“a”、“baidu”和“com”。从图6下部的数据中可以看到,首先是表示该第一个子域名长度的1个字节,其值是0x01,之后是表示该子域名“a”;之后是第二个子域名的长度0x05,之后是该子域名“baidu”;接下来是第三个子域名的长度0x03,之后是该子域名“com”,最后是表示结束的0x00。
3.2.2 QTYPE
QTYPE的长度是2个字节,表示查询的类型,如图6所示,此时的QTYPE的值是0x0001,表示查询指定子域名的A记录。
相关链接4 A记录即为子域名对应的IPv4地址。
3.2.3 QCLASS
QCLASS的长度是2个字节,表示要查询的类,如图6所示,此时的QCLASS的值是0x0001,表示该类为互联网地址。
4 应答数据包结构
从“3 查询数据包结构”中可以看到,DNS查询数据包中只包含了图1中的前两部分,即“Header”和“Question”。而从DNS返回给主机的应答数据中,则包含了图1中的五个部分,如图7所示。
图7 应答数据包
4.1 Header部分
应答数据包中的Header含义与“3.1 Header部分”中提到的查询数据包中的Header含义相同。从图6中可以看到,其ID值与图3中的查询数据包的ID相同。在ID之后的Flags中可以可以看到,QR位的值是1,表示应答包;AA位是0,表示该应答不是来自权威服务器;RA为的值是1,表示服务器支持递归查询;其他标志位与查询数据相同。QDCOUNT(Question)段的值是1,说明有1个查询;ANCOUNT(Answer RRs)段的值是2,说明有2个应答数据;NSCOUNT(Authority RRs)段的值是0,表示没有授权资源;ARCOUNT(Additional RRs)段的值是1,说明有1个附加资源。
4.2 QDCOUNT(Queries)段
QDCOUNT段如图8所示,表示查询的子域名,与图6相同。
图8QDCOUNT段