DNS 协议结构

DNS协议使用UDP和TCP端口53,其中UDP用于大多数查询,而TCP用于区域传送和较大响应。DNS消息由几个字段组成,包括头部、问题部分、回答部分、权威部分和附加部分。

DNS 消息头部

头部是固定的12字节,由以下字段组成:

  1. ID(16位): 唯一标识符,用于匹配请求和响应。
  2. Flags(16位): 标志字段,包括:
  • QR(1位):查询(0)或响应(1)。
  • Opcode(4位):操作码,标准查询为0。
  • AA(1位):权威回答标志。
  • TC(1位):可截断标志。
  • RD(1位):期望递归标志。
  • RA(1位):递归可用标志。
  • Z(3位):保留位,通常为0。
  • RCODE(4位):返回码,表示响应状态。
  1. QDCOUNT(16位): 问题数。
  2. ANCOUNT(16位): 回答资源记录数。
  3. NSCOUNT(16位): 权威资源记录数。
  4. ARCOUNT(16位): 附加资源记录数。
DNS 问题部分

问题部分包含查询信息,由以下字段组成:

  1. QNAME(可变长度): 查询的域名。
  2. QTYPE(16位): 查询的类型,如A(IPv4地址)、AAAA(IPv6地址)、MX(邮件交换)。
  3. QCLASS(16位): 查询的类,通常为IN(互联网)。
DNS 资源记录部分

资源记录部分(回答部分、权威部分、附加部分)结构相同,由以下字段组成:

  1. NAME(可变长度): 域名。
  2. TYPE(16位): 记录类型,如A、AAAA、MX、NS等。
  3. CLASS(16位): 类,通常为IN。
  4. TTL(32位): 生存时间,记录缓存时间。
  5. RDLENGTH(16位): RDATA长度。
  6. RDATA(可变长度): 资源数据,根据类型不同格式不同。

DNS 消息示例

下面是一个简单的DNS查询和响应示例:

查询:解析域名 www.example.com 的 A 记录
  1. ID: 0x1a2b
  2. Flags: 0x0100 (标准查询, 期望递归)
  3. QDCOUNT: 1
  4. ANCOUNT: 0
  5. NSCOUNT: 0
  6. ARCOUNT: 0
  7. QNAME: www.example.com
  8. QTYPE: A (0x0001)
  9. QCLASS: IN (0x0001)
响应:返回 www.example.com 的 A 记录
  1. ID: 0x1a2b
  2. Flags: 0x8180 (响应, 权威回答, 递归可用)
  3. QDCOUNT: 1
  4. ANCOUNT: 1
  5. NSCOUNT: 0
  6. ARCOUNT: 0
  7. QNAME: www.example.com
  8. QTYPE: A (0x0001)
  9. QCLASS: IN (0x0001)
  10. NAME: www.example.com
  11. TYPE: A (0x0001)
  12. CLASS: IN (0x0001)
  13. TTL: 3600
  14. RDLENGTH: 4
  15. RDATA: 93.184.216.34

解码分析示例

假设我们通过网络抓包工具(如Wireshark)抓取了一段DNS查询的报文,可以看到以下字节序列:

0001 0000 0001 0000 0000 0000 0377 7777
0765 7861 6d70 6c65 0363 6f6d 0000 0100
01

将其解码为:

  • ID: 0x0001
  • Flags: 0x0000 (标准查询)
  • QDCOUNT: 0x0001 (1 个问题)
  • ANCOUNT: 0x0000 (0 个回答)
  • NSCOUNT: 0x0000 (0 个权威)
  • ARCOUNT: 0x0000 (0 个附加)
  • QNAME: www.example.com
  • QTYPE: 0x0001 (A 记录)
  • QCLASS: 0x0001 (IN)

通过这样的方式,我们能够解析DNS报文的内容,并理解每个字段的具体含义。