DNS协议头
来源:互联网 发布:centos 网卡配置文件 编辑:程序博客网 时间:2024/05/18 01:21
DNS请求包的格式,应该说长度是可变的,而且变化范围很大。比其它协议头要复杂的多。DNS协议是个很重要的协议,运行在
UDP 53端口,是web应用不可或缺的部分。
这里主要介绍DNS的请求包和响应包的格式。
DNS请求包
请求包相对来说简单点,首先有一个固定大小为12字节的头部,接着是查询的问题。
固定头部
一个正常的DNS请求包,这两个部分都是必不可少的。头部的大小和结构都是固定的,如下图所示:
这里每一行是16位,两个字节。
ID: 长度为16位,是一个用户发送查询的时候定义的随机数,当服务器返回结果的时候,返回包的ID与用户发送的一致。
QR: 长度1位,值0是请求,1是应答。
Opcode: 长度4位,值0是标准查询,1是反向查询,2死服务器状态查询。
AA: 长度1位,授权应答(Authoritative Answer) - 这个比特位在应答的时候才有意义,指出给出应答的服务器是查询域名的授权
QR: 长度1位,值0是请求,1是应答。
Opcode: 长度4位,值0是标准查询,1是反向查询,2死服务器状态查询。
AA: 长度1位,授权应答(Authoritative Answer) - 这个比特位在应答的时候才有意义,指出给出应答的服务器是查询域名的授权
解析服务器。
TC: 长度1位,截断(TrunCation) - 用来指出报文比允许的长度还要长,导致被截断。
RD: 长度1位,期望递归(Recursion Desired) - 这个比特位被请求设置,应答的时候使用的相同的值返回。如果设置了RD,就建
TC: 长度1位,截断(TrunCation) - 用来指出报文比允许的长度还要长,导致被截断。
RD: 长度1位,期望递归(Recursion Desired) - 这个比特位被请求设置,应答的时候使用的相同的值返回。如果设置了RD,就建
议域名服务器进行递归解析,递归查询的支持是可选的。
RA: 长度1位,支持递归(Recursion Available) - 这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询。
Z: 长度3位,保留值,值为0.
RCode: 长度4位,应答码,类似http的stateCode一样,值0没有错误、1格式错误、2服务器错误、3名字错误、4服务器不支持、
RA: 长度1位,支持递归(Recursion Available) - 这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询。
Z: 长度3位,保留值,值为0.
RCode: 长度4位,应答码,类似http的stateCode一样,值0没有错误、1格式错误、2服务器错误、3名字错误、4服务器不支持、
5拒绝。
Questions: 长度16位,报文请求段中的问题记录数。
Answer RRs: 长度16位,报文回答段中的回答记录数。
Authority RRs: 长度16位,报文授权段中的授权记录数。
Adtional RRs: 长度16位,报文附加段中的附加记录数。
Questions: 长度16位,报文请求段中的问题记录数。
Answer RRs: 长度16位,报文回答段中的回答记录数。
Authority RRs: 长度16位,报文授权段中的授权记录数。
Adtional RRs: 长度16位,报文附加段中的附加记录数。
Question部分
这部分包含要查询的问题,可以由一到多个问题组成。每个问题由域名和查询类型以及查询类组成。
域名是这样存储的, 长度(一个字节)+域名的一部分+长度+域名的一部分+……+0,比如www.ifeng.com存储格式为为:3www5ifeng3com0 -- 对应的16进制为:
一个实际的查询www.ifeng.com的请求包
域名的后面分别是两个字节的Question Type和Question class
Question Type:长度16位,表示查询类型。取值大概如下:
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, //指定文本信息。 UINFO=0x64, //指定用户信息。 UID=0x65, //指定用户标识符。 GID=0x66, //指定组名的组标识符。 ANY=0xFF //指定所有数据类型。 };
Question class:长度为16位,表示分类。
enum QueryClass //指定信息的协议组。 { IN=0x01, //指定 Internet 类别。 CSNET=0x02, //指定 CSNET 类别。(已过时) CHAOS=0x03, //指定 Chaos 类别。 HESIOD=0x04,//指定 MIT Athena Hesiod 类别。 ANY=0xFF //指定任何以前列出的通配符。 };
DNS响应包
响应包也有一个与请求包相同格式,都是固定12字节的头部。其余部分包括Queries: 查询的问题(与请求包中的一样)
Answers:查询的问题的回答
Authoritative nameservers: 一些域名服务器(应该是与该本次查询有关的吧)
每个answer的结构包括:name, type, class, TTL, data length, data
下面举例说明:
name(2字节): c0 0c , c0表示后面的一个字节是一个偏移地址,该偏移地址中存储了一个名字,这样表示是为了节约空间,不过也增加了
复杂性。
type, class(各两字节):与前面描述相同
TTL(4字节):表示查询的地址的有效时间
data length(2字节):后面数据部分的长度
data:一个域名(查询域名的一个别名)或一个IP地址
type, class(各两字节):与前面描述相同
TTL(4字节):表示查询的地址的有效时间
data length(2字节):后面数据部分的长度
data:一个域名(查询域名的一个别名)或一个IP地址
我们来看一个实际的响应包
蓝色部分就是Queries部分,域名+type+class
上图蓝色部分对应的是一个answer, 前两个字节c0 0c指明名字在偏移地址0c中,即name是www.ifeng.com。紧接着两个字节
00 05是answer 的type, 00 05表示该answer是一个别名。再后面的两个字节00 01是answer的class, Internet类别。接着的四个字
节00 00 01 45,即十进制的325,单位是秒,也就是该地址的有效时间是325秒。00 16两个字节表示 data length,从03 77开始直
到c0 16的部分是answer的数据部分。该answer返回的是查询域名的一个别名
后面一个answer的解释如下
Authoritative nameservers格式与此相同,所不同的主要是type和class的值。
参考:
http://www.cnblogs.com/topdog/archive/2011/11/15/2250185.html
http://blog.csdn.net/lastsweetop/article/details/5692312
0 0
- DNS协议头
- DNS协议
- DNS协议
- DNS协议
- DNS 协议
- DNS协议
- DNS协议
- DNS协议
- DNS协议
- DNS协议
- DNS协议
- DNS协议
- 【协议分析】DNS协议
- DNS协议解析1--DNS请求协议
- DNS协议概述
- DNS使用什么协议
- DNS协议 报文格式
- DNS协议详解
- http://msdn.microsoft.com/zh-cn/library/system.web.webpages(v=vs.111).aspx
- [周末彩蛋福利] SAP Sybase ASA16.0 开发人员版 提供下载
- Ubuntu Linux的root passwd
- 线段树基础(1)
- 关于Canvas的记录
- DNS协议头
- win API之航空客运订票系统(课程设计)
- 第二十五天【java虐我千百遍,我待java如初恋】
- Wireshark捕获的outgoing_TCP包的IP_header_checksum_error问题
- 关于Server.MapPath 出现未将对象引用设置到对象的实例
- URI和URL的区别(转自博客源 just happy)
- apache mysql django 开发平台搭建
- Hadoop2.2.0源码分析(一)——Eclipse运行WordCount.java
- 拓胜第四天(请假)