DNS协议解析1--DNS请求协议

1、协议内容分报文头和DNS正文,如下图所示为报文头:

表示的意思分别为:

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字节。一个无符号数指明格外记录的个数。

2、请求正文部分,如下图所示:

 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为常用。

3、不定长域名表达形式

这边述说一下名称的组合形式。名称由多个标识序列组成,每一个标识序列的首字节说明该标识符的长度,接着用是ASCII码表示字符,多个序列之后由字节0表示名字结束。其中某一个标识序列的首字符的长度若是0xC0的话,表示下一字节指示不是标识符序列,而是指示接下部分在本接收包内的偏移位置。 
  比如 bbs.zzsy.com 以.分开bbs、zzsy、com三个部分。每个部分的长度为3、4、3 
  在DNS报文中的形式就如 3 b b s 4 z z s y 3 c o m 0 
  假如在包内的第12个字节位置存在有 4 z z s y 3 c o m 0 这样的名称了。 
  那此时有可能为:3 b b s 4 z z s y 0xC0 0x0C 这样的形式。

4、回复正文部分,如下图所示: 

 

  NAME:回复查询的域名,不定长。 
  TYPE:回复的类型。2字节,与查询同义。指示RDATA中的资源记录类型。 
  CLASS:回复的类。2字节,与查询同义。指示RDATA中的资源记录类。 
  TTL:生存时间。4字节,指示RDATA中的资源记录在缓存的生存时间。 
  RDLENGTH:长度。2字节,指示RDATA块的长度。 
  RDATA:资源记录。不定义,依TYPE的不同,此记录的格示不同,通常一个MX记录是由一个2字节的指示该邮件交换器的优先级值及不定长的邮件交换器名组成的。

5、wireshark抓包实例

  请求包:

  DNS协议解析1--DNS请求协议_第1张图片

  应答包:

  DNS协议解析1--DNS请求协议_第2张图片

你可能感兴趣的:(网络协议)