NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到

DNS组件 更多...

DNS 的协作图:

class  dns_client
 DNS客户端类 更多...
struct  dns_record
 DNS资源记录结构 更多...
struct  dns_query_result
 DNS查询结果结构 更多...
struct  dns_header
 DNS消息头部结构 更多...

枚举

enum class  dns_opcode : uint8_t {
  dns_opcode::QUERY = 0 , dns_opcode::IQUERY = 1 , dns_opcode::STATUS = 2 , dns_opcode::NOTIFY = 4 ,
  dns_opcode::UPDATE = 5
}
 DNS操作码枚举 更多...
enum class  dns_query : uint16_t { dns_query::INTERNET = 1 , dns_query::CHAOS = 3 , dns_query::HESIOD = 4 , dns_query::ANY = 255 }
 DNS查询类型枚举 更多...
enum class  dns_response : uint8_t {
  dns_response::NON_ERROR = 0 , dns_response::FORMAT_ERROR = 1 , dns_response::SERVER_FAILURE = 2 , dns_response::NAME_ERROR = 3 ,
  dns_response::NOT_IMPLEMENTED = 4 , dns_response::REFUSED = 5
}
 DNS响应码枚举 更多...

详细描述

DNS组件

本模块提供了 DNS(域名系统)协议的完整客户端实现,支持消息构建、查询发送、 响应解析、缓存管理以及多种记录类型的查询。

遵循的国际标准

本实现严格遵循以下 IETF RFC 规范与相关标准:

DNS 核心协议规范:

DNS 扩展与更新:

DNS 记录类型定义:

DNS 传输协议:

IPv6 地址记录:

邮件交换记录:

服务定位记录:

DNS 消息结构

根据 RFC 1035 §4.1,DNS 消息由以下部分组成:

部分 大小 说明
Header 12 字节 包含 ID、标志位、各段计数
Question 可变 查询的域名、类型、类
Answer 可变 回答的资源记录
Authority 可变 指向权威名称服务器的资源记录
Additional 可变 附加信息记录(如 EDNS0)

**头部标志位**(RFC 1035 §4.1.1):

位偏移 名称 说明
0 QR 0=查询,1=响应
1-4 OPCODE 操作码:0=QUERY, 1=IQUERY, 2=STATUS, 4=NOTIFY, 5=UPDATE
5 AA 权威回答
6 TC 截断标志(响应被截断,需使用 TCP 重试)
7 RD 期望递归查询
8 RA 递归可用
9-11 Z 保留位(必须为0)
12-15 RCODE 响应码:0=无错误, 1=格式错误, 2=服务器失败, 3=名称错误等

DNS 记录类型

根据 IANA DNS 参数注册表,本模块支持以下常见记录类型:

类型 RFC 引用 说明
A 1 RFC 1035 主机地址(IPv4)
NS 2 RFC 1035 权威名称服务器
CNAME 5 RFC 1035 规范名称(别名)
SOA 6 RFC 1035 授权区域起始
PTR 12 RFC 1035 域名指针(反向查询)
MX 15 RFC 1035 邮件交换
TXT 16 RFC 1035 文本字符串
AAAA 28 RFC 3596 IPv6 地址
SRV 33 RFC 2782 服务定位器

操作码与响应码

**操作码(OPCODE)**(RFC 1035 §4.1.1,RFC 1996,RFC 2136):

名称 说明
0 QUERY 标准查询
1 IQUERY 反向查询(已废弃)
2 STATUS 服务器状态请求
4 NOTIFY 区域变更通知
5 UPDATE 动态更新

**响应码(RCODE)**(RFC 1035 §4.1.1,RFC 6891 扩展):

名称 说明
0 NoError 无错误
1 FormErr 格式错误
2 ServFail 服务器失败
3 NXDomain 不存在的域名
4 NotImp 未实现
5 Refused 拒绝查询

查询类(CLASS)

根据 RFC 1035 §3.2.4:

名称 说明
1 IN Internet(最常用)
3 CH CHAOS 类
4 HS Hesiod
255 ANY 任何类(通配)

DNS 传输协议

根据 RFC 1035 §4.2 和 RFC 7766:

  • **UDP**:默认传输协议,消息大小限制为 512 字节(EDNS0 可扩展)
  • **TCP**:当响应被截断(TC 标志置位)或消息超过 UDP 限制时自动切换
  • **本实现**:优先使用 UDP,若响应截断则自动通过 TCP 重试

DNS 缓存机制

根据 RFC 1035 §7.2 的 TTL 规范:

  • 每条资源记录包含 TTL(生存时间,秒)
  • 缓存条目按记录的 TTL 值过期
  • 本实现支持自定义缓存 TTL 上限(默认 300 秒)
  • 缓存条目在查询前检查有效期,过期后自动刷新

反向 DNS 查询

根据 RFC 1035 §3.5,PTR 记录用于 IP 地址到域名的映射:

  • IPv4 地址转换为特殊域名:x.x.x.x.in-addr.arpa
  • 例如 IP 8.8.8.8 查询 8.8.8.8.in-addr.arpa 的 PTR 记录
注解
DNS 消息使用大端字节序编码,本实现自动处理字节序转换。 对于超过 512 字节的 UDP 响应,建议启用 EDNS0 或依赖 TCP 自动切换机制。
警告
缓存 TTL 应根据实际业务需求设置,过长的 TTL 可能导致 IP 变更后无法及时更新。 反向查询(PTR)并非所有 IP 地址都有对应的记录。
参见
https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml
https://www.rfc-editor.org/rfc/rfc1034.html
https://www.rfc-editor.org/rfc/rfc1035.html
https://developers.google.com/speed/public-dns
https://www.cloudflare.com/learning/dns/what-is-dns/

枚举类型说明

◆ dns_opcode

enum class dns_opcode : uint8_t
strong

DNS操作码枚举

定义DNS消息的操作类型,指定查询或响应的目的。

枚举值
QUERY 

标准查询

IQUERY 

反向查询

STATUS 

服务器状态请求

NOTIFY 

区域通知

UPDATE 

区域更新

在文件 dns_message.hpp181 行定义.

◆ dns_query

enum class dns_query : uint16_t
strong

DNS查询类型枚举

定义DNS查询的类别,指定查询的协议族或类型。

枚举值
INTERNET 

Internet类

CHAOS 

CHAOS类

HESIOD 

HESIOD类

ANY 

任何类

在文件 dns_message.hpp195 行定义.

◆ dns_response

enum class dns_response : uint8_t
strong

DNS响应码枚举

定义DNS服务器返回的响应状态码。

枚举值
NON_ERROR 

无错误,查询成功

FORMAT_ERROR 

格式错误,服务器无法解析查询

SERVER_FAILURE 

服务器失败,无法处理查询

NAME_ERROR 

名称错误,域名不存在

NOT_IMPLEMENTED 

未实现,服务器不支持该查询类型

REFUSED 

拒绝,服务器拒绝执行查询

在文件 dns_message.hpp208 行定义.