DNS采用UDP作为传输层协议,DNS报文封装在UDP数据报中。当DNS报文大小超过512B时,则必须使用TCP作为底层的传输协议,这是因UDP报文大小不能超过512B。如使用TCP且DNS报文大小超出512B,报文部分在发送前分成TCP分段。DNS以端口53进行数据交互。DNS报文由12B报头和4个长度可变字段组成,如图8-15所示。
图8-15 DNS报文格式
1.DNS报头
DNS报文的报头部分长度固定,为12B,其中各字段的含义如下。
标识(Identification):该字段是一16bit标识符,由客户端设置,在服务器响应中原样返回。客户端通过它来确定返回的响应与发送的请求是否匹配。
标志(Flags):该字段用于指定所请求的操作及返回的响应码,以位字段的形式组织,总长度为16bit,其结构为图8-16所示,各子字段的含义见表8-14。
图8-16 DNS报头中“标志”字段的结构
表8-14 DNS报头中“标志”宇段中子字段的含义
●询问数(Number of Questions):表示发送给域名服务器的询问数。
●答案数(Number of Answers):表示域名服务器返回的答案数。
●权威答案数(Number of Authority):表示权威域名服务器返回的答案数。
●附加答案数(Number of Additional):表示附加部分包含的答案数。
以上4个16bit字段说明最后4个变长字段中包含的条目数,对于查询报文,询问数通常为1,其余三项均为0。对于应答报文,答案数至少是1,剩下两项可以是0或非0。
2.查询部分
在DNS报文中,紧随在报头部分的是“查询部分”,查询报文必须填写该字段。“查询部分”可包含多个查询记录,一个查询记录的格式如图8-17所示。
图8-17 DNS查询报文中“查询记录”的格式(www.xing528.com)
“查询名称”是要解析的站点的域名,它是一个或多个标识符的序列。每个标识符以首字节的计数值来说明随后标识符的字节长度,查询名称最后以字节0为结束,长度为0的标识符是根标识符。计数字节的取值范围是0~63,因为标识符的最大长度仅为63。与之前见到的许多报文格式不同,“查询名称”字段无需以整32bit边界结束,即无需填充字节。
图8-18显示了“查询名称”字段中如何存储域名news.zsu.edu.cn。
图8-18 域名news.zsu.edu.cn的表示
在查询报文中,每个查询记录有一个“查询类型”字段,而在响应中,每个资源记录也有一个“类型”字段,查询类型是类型的一个超集。DNS规范中规定了大约20个不同类型值,其中一些目前已过时,表8-15列出常用的取值。
表8-15 DNS查询和响应的类型值和查询类型值
最常用的查询类型是A类型,表示期望获得查询名的IP地址。一个PTR查询则请求获得一个IP地址对应的域名,这是一个指针查询。“查询类”字段的取值通常是1,指互联网地址(因某些站点也支持其他非IP地址)。
3.资源记录
DNS报文中最后三个字段:答案部分、权威答案部分和附加信息部分,均由一个或多个资源记录(Resource Record,RR)组成。资源记录是一种特殊记录格式,如图8-19所示。
图8-19 DNS响应报文中“资源记录”的格式
“域名”是记录中资源数据对应的名字,其格式与之前介绍的查询部分中“查询名称”字段的格式相同。“类型”是指资源记录的类型码,具体取值参见表8-15。“类”通常为取值1,指互联网数据。
“存活时间”字段指定客户端在缓存中保留资源记录的秒数,通常资源记录存活时间为2天。如存活时间指定为0,则表明不允许缓存资源记录。
“资源数据长度”字段指定了以字节为单位的资源数据的长度。
“资源数据”字段中包含域名服务器返回给客户端的查询答案。
4.信息压缩
通常在域名服务器返回结果报文中,会有许多重复的域名,如资源记录中可能包含与查询记录中相同的域名。为减少报文的数据量,可采用指针方式实现域名数据的压缩。
压缩方法是:当一个域名中的标识符是压缩的,它的单计数字节(0~63)中最高两位将被设置为11(取值范围变为192~255),这表示它是一个16bit指针而不是8bit计数字节。指针中剩下的14bit为偏移量,说明标识符在DNS报文中的位置(起始位置由DNS报文第一字节起算)。只要一个标识符是压缩的,就可使用这种指针,而不一定非要一个完整的域名压缩时才能使用。因一个指针可能指向一个完整域名,也可能只指向域名结尾部分,因为给定域名的结尾标识符是相同的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。