DNS报文格式解析

DNS数据包一般走的协议是UDP,而且请求和答复的报文格式其实是一样的。请求只包含Question部分,而答复包含Question和Answer

Header – 报头
Question – 请求的DNS数据
Answer – DNS的答复
DNS报文格式

Header 报头

报头的数据格式如下(LSB First):

  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                     ID                        |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR|   Opcode  |AA|TC|RD|RA|    Z   |   RCODE   |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   QDCOUNT                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   ANCOUNT                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   NSCOUNT                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   ARCOUNT                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  • ID: 16位的ID。这个ID在响应请求的时候将会被复制,这样客户端就可以将请求和回复对应上。
  • QR:0代表这是一个请求,1代表这是一个回复。
  • Opcode:指示当前进行的操作
    • 0:普通DNS查询
    • 1:反向DNS查询
    • 2:查询服务器状况
  • AA:Authorative Answer,指示当前回复是否权威。
  • TC:TrunCated. 1代表当前小心因为过长而被切割了。
  • RD:Recursion Desired。客户端希望服务器进行迭代查询(向上层服务器转发查询)。
  • RA:Recusion Available。指示当前服务器支持迭代查询。
  • Z:保留。目前设为0
  • RCODE:Response Code
    • 0:没有错误 (NOERROR)
    • 1:入包格式错误 (FORMERR)
    • 2:服务器错误 (SERVFAIL)
    • 3:域名不存在 (NXDOMAIN)
    • 4:未实现 (NOTIMPL),已弃用
    • 除此之外还有很多不常用的。
  • QDCOUNT:问题的个数
  • ANCOUNT:答案的个数
  • NSCOUNT:权威服务器的数量(一般用不到,为0)。
  • ARCOUNT:额外信息的数量(一般用不到,为0)。

Question部分格式

  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                                               |
/                     QNAME                     /
/                                               /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                     QTYPE                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                     QCLASS                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  • QNAME:一个特殊格式的分段字符串。每一段的格式如下
    • 长度:一个字节(8位)的数字,指示当前这一段的长度,如0x03
    • 内容:如上长度的内容,比如0x777777,代表www
    • 每段之间是一个.
    • 长度为0(0x00)代表整个字符串的结束。
  • QTYPE:请求的类型
    • 1:Type A,请求IPv4的IP地址(A记录)。
    • 2:Type.NS,请求域名服务器(NS记录)。
    • 3:Type.AAAA,请求IPv6的IP地址(AAAA记录)。
    • 5:Type.CNAME,请求一个CNAME记录
    • 其他还有很多
  • QCLASS:
    • 1:IN,代表Internet。99.999999%的DNS记录都是IN。
    • 其他还有类似CH(CHAOS), HS(Hesiod)等记录,但是没人用过它们。

Answer部分格式

  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                                               |
/                                               /
/                    NAME                       /
|                                               |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    TYPE                       |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   CLASS                       |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                     TTL                       |
|                                               |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   RDLENGTH                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
/                    RDATA                      /
/                                               /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  • NAME:同QNAME
  • TYPE:同QTYPE
  • CLASS:同QCLASS
  • TTL:Time To Live,这条记录的有效时长(秒)
  • RDLENGTH:RDATA部分的长度
  • RDATA:回复的消息,根据TYPE的不同而有所不同。例如,如果TYPE为1(A)的话,RDATA就是一系列的32位数字,代表IP地址。

Leave A Comment