Dns解析(下)

原创 2002年03月19日 09:15:00

Dns解析()

上篇讲述了Dns的查询包和发送,本文将分析Dns的返回包。

下面这段程序是从Dns服务器上得到dns的返回包:

ID_Packet=new DatagramPacket(new byte[Constant.DNSUDPLEN],

Constant.DNSUDPLEN);

ID_Socket.receive(ID_Packet);

这里的变量已在上篇中定义了,Constant.DNSUDPLEN512

接下来就只要将这数据解压缩就可以了。这里就涉及了RR的格式了(Resource Record Format)。

这是在rfc文档中定义的RR格式。

NAME:就是在question中的QNAME

TYPEquestion中的QTYPE

CLASSquestion中的QCLASS

RDLENGTHRDATA的长度;

RDATA:返回的数据,这才是真正有用的数据,也是我们要解析的东西。

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

因为其数据是被压缩的,所以得想知道他的压缩格式:

他的压缩方式是将在数据中重复出现的字符放在一起,然后再字符出现的地方加上一个偏移位置,即如上图所示,16位的数据以11开头,后跟偏移量。偏移量是从信息的头部开始算得。下面是一个rfc文档中的例子:

0  1   2   3   4  5  6  7   8  9  A   B  C  D  E  F

 

这个结果是:在40位置的域名是FOO.F.ISI.ARPA

了解了他的压缩方式,解析就简单了。

上篇中在Header中我们已提到ANCOUNT这个字段,他表示的是回复中结果的数目,我们相见他解析出来:

public int getAnswerCount()

    {

        int INDEX=6;

        byte[] AnCountArray=new byte[2];

       

        System.arraycopy(message,INDEX,AnCountArray,0,2);

        return DnsTool.BytesToInt(AnCountArray);//byte[]变为int

    }

得到了ANCOUNT,就可以解释结果了:

public Vector parseAnswer()

    {

        int theOffset=8;

        int pos=thePosOfAnswer;(thePosOfAnswer是你发得dns包的长度)

        int i=0,p;

        int RDlength;

        byte[] tmp;

        String Name="";

Vector IV_ Answer=new Vector();

       

        //get return name from message

        while(i<getAnswerCount())

        {

            Name="";

            //get type

            pos+=2;

            tmp=new byte[2];

            System.arraycopy(message,pos,tmp,0,2);

           

            if(DnsTool.BytesToInt(tmp)==Constant.TYPE_MX)//check the type

            {

                pos+=theOffset;

                //get RDlength

                tmp=new byte[2];

                System.arraycopy(message,pos,tmp,0,2);

                RDlength=DnsTool.BytesToInt(tmp);

               

                pos+=4;

                p=pos;

                while((pos-p)<RDlength-2)

                {

                    if((message[pos]&0xC0)==0xC0)

                    {

                        //this is a offset

                        Name+=getPrior((message[pos]&0x3F)

|(message[pos+1]&0xFF));

                        pos+=2;

                    }

                    else

                    {

                        //not offset

                        tmp=new byte[message[pos]];

                        System.arraycopy(message,pos+1,tmp,0,tmp.length);

                        pos+=message[pos]+1;

                       

                        if(message[pos]!=0)

                            Name+=new String(tmp)+".";

                        else

                            Name+=new String(tmp);

                    }

                }

            }

         IV_Answer.addElement(Name);  

         i++;  

        }

    }

函数Stirng getPrior(int)是根据其偏移量等到所要的字符串,这是一个递归函数:

private String getPrior(int j)

    {

        byte[] tmp;

        String Name="";

       

        while(message[j]!=0)

        {

            if((message[j]&0xC0)==0xC0)

            {

                String mid=getPrior((message[j]&0x3F)|(message[j+1]&0xFF));

                Name+=mid;

                j+=mid.length()+1;

            }

            else

            {

                tmp=new byte[message[j]];

                System.arraycopy(message,j+1,tmp,0,tmp.length);

                j+=message[j]+1;

                if(message[j]!=0)

                    Name+=new String(tmp)+".";

                else

                    Name+=new String(tmp);

            }

        }

        return Name;

    }

我们只介绍了mail地址的dns解析,其他几类都大同小异,如需要可参考rfc1035


 

分钟看懂DNS解析基础

今天讲述域名系统和互联网作为一个整体是如何工作的,域名系统:也就是很多IT酷小子和社团联盟熟知的DNS。但不幸的是,很有权人士和其他人并不了解DNS到底是什么鬼 DNS是什么,他是怎么工作的 如何...
  • qq_27489007
  • qq_27489007
  • 2016年09月27日 22:12
  • 958

DNS解析过程原理【深入浅出详解】

DNS解析过程原理【深入浅出详解】 2013年06月06日 ⁄ 搜索引擎优化 ⁄ 共 1523字 ⁄ 评论数 3 ⁄ 阅读 401 次 DNS速度优化是网站优化SE...
  • pi9nc
  • pi9nc
  • 2013年09月03日 19:23
  • 1900

Windows中的DNS服务——正向解析&反向解析配置

坚信并为之坚持是一切希望的原因。 DNS服务是AD域不可或缺的一部分,我们在部署AD域环境时已经搭建了DNS服务(windows server 2008 R2域中的DC部署),但是DNS服务的作...
  • zhaohuihui6628
  • zhaohuihui6628
  • 2015年07月16日 20:21
  • 9895

ios DNS解析和网络测试

IOS DNS解析和网络测试
  • u010140921
  • u010140921
  • 2015年03月12日 20:44
  • 1752

网站建设(附加1)——域名的(DNS)解析设置

如果你是第一次设置DNS的解析,看到下面的设置选项,是不是很晕?下面将逐一介绍各个设置项的含义,如A记录、AAAA记录、CNAME记录、MX记录、TXT记录、Local DNS、公共DNS等。...
  • luoweifu
  • luoweifu
  • 2016年04月06日 15:13
  • 3322

DNS域名解析过程

前言 本文来自《深入分析Java Web技术内幕》一书,因为本人对DNS不是特别熟悉,这本书关于DNS的部分也已经讲得比较详细了,所以就直接把书里面的内容拿来用了。老规矩,不复制、不黏贴,全部内容手...
  • zhangyuan19880606
  • zhangyuan19880606
  • 2016年04月13日 11:17
  • 1955

dns工作过程及原理 (linux dns及android dan的实现差异)

dns原理、dns工作过程、dns的实现、linux dns配置原因、android dns的实现框图。 前言本文分析dns工作过程及原理,给一个简单的dns实现代码流程,并针对linux及andro...
  • zjli321
  • zjli321
  • 2017年01月10日 18:38
  • 1708

dns解析相关代码分析

转载至:http://blog.chinaunix.net/uid-23242010-id-93354.html TrafficServer提供了DNS解析相关的功能,相关模块为iocore/dns...
  • aly1989
  • aly1989
  • 2016年07月03日 22:42
  • 659

DNS原理总结及其解析过程详解

一、域名系统 1、域名系统概述         域名系统DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为IP地址。域名系统其实就是名字系统...
  • yipiankongbai
  • yipiankongbai
  • 2014年05月07日 13:10
  • 58375

DNS解析过程详解

先说一下DNS的几个基本概念:     一. 根域 就是所谓的“.”,其实我们的网址www.baidu.com在配置当中应该是www.baidu.com.(最后有一点),一般我们在浏览器里输...
  • jiazhanwei365
  • jiazhanwei365
  • 2013年05月29日 00:26
  • 38033
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Dns解析(下)
举报原因:
原因补充:

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