DNS报文含头部(ID/标志/计数)、查询(QNAME/QTYPE/QCLASS)及回答(NAME/TYPE/CLASS/TTL/RDLENGTH/RDATA),如查询example.com的A记录,返回
DNS报文格式详解与实例分析
DNS协议
域名系统(Domain Name System, DNS)是互联网的核心基础设施,负责将人类可读的域名转换为机器可识别的IP地址,DNS基于UDP协议工作(标准端口53),采用分层查询机制,其核心数据单元为DNS报文,本文将通过报文格式解析和实例演示,深入剖析DNS通信原理。
DNS报文结构
DNS报文由头部(Header)、查询问题(Question)和资源记录(Resource Record)三部分组成,整体结构如下:
区域 | 长度(字节) | 说明 |
---|---|---|
头部 | 12 | 固定长度 |
查询问题 | 可变 | 包含域名和查询类型 |
资源记录 | 可变 | 回答部分(含多条记录) |
头部格式(12字节)
字段名 | 长度(bit) | 说明 |
---|---|---|
标识符 | 16 | 唯一匹配请求与响应的编号 |
标志位 | 16 | 包含QR、Opcode、AA、TC、RD等控制位 |
问题计数 | 16 | 后续查询问题的数量(通常为1) |
回答记录数 | 16 | 返回的回答记录数量 |
授权记录数 | 16 | 返回的权威记录数量 |
额外记录数 | 16 | 附加信息记录数量(如域名压缩指针) |
标志位详解(16位)
位置(bit) | 字段名 | 长度(bit) | 说明 |
---|---|---|---|
01 | QR | 2 | 00=查询,01=响应 |
23 | Opcode | 4 | 操作码(0=标准查询,1=反向查询,2=服务器状态请求等) |
4 | AA | 1 | 权威应答标志(仅响应报文有效) |
5 | TC | 1 | 报文截断标志(因UDP长度限制) |
6 | RD | 1 | 递归查询标志(客户端要求递归查询) |
715 | RCODE | 8 | 响应码(0=无错误,1=格式错误,2=服务器失败等) |
查询问题(Question Section)
该部分包含待解析的域名和查询类型,格式如下:
字段名 | 长度(字节) | 说明 |
---|---|---|
查询名称 | 可变 | QNAME字段(域名的标签编码) |
查询类型 | 2 | QTYPE字段(如A=1,MX=15等) |
查询类 | 2 | QCLASS字段(通常为IN=1,即互联网) |
QNAME编码规则
- 域名按标签分割(如
www.example.com
→www
、example
、com
) - 每个标签长度(1字节)+ 标签内容(最多63字节)
- 末尾添加0字节表示结束
资源记录(Resource Record)
资源记录包含以下字段,用于返回查询结果或附加信息:
字段名 | 长度(字节) | 说明 |
---|---|---|
NAME | 可变 | 域名(与查询问题相同则用指针) |
TYPE | 2 | 记录类型(A=1,CNAME=5等) |
CLASS | 2 | 记录类别(通常为IN=1) |
TTL | 4 | 生存时间(秒) |
RDLENGTH | 2 | RDATA字段长度 |
RDATA | 可变 | 记录数据(如A记录的IP地址) |
DNS报文实例分析
示例场景
客户端查询www.example.com
的A记录(IPv4地址),服务器返回184.216.34
。
查询报文(客户端→服务器)
头部(12字节)
字段名 | 十六进制值 | 十进制值 | 说明 |
---|---|---|---|
标识符 | 0x1234 |
4660 | 随机生成的唯一ID |
标志位 | 0x0100 |
256 | QR=0(查询)、RD=1(递归) |
问题计数 | 0x0001 |
1 | 1个查询问题 |
其他字段 | 0x0000 |
0 | 初始值为0 |
查询问题(QNAME)
域名:www.example.com
→ 编码为:
0x03 www 0x07 example 0x03 com 0x00
0x03
表示标签长度3,后跟www
0x07
表示标签长度7,后跟example
0x03
表示标签长度3,后跟com
0x00
结束符
QTYPE和QCLASS
- QTYPE=
0x0001
(A记录) - QCLASS=
0x0001
(IN类)
响应报文(服务器→客户端)
头部(12字节)
字段名 | 十六进制值 | 说明 |
---|---|---|
标识符 | 0x1234 |
与请求报文一致 |
标志位 | 0x8180 |
QR=1(响应)、AA=1(权威) |
回答记录数 | 0x0001 |
1条回答记录 |
其他字段 | 0x0000 |
无授权/额外记录 |
回答记录(A记录)
- NAME:
0xC00C
(指针指向查询问题中的域名) - TYPE:
0x0001
(A记录) - CLASS:
0x0001
(IN类) - TTL:
0x0000003C
(60秒) - RDLENGTH:
0x0004
(4字节IP地址) - RDATA:
0x5C BC E0 FC
(93.184.216.34)
常见问题与解答
Q1:为什么DNS报文头部需要标识符?
A1:标识符用于匹配请求与响应报文,客户端发送查询时生成随机16位ID,服务器需原样返回该ID,确保客户端能正确关联响应与原始请求,若ID不匹配,客户端会丢弃无效响应。
Q2:DNS如何实现域名压缩?
A2:域名压缩通过指针(CNAME)实现,在回答记录中,若域名与查询问题完全相同,则用0xC0
+偏移量替代完整域名,偏移量指向查询问题中的域名起始位置,可节省数十字节的重复数据,此机制对长域名链(如sub.longdomain.example.com
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/202563.html