DNS 协议结构
DNS协议使用UDP和TCP端口53,其中UDP用于大多数查询,而TCP用于区域传送和较大响应。DNS消息由几个字段组成,包括头部、问题部分、回答部分、权威部分和附加部分。
DNS 消息头部
头部是固定的12字节,由以下字段组成:
- ID(16位): 唯一标识符,用于匹配请求和响应。
- Flags(16位): 标志字段,包括:
- QR(1位):查询(0)或响应(1)。
- Opcode(4位):操作码,标准查询为0。
- AA(1位):权威回答标志。
- TC(1位):可截断标志。
- RD(1位):期望递归标志。
- RA(1位):递归可用标志。
- Z(3位):保留位,通常为0。
- RCODE(4位):返回码,表示响应状态。
- QDCOUNT(16位): 问题数。
- ANCOUNT(16位): 回答资源记录数。
- NSCOUNT(16位): 权威资源记录数。
- ARCOUNT(16位): 附加资源记录数。
DNS 问题部分
问题部分包含查询信息,由以下字段组成:
- QNAME(可变长度): 查询的域名。
- QTYPE(16位): 查询的类型,如A(IPv4地址)、AAAA(IPv6地址)、MX(邮件交换)。
- QCLASS(16位): 查询的类,通常为IN(互联网)。
DNS 资源记录部分
资源记录部分(回答部分、权威部分、附加部分)结构相同,由以下字段组成:
- NAME(可变长度): 域名。
- TYPE(16位): 记录类型,如A、AAAA、MX、NS等。
- CLASS(16位): 类,通常为IN。
- TTL(32位): 生存时间,记录缓存时间。
- RDLENGTH(16位): RDATA长度。
- RDATA(可变长度): 资源数据,根据类型不同格式不同。
DNS 消息示例
下面是一个简单的DNS查询和响应示例:
查询:解析域名 www.example.com 的 A 记录
- ID: 0x1a2b
- Flags: 0x0100 (标准查询, 期望递归)
- QDCOUNT: 1
- ANCOUNT: 0
- NSCOUNT: 0
- ARCOUNT: 0
- QNAME: www.example.com
- QTYPE: A (0x0001)
- QCLASS: IN (0x0001)
响应:返回 www.example.com 的 A 记录
- ID: 0x1a2b
- Flags: 0x8180 (响应, 权威回答, 递归可用)
- QDCOUNT: 1
- ANCOUNT: 1
- NSCOUNT: 0
- ARCOUNT: 0
- QNAME: www.example.com
- QTYPE: A (0x0001)
- QCLASS: IN (0x0001)
- NAME: www.example.com
- TYPE: A (0x0001)
- CLASS: IN (0x0001)
- TTL: 3600
- RDLENGTH: 4
- 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报文的内容,并理解每个字段的具体含义。