zoukankan      html  css  js  c++  java
  • DNS消息格式

    一,简介

    空谈误国,要让一大堆抽象的DNS概念落地,还是需要了解DNS消息格式的,本文会尽量详细地介绍DNS消息格式的每一个字段。

    也可以移步rfc1035了解。

    二,概览

    DNS消息主要由五部分组成,如下图所示:

    Header 消息头部
    Question DNS请求
    Answer 回答请求的资源记录(Resource Record(s))
    Authority 指向域的资源记录
    Additional 其他资源记录

    三,头部格式

    头部消息的格式如下图所示:

    各字段的意义:

    Message ID 16位的消息ID标示一次正常的交互,该ID由消息请求者设置,消息响应者回复请求时带上该ID。
    QR 标示该消息是请求消息(该位为0)还是应答消息(该位为1)
    OPCODE   

    请求类型,目前有三类值:

    0  QUERY。标准查询

    1 IQUERY, 反向查询

    2 STATUS, DNS状态请求

    5 UPDATE, DNS域更新请求

    AA     只在响应消息中有效。该位标示响应该消息的域名服务器是该域中的权威域名服务器。因为Answer Section中可能会有很多域名
    TC 标示这条消息是否因为长度超过UDP数据包的标准长度512字节,如果超过512字节,该位被设置为1
    RD 是否递归查询。如果该位被设置为1,则收到请求的域名服务器会递归查询域名,需要注意的是,该位为1,域名服务器不一定会做递归查询,这取决于域名服务器是否支持递归查询。
    RA   在响应消息中清除并设置。标示该DNS域名服务器是否支持递归查询。
    RCODE  

    只在响应消息中有效,标示响应消息的类型:

    0  成功的响应

    1  格式错误--域名服务器无法解析请求,因为请求消息格式错误

    2   服务器错误--域名服务器因为内部错误无法解析该请求

    3   名字错误-- 只在权威域名服务器的响应消息中有效,标示请求中请求的域不存在

    4   Not Implemented--域名服务器不支持请求的类型

    5   Refused -- 域名服务器因为策略的原因拒绝执行请求的操作。例如域名服务器不会为特定的请求者返回查询结果,或者域名服务器不会为特定的请求返回特定的数据

    QDCOUNT 标示请求部分的条目数
    ANCOUNT   标示响应部分的资源记录数。如果响应消息中没有记录,则设置为0
    NSCOUNT   标示权威部分的域名服务器资源记录数。如果响应消息中没有权威记录,则设置为0
    ARCOUNT   标示额外部分的资源记录数。

     

    四 请求部分格式

    请求消息中包含要请求的内容,请求部分中包含QDCOUNT(往往是1)个条目,每个条目遵循下面的格式

    QNAME:请求的域名

    QTYPE

    QNAME

    请求的域名。这里需要注意的是域名的编码。请求的域名中没有“.”,域名中的“.”被编码为元信息,指示接下来的多少字节是有效信息。看个例子:

    我要请求www.google.com.hk的A记录。

    其中的QNAME段是:03 77 77 77 06 67 6f 6f 67 6c 65 03 63 6f 6d 02 68 6b 00

                                 w   w   w   .   g   o   o  g  l   e   .   c   o   m  .  h   k       

    其中的蓝色字体就是元信息                                              

    QTYPE

    请求的资源记录的类型,最常见的有:

    0x0001  A记录

    0x0002  NS记录

    0x0005  CNAME记录

    0x0006  SOA记录

    0x000B  WKS记录

    0x000C  PRT记录

    0x000F  MX记录

    0x0021  SRV记录

    0x0026 A6记录

    0x00FF  任何资源记录

    更多的资源记录见维基百科

    QCLASS

    请求的资源记录的类型,Internet或CHAOS?最主要的是:

    0x0001  IN 或 Internet

     

    五,DNS应答部分

    DNS的剩余三个部分有相同的格式:

      

    NAME

    请求的域名。需要注意的是,此处的域名有两种类型的标示防范,一是上面提到的元信息标示方法;二是指针法。

    指针法中请求的域名由一个16位的地址标示,该地址指向请求部分中的域名,它的地址是请求部分中域名距离消息开头的偏移量

    TYPE

    16位。定义了RDATA部分中的内容:

    0x0001  A记录

    0x0002  NS记录

    0x0005  CNAME记录

    0x0006  SOA记录

    0x000B  WKS记录

    0x000C  PRT记录

    0x000F  MX记录

    0x0021  SRV记录

    0x0026 A6记录

    0x00FF  任何资源记录

     CLASS  

    16位。响应的资源记录的类型,Internet或CHAOS?最主要的是:

    0x0001  IN 或 Internet

     TTL    32位。该资源记录被缓存的秒数。
     RDLENGTH 16位。RDATA部分的长度,单位是字节。 
     RDATA  

     不同类型的资源记录有不同的RDATA格式:

    SOA记录:

        Primary NS  变长类型,域中master的名字

        Admin MB   变长类型,域管理者的邮箱

        Serial Number   32位

        Refresh Interval  32位

        Retry Interval   32位

        Expiratio Limit  32位

        TTL  32位

    MX记录:

        Preference

        Main Exchanger 提供邮件服务的主机名

    A记录:

      IP地址,32位

    PRT,NS记录

      Name: 如果是PRT记录,则返回IP地址对应的域名;如果是NS记录,则返回NS。

     

     参考文献:

           · http://www.zytrax.com/books/dns/apd/rfc1035.txt

       · DNS以及所有标准归类http://en.wikipedia.org/wiki/Domain_Name_System

  • 相关阅读:
    小总结下iphone开发环境搭建过程!
    Raspberry Pi之旅 【序】
    linux虚拟机中配置samba的实现文件共享的方法
    编写高质量的代码1尽量使用StringBuilder
    ArcEngine开发点滴1
    开源Firebird .NET Provider V0.9.0.0发布
    .NET的Ant构建系统 NAnt 0.91发布!
    iis7.5 发布rest服务,put请求返回404错误 解决方法
    COM学习笔记(1)
    2004年南京美食地图 [转载]
  • 原文地址:https://www.cnblogs.com/cobbliu/p/2996333.html
Copyright © 2011-2022 走看看