一、DNS报文格式
DNS报文格式分为DNS查询和响应的报文格式。整个dns分为5个部分,分别为Header、Question、Answer、Authority、Additional。这个报文由固定12字节长的首部和4个长度可变的字段组成。报文中问题字段是由客户填入的,由服务器返回问题的回答、授权和附加信息字段。报文格式如下:
Header段是必须存在的,它定义了报文是请求还是应答,也定义了其他段是否需要存在,以及是标准查询还是其他。
头部字段格式如下:
字段 | 长度 | 描述 |
---|---|---|
ID | 16 bit | 标识字段,客户通过标识字段来确定DNS响应是否与查询请求匹配。是一个用户发送查询的时候定义的随机数,当服务器返回结果的时候,返回包的ID与用户发送的一致。 |
QR | 1 bit | 操作类型:
|
OPCODE | 4 bit | 查询类型:
反向查询是客户端请求服务器根据回答生成导致此回答的问题,这个查询类型的使用并不多。 |
AA | 1 bit | 若置位,则表示该域名解析服务器是授权回答该域的。 授权应答(Authoritative Answer): 这个比特位在应答的时候才有意义,指出给出应答的服务器是查询域名的授权解析服务器。 |
TC | 1 bit | 若置位,则表示报文被截断。 使用UDP传输时,应答的总长度超过512字节时,只返回报文的前512个字节内容。 |
RD | 1 bit | 期望递归(Recursion Desired) : 这个比特位被请求设置,应答的时候使用的相同的值返回 客户端希望域名解析服务器采取的解析方式:
|
RA | 1 bit | 支持递归(Recursion Available): 这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询。 域名解析服务器采取的解析方式:
|
Z | 3 bit | 全部置0,保留未用。 AD 真实数据如果包含的信息是已授权的(AA位),那么该位是1。 CD 禁止校验如果禁用安全检查则,CD位设置为帧。 |
RCODE | 4 bit | 应答码,类似http的stateCode一样.当DNS服务器返回一个DNS相应的时候,该位被设置,通常带有额外的信息 响应类型:
|
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 //查询的资源记录类型。 |
QCLASS | 2个字节 | 表示查询的协议类,比如,IN代表Internet。 取值大概如下: enum QueryClass //指定信息的协议组。 |
三、回答、授权、附加区域通用报文格式(也是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回答报文实例