案例吐个槽,命苦啊,要自己动手解包。

另外,这里的内容是半路找来的,如果有冲突,自行翻阅rfc1035。我还没校正过。

The Structure

如下图:

所有的DNS message都包含了下面这几个部分:

1、HEADER。基本上HEADER都是些概述啥的。

2、QUESTION。描述你的请求,比如,www.qkdemo.com的IP是多少。

3、Answer。描述你的应答,比如,www.qkdemo.com的IP是1.2.3.4。

4、不知道干吗的。

5、继续不知道。

DNS HEADER部分

首先,需要明确一下DNS的message的结构:

如上图所示,不管是DNS的query还是response,DNS message都分为这么几个部分:

1、上图每行表示一个16bit的数,也就是两个byte。

2、ID是这个message的编号,response会把query的id给copy过来,好让请求的program识别response是哪一个。一个16bit的随机数。

3、ID之后的flag是一个组合的双字节,包括了:

  • QA.1:message的类型,0是query,1是response
  • Opcode.4:query的类型。0000表示是一个标准的query。
  • AA.1:没看懂是干嘛的,但是貌似对我没用。设0是没问题的。
  • TC.1:继续设0。
  • RD.1:Recursion Desired,query是否请求递归,1表示请求,0则不需要。继续设0是可以的,bonjour里面是这么干的。
  • RA.1:Recursion Available,递归是否可用。和上面这个是有关系的,但是是response里面带来的。
  • Z.3:保留字段。所有的保留字段都是渣。不过,反正不是标准请求的,你可以自己爱怎么玩怎么玩。
  • RCODE.4:这个是response必须要要带的一部分。0表示没有错误,1表示query格式错了,2表示server自己出问题了,3表示name没找到,4表示query的类型server没法处理,5表示拒绝进行解析。
  • 所以,我的心得是,对于一个标准的query,设0x0000就好了;对于一个标准的response,设0x8000也没问题。

4、我带了几个请求。设成1表示只有一个。恩,我们就设1就好了。

5、我带了几个answer。0表示我带了0个解答。

6、服务器上有几条记录?我没搞懂。但是,可以忽略这个字段的值。

7、有几条额外的记录?继续搞不懂。好吧,继续忽略。

Question描述域

Question分为三个部分,如图:


具体讲来:

1、QNAME:这里是要请求的域名的描述。以上面www.qkdemo.com为例,描述为3www6qkdemo3com00;如果是qkdemo.local,则为6qkdemo5local00。

2、QTYPE:请求的类型。A记录是0x0001。Bonjour里面query的类型是0x00ff,wireshark解释是any。

3、QCLASS:请求的类。Bonjour里面用的0x8001,而且wireshark是分成两部分来解读的,大概是1+7,前面是query,后面是class。0x0001表示internet address。

Answer域

Answer域稍微复杂一点,有6个域:

1、NAME,和上面QNAME的描述方式是一样的。

2、TYPE,和上面QTYPE含义是一样的。局域网里胡乱收来的一个包把这个域设为0x00,不知道搞飞机。

3、同QCLASS。

4、TTL,这个结果灰白cache多久。

5、下面的RDATA有多长。

6、这个域的描述方法根据class不同。比如,如果class是一个A记录,表示地址,那么它就是一个IP地址;如果是0x000f,表示是一个邮件服务器,那么,它包含了preference和cname两个部分。

DNS message的压缩

作为互联网使用最频繁的机制之一,所占我们网络日常开销的比重是相当相当大滴!所以,需要考虑怎么来减小message的大小。这里的压缩主要是减少重复信息。

使用压缩的主要有三种内容:QNAME,NAME,RDATA。

压缩的方式也很简单:保存一个指针,指向这一数据第一次出现的地址。比如,假设我们某query携带三个Question,而有两个Question的QNAME是一样的,那么第二个QNAME的位置,就会放着一个指向第一个QNAME的指针。

该指针占了16bit的空间,而且,前两个bit必须是11。因为域名的每个部分必须在63 Byte以内,所以,域名每个部分长度(label,www.qkdemo.com有三个部分,就有三个label)写作0x0000格式时,它的最高两位不会是11,这样,pointer和label就被区别开来。至于offset,offset为零,代表了header中ID部分的第一个Byte,后面的一次计算。

另外需要注意的是,如果我们在RDATA中使用了压缩,那么,我们在计算RDATA长度时,使用的将是2,即一个Pointer的长度,而不是域名本来的长度。

举例,我们先假设忽略message里面的其它域,假设我们先后使用了F.ISI.ARPA,FOO.F.ISI.ARPA和ARPA三个域名,那么,我们可以将message压缩:

如上,F.ISI.ARPA是从20位置开始,那么FOO.F.ISI.ARPA就可以表示为3F 00 E0(E0是0b1110 0000),而ARPA则可以表示为E6。需要注意的是,一个比较容易忽视的问题,offset是从0开始的,所以清点byte的个数后记得减一。

一个response的例子

暂缺,重启后有心情再添加。

其它

multiCast DNS的文档是rfc6762,可查阅:http://tools.ietf.org/html/rfc6762

DNS message解析的更多相关文章

  1. 114 的 dns 的解析测试

    114 的 dns 号称使用  BGP Global AnyCast 技术多点部署 的方式, 可以将用户请求导向到"就近"的服务器,理论上是可以得到域名网络就近解析的IP的,所以将 ...

  2. 前端优化:DNS预解析提升页面速度

    在网页体验中我们常会遇到这种情况,即在调用百度联盟.谷歌联盟以及当前网页所在域名外的域名文件时会遇到请求延时非常严重的情况.那么有没有方法去解决这种请求严重延时的现象呢? 一般来说这种延时的原因不会是 ...

  3. ping通网关 ping不能外网  DNS无法解析

       ###ping通网关 ping不能外网  DNS无法解析 客户上不了网 DNS解析不了  首先登陆机器 先查看IP  然后看dns是否正常 然后测试ping网关  ping外网 nslookup ...

  4. dns-prefetch—DNS预解析技术

    今天在看一个网站的源代码时 发现了 <link rel="dns-prefetch" href="//static.tuweia.cn/"> 对dn ...

  5. 前端性能优化之-dns预解析

    预解析的实现: 1. 用meta信息来告知浏览器, 当前页面要做DNS预解析:<meta http-equiv="x-dns-prefetch-control" conten ...

  6. DNS预解析prefetch

    前面的话 本文将详细介绍DNS预解析prefetch的主要内容 概述 DNS(Domain Name System, 域名系统),是域名和IP地址相互映射的一个分布式数据库.DNS 查询就是将域名转换 ...

  7. linux系统下部署DNS正向解析

    DNS服务概述: DNS(Domain Name System)域名系统,能够提供域名与IP地址的解析服务. 正向解析 正向解析是指域名到IP 地址的解析过程. 部署DNS正向解析 DNS服务的三个配 ...

  8. DNS 预解析

    DNS 解析也是需要时间的,可以通过预解析的方式来预先获得域名所对应的 IP. <link rel="dns-prefetch" href="//yuchengka ...

  9. DNS预解析dns-prefetch提升页面载入速度优化前端性能

    当浏览器请求一个URL的时候,通过firebug我们可以发现大概有以下几个过程:阻挡.域名解析.建立连接.发送请求.等待响应.接收数据.后面四个跟用户的网络情况和你的服务器处理速度有关,本文重点说说前 ...

随机推荐

  1. Poj1182 食物链(并查集/带权并查集)

    题面 Poj 题解 这里采用并查集的补集. \(x\)表示同类集合,\(x+n\)表示敌人集合,\(x+n\times2\)表示敌人的敌人集合. 如果当前给出的是一对同类关系,就判断\(x\)是否吃\ ...

  2. POJ 3662 Telephone Lines (分层图)

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6785   Accepted: 2498 D ...

  3. EasyUI学习总结(六)——EasyUI布局(转载)

    本文转载自:http://www.cnblogs.com/xdp-gacl/p/4088198.html 一.EasyUI布局介绍 easyUI布局容器包括东.西.南.北.中五个区域,其中中心面板是必 ...

  4. Spring 概念详解

    一.Spring的IoC(Inversion of Control). 这是Spring中得有特点的一部份.IoC又被翻译成“控制反转”,也不知道是谁翻译得这么别扭,感觉很深奥的词.其实,原理很简单, ...

  5. .Net中DataGridview数据如何导出到excel表

    首先,这个问题在网上有很多答案,也有很多解决的方法.其次,很多人写过类似的博客 .我的这篇博客,主要是写给那些刚刚接触或接触不久.NET并使用其做程序的人,更是写个自己,记录一下方法,方便以后使用. ...

  6. codevs 1014 装箱问题 2001年NOIP全国联赛普及组

    题目描述 Description 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若 ...

  7. 【最小生成树】【kruscal】【贪心】CDOJ1636 梦后楼台高锁,酒醒帘幕低垂

    首先,考虑到,我们需要找到一条路径,使它的最小边尽量大,最大边尽量小 然后,考虑到m比较小,我们可以去寻找一个m^2或者m^2logm的算法 考虑枚举最小边,那么我们就需要在m或者mlogm的时间内找 ...

  8. [bzoj1010](HNOI2008)玩具装箱toy(动态规划+斜率优化+单调队列)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有 的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...

  9. JS零基础一步一步做应用全记录

    1.起因 作为几个外卖重度依赖癌晚期患者,呆宿舍的时候几个人一起叫外卖已经是常事.偶然看到隔壁宿舍在饿了么订餐的时候,看到在饿了么的首页上有一个谁去拿外卖的一个小游戏/工具,感觉这个小细节,饿了么把握 ...

  10. Android内存优化8 内存检测工具2 LeakCanary——直白的展现Android中的内存泄露

    之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用.直到今天终于发现了这个新工具: 当我们的App中存在内存泄露时会在通知栏弹出通知: 当点击该通知时,会跳转到具体的 ...