DIY一个DNS查询器:了解DNS协议

转载 2016年08月30日 09:59:31
转自李鑫大牛的博客:http://www.cnblogs.com/topdog/archive/2011/11/15/2250185.html

        每当我们在浏览器上敲入任何一个域名访问某个网站的时候,我们都要使用Dns协议进行一次”域名:IP”的查询;作为命令行使用者,与dns有关用的最多的就是Nslookup 命令吧;作为程序员,以c#程序员为例,要得到一个域名的ip大概也是这么一行“System.Net.Dns.GetHostByName(string UriHostName)”。

在这简单使用的背面,很少人会真了解其协议的规则,这也许就是高度封装给程序员带来的一点麻烦吧。下面来了解一下dns协议的内容。

DNS结构:

整个dns分为5个部分,分别为Header、Question、Answer、Authority、Additional。

header

其中头部的大小是固定的为12字节。这5个部分不是全部都是必须的,在向服务器发送查询请求的时候,只需要前2个。回复的时候也不一定包含5个(按查询的内容和返回的信息而定)。

Header 部分:

header头部分是必须的,无论发送查询或者返回结果都需要该部分,且长度一定,为12字节。结果如下图

header2

ID:长度为16位,是一个用户发送查询的时候定义的随机数,当服务器返回结果的时候,返回包的ID与用户发送的一致。

QR:长度1位,值0是请求,1是应答。

Opcode:长度4位,值0是标准查询,1是反向查询,2死服务器状态查询。

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

TC:长度1位,截断(TrunCation) - 用来指出报文比允许的长度还要长,导致被截断。

RD:长度1位,期望递归(Recursion Desired) - 这个比特位被请求设置,应答的时候使用的相同的值返回。如果设置了RD,就建议域名服务器进行递归解析,递归查询的支持是可选的。

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

Z:长度3位,保留值,值为0.

RCode:长度4位,应答码,类似http的stateCode一样,值0没有错误、1格式错误、2服务器错误、3名字错误、4服务器不支持、5拒绝。

QDCount:长度16位,报文请求段中的问题记录数。

ANCount:长度16位,报文回答段中的回答记录数。

NSCOUNT :长度16位,报文授权段中的授权记录数。

ARCOUNT :长度16位,报文附加段中的附加记录数。

Question 部分:

这部分的内容是你要查询的内容。也是必须的。

question

QName:是你要查询的域名,属于不定长字段。他的格式是“长度(1字节)+N字节内容(N由前面的长度定义)+~~~+长度0。以一个长度单位N为开始,然后连续的N字节为其内容,然后又是一个N2长度的一字节,然后后面又是N2个字节内容,直到遇到长度为0的长度标记。

QType:长度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 //指定所有数据类型。 
};

QClass:长度为16位,表示分类。

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

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

 

资源结构:

接下来的3个结构,格式可以说相同。都是如下图的结构和字段。

re

Name:回复查询的域名,不定长。 这里的名字和Question结构的名字是一样的,在这里详细说一下。

假设name字段的内容如下

05 6c 69 78 69 6e 02 6d 65 0

第一个字节是长度:5,那么接下来的5个字节都是内容6c 69 78 69 6e ,ascii码转过来是“lixin”。然后又是长度2,后面2个字节的内容6d 65 字母为me,然后是长度0,表示结束了。最后还要把两段文字组合起来中间加点号成lixin.me。

但是,在question结构是这样,在之后的资源结构中,如果name字段的内容前面有出现了,那么他就不会再浪费空间去重复记录,而是指向某个前面出现了name的位置。如:

在question结构中的name字段的内容为lixin.me,即“05 6c 69 78 69 6e 02 6d 65 0”。然后在第3个结构中的answer中,第一个字段name的内容也是lixin.me,那么他会指向question中的name地址,让我们去那个地址读name内容。所以此时answer结构的name字段的内容为:

C0 0C

C0:这时不是表示接下来的内容有多长,而是接下来的内容在偏移量中,

0C:十进制是12的意思,就是偏移12个字节。从头开始12位,因为Header结构是固定的12字节,所以偏移0C就是到了Question的Name字段,即上面的“05 6c 69 78 69 6e 02 6d 65 0”。

 

Type:同上QType。

Class:同上QClass。

TTL:生存时间。4字节,指示RDATA中的资源记录在缓存的生存时间。

RDLength:资源的长度。

RDdata:资源的内容。


在下一篇将讲讲具体开发一个dns查询器的方法。先预报一下,程序还没弄全好,使用的是c#,目前完成了大概70%。


C#实现DNS解析服务

解析服务需用到开源控件库:ARSoft.Tools.Net。 首先简单介绍一下ARSoft.Tools.Net,ARSoft.Tools.Net是一个非常强大的开源DNS控件库,包含.Net S...
  • wenxian31
  • wenxian31
  • 2013年06月20日 11:25
  • 1428

DIY一个DNS查询器:了解DNS协议

转自李鑫大牛的博客:http://www.cnblogs.com/topdog/archive/2011/11/15/2250185.html         每当我们在浏览器上敲入任何一个...
  • VHeroin
  • VHeroin
  • 2016年08月30日 09:59
  • 613

DNS协议

DNS协议   前言   金天看了一点阅兵,感觉祖国比着刚成立的时候强大多了,不知怎么回事,就是这么单纯的看着阅兵开始,就有一种自豪感油然而生,我不知道啥叫参与...
  • shanyongxu
  • shanyongxu
  • 2015年09月03日 16:18
  • 612

DIY一个DNS查询器:程序实现

转自李鑫大牛的博客:http://www.cnblogs.com/topdog/archive/2011/11/21/2257597.html 上一篇文章《DIY一个DNS查询器:了...
  • VHeroin
  • VHeroin
  • 2016年08月30日 11:03
  • 471

为宽带网络提速 自制本地DNS服务器

我们在安装宽带网时,ISP(因特网服务供应商)通常都会提供几个DNS服务器地址,然后在Internet的TCP/IP协议设置窗口中进行设置。目前,由DNS引起的网络问题相信大家都曾遇到过,例如网页打开...
  • Galdys
  • Galdys
  • 2012年01月30日 11:44
  • 1551

DIY一个简易查询系统

前段时间应网友需求计划做一个简洁的"中药毒副作用查询"小工具,本文介绍基本的设计和关键,以及源代码......
  • dalerkd
  • dalerkd
  • 2015年10月19日 10:58
  • 821

DNS协议浅析

我们都知道,在上网时需要在浏览器中输入相应的ip地址才能访问到需要的页面。但是ip地址由32位的二进制来表示,很显然,这很难记。但是用户更愿意记www.baidu.com这样直观的名称。因此这就需要D...
  • zhouwei1221q
  • zhouwei1221q
  • 2015年04月19日 14:43
  • 258

深入浅出DNS系列(三)- DNS相关协议

DNS的相关协议《RFC1034》、《RFC1035》说明
  • jiangsd198
  • jiangsd198
  • 2017年03月08日 21:45
  • 848

DNS工作原理及其过程

DNS服务器所提供的服务是完成将主机名或域名转换为IP地址的工作。为什么需要将主机名或域名转换为IP地址的工作呢?这是因为,当网络上的一台客户机访问某一服务器上的资源时,用户在浏览器地址栏中输入的是便...
  • weiyongtao87
  • weiyongtao87
  • 2013年08月20日 23:06
  • 6179

深入理解DNS(域名系统)

DNS,全称Domain Name System,即域名系统。 实现主机名和IP地址的转换,将容易记忆的主机名转换成主机IP地址。 DNS的历史介绍。 DNS服务器。 域名的资源记录,常见的D...
  • a1459268562
  • a1459268562
  • 2017年06月01日 17:57
  • 268
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DIY一个DNS查询器:了解DNS协议
举报原因:
原因补充:

(最多只允许输入30个字)