《TCP/IP协议族》:DNS协议二

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yexiangCSDN/article/details/86236214

一、DNS报文格式

DNS报文格式分为DNS查询和响应的报文格式。整个dns分为5个部分,分别为Header、Question、Answer、Authority、Additional。这个报文由固定12字节长的首部和4个长度可变的字段组成。报文中问题字段是由客户填入的,由服务器返回问题的回答、授权和附加信息字段。报文格式如下:


Header段是必须存在的,它定义了报文是请求还是应答,也定义了其他段是否需要存在,以及是标准查询还是其他。

头部字段格式如下:


字段 长度 描述
ID 16 bit 标识字段,客户通过标识字段来确定DNS响应是否与查询请求匹配。是一个用户发送查询的时候定义的随机数,当服务器返回结果的时候,返回包的ID与用户发送的一致。
QR 1 bit 操作类型:
  • 0:查询报文
  • 1:响应报文
OPCODE 4 bit 查询类型:
  • 0:标准查询
  • 1:反向查询
  • 2:服务器状态查询
  • 3~15:保留未用

反向查询是客户端请求服务器根据回答生成导致此回答的问题,这个查询类型的使用并不多。

AA 1 bit

若置位,则表示该域名解析服务器是授权回答该域的。

授权应答(Authoritative Answer): 这个比特位在应答的时候才有意义,指出给出应答的服务器是查询域名的授权解析服务器。

TC 1 bit

若置位,则表示报文被截断。

使用UDP传输时,应答的总长度超过512字节时,只返回报文的前512个字节内容。

RD 1 bit

期望递归(Recursion Desired) : 这个比特位被请求设置,应答的时候使用的相同的值返回

客户端希望域名解析服务器采取的解析方式:

  • 0:表示希望域名解析服务器采取迭代解析
  • 1:表示希望域名解析服务器采取递归解析
RA 1 bit

支持递归(Recursion Available): 这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询。

域名解析服务器采取的解析方式:

  • 0:表示域名解析服务器采取迭代解析
  • 1:表示域名解析服务器采取递归解析
Z 3 bit

全部置0,保留未用。

AD 真实数据如果包含的信息是已授权的(AA位),那么该位是1。

CD 禁止校验如果禁用安全检查则,CD位设置为帧。

RCODE 4 bit

应答码,类似http的stateCode一样.当DNS服务器返回一个DNS相应的时候,该位被设置,通常带有额外的信息

响应类型:

  • 0:无差错
  • 1:查询格式错
  • 2:服务器失效
  • 3:域名不存在
  • 4:查询没有被执行
  • 5:查询被拒绝
  • 6-15: 保留未用

QDCOUNT 16 bit

无符号16位整数表示报文请求段中的问题记录数。

问题区段也就是客户端请求的信息。问题数总是为1

ANCOUNT 16 bit

无符号16位整数表示报文回答段中的回答记录数。

回答区段也就是DNS服务器回复的信息。

NSCOUNT 16 bit 无符号16位整数表示报文授权段中的授权记录数。
ARCOUNT 16 bit 无符号16位整数表示报文附加段中的附加记录数。

二、问题区域Question报文格式

大多数查询中,Question段包含着问题(question),比如,指定问什么。这个段包含QDCOUNT(usually 1)个问题

每个问题的格式:

举例解析 jocent.me

字段 长度 描述
QNAME 变长

域名被编码为一些labels序列,每个labels包含一个字节表示后续字符串长度,以及这个字符串,以0长度和空字符串来表示域名结束。注意这个字段可能为奇数字节,不需要进行边界填充对齐。

是你要查询的域名,属于不定长字段。他的格式是“长度(1字节)+N字节内容(N由前面的长度定义)+ ... +长度0。

长度一个字节就够了原因很简单,最长不超过255字节,8bit正好。

QTYPE 2个字节

表示查询类型,.取值可以为任何可用的类型值,以及通配码来表示所有的资源记录。

取值大概如下:

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

A=0x01, //指定计算机 IP 地址。 //则name是主机名,value是其对应的ip;
NS=0x02, //指定用于命名区域的 DNS 名称服务器。 //则name是一个域,value是一个权威DNS服务器的主机名。该                                                                            记录表示name域的域名解析将由value主机名对应的DNS服务器来做
MD=0x03, //指定邮件接收站(此类型已经过时了,使用MX代替) 
MF=0x04, //指定邮件中转站(此类型已经过时了,使用MX代替) 
CNAME=0x05, //指定用于别名的规范名称。 //则value是别名为name的主机对应的规范主机名;
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, //指定文本信息。 
UINFO=0x64, //指定用户信息。 
UID=0x65, //指定用户标识符。 
GID=0x66, //指定组名的组标识符。 
ANY=0xFF //指定所有数据类型。 
};

QCLASS 2个字节

表示查询的协议类,比如,IN代表Internet。

取值大概如下:

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

IN=0x01, //指定 Internet 类别。 
CSNET=0x02, //指定 CSNET 类别。(已过时) 
CHAOS=0x03, //指定 Chaos 类别。 
HESIOD=0x04,//指定 MIT Athena Hesiod 类别。 
ANY=0xFF //指定任何以前列出的通配符。 
};

三、回答、授权、附加区域通用报文格式(也是DNS资源记录格式

响应报文中的三种资源记录(回答、授权、附加)均采用相同的格式。

报文格式如下:

多个资源记录,资源记录的个数由报文头段中对应的几个数值确定,

每个资源记录格式如下:

字段 长度 描述
NAME 不定长

资源记录包含的域名。这里的名字和Question结构的QNAME是一样的.

注意:

记录域名由两种方法,方法一就是查询报文中所提到的如lixin.me,方法二是采用指针的方法,因为一个回答报文中可能同时包含多种资源记录RR,而对于每一种资源记录RR,都会重复域名部分,为了节约空间,在后面的RR(非第一个RR)的域名部分,我们采用偏移指针的方式。偏移指针(占用16位)指的是偏离DNS响应报文首部最开始的位置(以字节为单位)且以11(C0)开头,偏移值范围为0~63B。

当在响应报文中出现域名重复时,DNS要求用偏移指针来代替域名,DNS定义了2B的偏移指针,格式“11+偏移长度”,最高位固定为11(C0),从而实现压缩。例如偏离首部最开始部分12B可以记录为:1100 0000 0000 1100。

TYPE 2个字节 表示资源记录的类型,指出DATA数据的含义。和Question结构的QTYPE是一样的
CLASS 2个字节 表示DATA的类。和Question结构的QCLASS是一样的
TTL 4字节 无符号整数,表示资源记录可以缓存的时间。0代表只能被传输,但是不能被缓存。
DLENGTH 2个字节 无符号整数,表示DATA的长度。
DATA 不定长 字符串,表示记录,格式跟TYPE和CLASS有关。比如,TYPE是A,CLASS是IN,那么DATA就是一个4个字节的ARPA网络地址。NAME和RDATA表示的含义根据TYPE的取值不同而不同

四、DNS报文实例

1. DNS查询报文实例

2. DNS回答报文实例

猜你喜欢

转载自blog.csdn.net/yexiangCSDN/article/details/86236214