一、说明
1、提供DNS协议的服务器监听在UDP的53端口。
2、客户端发送DNS协议请求和服务器返回结果都是相同的协议格式。
3、有的头部是客户端使用,有的是服务器使用。
二、主要格式
DNS协议的UDP协议报文格式如下:
2字节事务ID(客户端和服务端都设置)
2字节标志:说明操作和状态。
2字节问题信息个数
2字节结果信息个数
2字节授权记录个数
2字节附加信息个数
负载数据(按照顺序设置)
说明:
请求报文只有问题信息。
服务器回复报文有问题信息和结果信息,可能有授权信息和附加信息。
三、说明
1、事务号
事务号由客户端生成。
客户端发送的事务号和服务端返回的事务号是一致的(不一致就请求失败)。
2、标志的组成
方向(1位比特): 值为0表示查询,由客户端设置;1表示响应,由服务端设置。
操作码(4位比特):由客户端设置。
0x00代表标准查询;
0x01代表反向查询;
0x02代表服务器状态请求;
授权回答(1位比特):服务端设置;值为1代表是。
截断标志TC(1位比特):服务端设置;值为1代表是。
期望递归(1位):客户端设置,1代表是。
递归可用(1位比特):服务端设置,1代表是。
保留位(3位比特):设为默认值0。
响应码(4位比特):
0x00代表无错误
0x01代表格式错误
0x02代表服务器错误。
0x03代表名字错误。
0x04代表没有实现。
0x05代表拒绝。
3、问题个数、回答个数、授权信息个数、附加个数
设置为一个整数值,代表后面会出现指定个数的基本单元。
例如:问题数为1,代表后面有1个问题信息。
4、负载数据
负载数据部分是很多个连续的基本单元组成。
按照问题信息、回答信息、授权信息、附加信息的顺序存放。
例如:
问题信息有2个,就先放置2个问题信息,再放置后面的回答信息。
有0个问题信息,就忽略它,继续放置后面回答信息。
四、域名信息的字节格式
1、已知有域名"www.qq.com"
2、按照字符"."分割。
分割成的每部分结果:
www
com
3、在每个字符串的前面用1字节来说明字符串的字节长度。
按照顺序拼接,用字节值0结尾。
把结果打印成字符的结果如下:
3www2qq3com0
压缩格式:如果第1个字节的前面2位比特是11,那么后面14位比特代表指针的偏移量(0代表第1个字节)。
例如:假设是指针,并且偏移量是45,就从第46个字节开始读域名,直到0字节结束。
五、负载数据基本单元的格式
(一)问题信息单元格式
域名信息的字节序列(长度可变)
2字节类型(值为1代表IPV4地址)
2字节种类(值为1代表Internet网络)
说明:类型中1代表ipv4地址,28代表ipv6地址。
(二)回答、授权、附加信息单元格式
域名信息字节序列(长度可变)
2字节类型
2字节种类
4字节生存时间
2字节负载长度
负载数据(长度指定)
说明:
域名信息、类型、种类的格式和问题信息相同。
负载数据的字节长度由前面2字节负载长度指定;
例如ipv4地址占4字节,ipv6占16字节。
负载数据的IP地址每个字节需要自己用字符"."连接;IPV6需要":"连接。