3. Domain Name Space and RR Definitions (域名空间和RR定义)
本章定义了DNS中域名的编码方式和资源记录的格式。这是实现DNS的核心技术规范。
3.1. Name space definitions (名称空间定义)
域名编码
消息中的域名以标签序列表示。
编码格式:
每个标签表示为:
[长度字节(1字节)][标签内容(N字节)]
示例: www.example.com
编码为: 3www7example3com0
详细说明:
- 每个标签由一个八位字节长度字段表示,后跟该数量的八位字节
- 由于每个域名都以根的空标签结尾,因此域名由零长度字节终止
- 每个长度八位字节的高位两位必须为零
- 长度字段的其余六位将标签限制为63个八位字节或更少
长度限制:
单个标签: ≤ 63字节
完整域名: ≤ 255字节 (包括长度字节)
标签内容规则
字节值: 标签可以包含八位字节中的任何8位值
强烈建议: 标签遵循本备忘录其他地方描述的首选语法,该语法与现有主机命名约定兼容
比较规则:
- 名称服务器和解析器必须以大小写不敏感的方式比较标签
- 假设ASCII零奇偶校验 (即 A=a)
- 非字母代码必须完全匹配
示例编码:
域名: example.com
标签: ["example", "com", ""]
线格式编码:
0x07 'e' 'x' 'a' 'm' 'p' 'l' 'e' (长度7 + "example")
0x03 'c' 'o' 'm' (长度3 + "com")
0x00 (根标签,长度0)
十六进制: 07 65 78 61 6D 70 6C 65 03 63 6F 6D 00
完整示例:
域名: www.example.com
编码: 3www7example3com0
详细字节:
0x03 0x77 0x77 0x77 (长度3 + "www")
0x07 0x65 0x78 0x61 0x6D 0x70 0x6C 0x65 (长度7 + "example")
0x03 0x63 0x6F 0x6D (长度3 + "com")
0x00 (根标签)
3.2. RR definitions (RR定义)
3.2.1. Format (格式)
所有RR都具有相同的顶层格式:
1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ NAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| CLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TTL |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| RDLENGTH |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
/ RDATA /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段说明:
| 字段 | 大小 | 说明 |
|---|---|---|
| NAME | 变长 | 所有者名称,即此资源记录所属节点的名称 |
| TYPE | 2字节 | RR TYPE代码之一 |
| CLASS | 2字节 | RR CLASS代码之一 |
| TTL | 4字节 | 32位有符号整数,指定资源记录在重新咨询信息源之前可以缓存的时间间隔 |
| RDLENGTH | 2字节 | 无符号16位整数,指定RDATA字段的八位字节长度 |
| RDATA | 变长 | 描述资源的八位字节可变长度字符串,格式因TYPE和CLASS而异 |
TTL特殊值:
- 0: RR只能用于正在进行的事务,不应缓存
- 例如,SOA记录始终以零TTL分发以禁止缓存
- 零值也可用于极易变的数据
3.2.2. TYPE values (TYPE值)
TYPE字段用于资源记录。这些类型是QTYPE的子集。
| TYPE | 值 | 说明 | 状态 |
|---|---|---|---|
| A | 1 | 主机地址 | 标准 |
| NS | 2 | 权威名称服务器 | 标准 |
| MD | 3 | 邮件目标 | 废弃 - 使用MX |
| MF | 4 | 邮件转发器 | 废弃 - 使用MX |
| CNAME | 5 | 别名的规范名称 | 标准 |
| SOA | 6 | 标记授权区域的起始 | 标准 |
| MB | 7 | 邮箱域名 | 实验性 |
| MG | 8 | 邮件组成员 | 实验性 |
| MR | 9 | 邮件重命名域名 | 实验性 |
| NULL | 10 | 空RR | 实验性 |
| WKS | 11 | 众所周知的服务描述 | 标准 |
| PTR | 12 | 域名指针 | 标准 |
| HINFO | 13 | 主机信息 | 标准 |
| MINFO | 14 | 邮箱或邮件列表信息 | 实验性 |
| MX | 15 | 邮件交换 | 标准 |
| TXT | 16 | 文本字符串 | 标准 |
3.2.3. QTYPE values (QTYPE值)
QTYPE字段出现在查询的问题部分。QTYPE是TYPE的超集,因此所有TYPE都是有效的QTYPE。
额外的QTYPE:
| QTYPE | 值 | 说明 |
|---|---|---|
| AXFR | 252 | 请求传输整个区域 |
| MAILB | 253 | 请求邮箱相关记录 (MB, MG或MR) |
| MAILA | 254 | 请求邮件代理RR (废弃 - 参见MX) |
| * | 255 | 请求所有记录 |
3.2.4. CLASS values (CLASS值)
CLASS字段出现在资源记录中。
| CLASS | 值 | 说明 |
|---|---|---|
| IN | 1 | Internet |
| CS | 2 | CSNET类 (废弃) |
| CH | 3 | CHAOS类 |
| HS | 4 | Hesiod [Dyer 87] |
3.2.5. QCLASS values (QCLASS值)
QCLASS字段出现在查询的问题部分。QCLASS是CLASS的超集。
额外的QCLASS:
| QCLASS | 值 | 说明 |
|---|---|---|
| * | 255 | 任何类 |
3.3. Standard RRs (标准RR)
以下RR定义应该由所有实现支持。
3.3.1. CNAME RDATA format (CNAME RDATA格式)
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ CNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段:
- CNAME: 域名,指定此RR所有者名称的规范或主名称
用途: CNAME RR将别名标识为规范名称
示例:
www.example.com. 3600 IN CNAME webserver.example.com.
重要规则: 如果CNAME RR存在于某个节点,则该节点不应存在其他数据。这确保规范名称及其别名的数据不会不同。
3.3.2. HINFO RDATA format (HINFO RDATA格式)
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ CPU /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ OS /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段:
- CPU: 字符串,指定CPU类型
- OS: 字符串,指定操作系统类型
用途: HINFO记录用于获取主机的一般信息
示例:
host.example.com. 3600 IN HINFO "Intel-x86-64" "Linux"
3.3.3. MB RDATA format (MB RDATA格式) - 实验性
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ MADNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段:
- MADNAME: 域名,指定具有指定邮箱的主机
状态: 实验性
3.3.4. MD RDATA format (MD RDATA格式) - 废弃
状态: 废弃 - 使用MX代替
3.3.5. MF RDATA format (MF RDATA格式) - 废弃
状态: 废弃 - 使用MX代替
3.3.6. MG RDATA format (MG RDATA格式) - 实验性
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ MGMNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段:
- MGMNAME: 域名,指定属于由域名标识的邮件组的邮箱
状态: 实验性
3.3.7. MINFO RDATA format (MINFO RDATA格式) - 实验性
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ RMAILBX /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ EMAILBX /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段:
- RMAILBX: 域名,指定负责邮箱的邮箱
- EMAILBX: 域名,指定接收错误消息的邮箱
状态: 实验性
3.3.8. MR RDATA format (MR RDATA格式) - 实验性
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ NEWNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段:
- NEWNAME: 域名,指定邮箱的正确名称
状态: 实验性
3.3.9. MX RDATA format (MX RDATA格式)
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| PREFERENCE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ EXCHANGE /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段:
- PREFERENCE: 16位整数,指定此主机的优先级。较低的值优先
- EXCHANGE: 域名,指定愿意充当邮件交换器的主机
示例:
example.com. 3600 IN MX 10 mail1.example.com.
example.com. 3600 IN MX 20 mail2.example.com.
MX用途: MX记录为EXCHANGE指定的主机触发A类型附加部分处理。MX RR的使用在RFC-974中有详细说明。
3.3.10. NULL RDATA format (NULL RDATA格式) - 实验性
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ <anything> /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段:
<anything>: 任意内容,最多65535字节
用途:
- NULL RR不用于任何正常操作
- 可用于实验性目的
- 可包含任意数据
状态: 实验性
3.3.11. NS RDATA format (NS RDATA格式)
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ NSDNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段:
- NSDNAME: 域名,指定对此域具有权威性的主机
示例:
example.com. 3600 IN NS ns1.example.com.
example.com. 3600 IN NS ns2.example.com.
NS用途:
- NS记录触发常规附加部分处理以定位A类型记录
- 在引用中使用时,它们标示命名空间中的委派点
3.3.12. PTR RDATA format (PTR RDATA格式)
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ PTRDNAME /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段:
- PTRDNAME: 域名,指向域名空间中的某个位置
用途: 用于反向DNS查找
示例:
1.0.0.127.in-addr.arpa. 3600 IN PTR localhost.
PTR用途:
- PTR记录不触发附加部分处理
- 这些RR用于特殊域中以指向域名空间中的其他位置
- 主要用于IN-ADDR.ARPA域中的反向DNS查找
3.3.13. SOA RDATA format (SOA RDATA格式)
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ MNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ RNAME /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| SERIAL |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| REFRESH |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| RETRY |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| EXPIRE |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| MINIMUM |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| MNAME | 域名 | 此区域数据的原始或主名称服务器 |
| RNAME | 域名 | 负责此区域的人员的邮箱 (@ 替换为 .) |
| SERIAL | 32位无符号 | 区域的版本号,从服务器用它来确定何时需要区域传输 |
| REFRESH | 32位有符号 | 从服务器应该查询主服务器以查看区域是否已更改的时间间隔(秒) |
| RETRY | 32位有符号 | 如果刷新失败,从服务器应该等待多长时间再尝试(秒) |
| EXPIRE | 32位有符号 | 如果无法联系主服务器,从服务器应该停止响应查询的时间(秒) |
| MINIMUM | 32位无符号 | 应该应用于此区域中所有RR的最小TTL |
示例:
example.com. 3600 IN SOA ns1.example.com. admin.example.com. (
2024010101 ; Serial
3600 ; Refresh (1 hour)
1800 ; Retry (30 minutes)
604800 ; Expire (1 week)
86400 ) ; Minimum TTL (1 day)
3.3.14. TXT RDATA format (TXT RDATA格式)
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ TXT-DATA /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段:
- TXT-DATA: 一个或多个字符串
用途: 用于保存描述性文本
示例:
example.com. 3600 IN TXT "v=spf1 mx -all"
example.com. 3600 IN TXT "google-site-verification=..."
TXT用途:
- TXT RR用于保存描述性文本
- 文本的语义取决于找到它的域
- 常用于SPF、DKIM、域验证等
3.4. Internet specific RRs (Internet特定RR)
3.4.1. A RDATA format (A RDATA格式)
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ADDRESS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段:
- ADDRESS: 32位Internet地址
用途: 将主机名映射到IPv4地址
示例:
www.example.com. 3600 IN A 93.184.216.34
A记录用途:
- 拥有多个Internet地址的主机将有多个A记录
- A记录不触发附加部分处理
- 主文件中A行的RDATA部分是表示为四个用点分隔的十进制数字的Internet地址
3.4.2. WKS RDATA format (WKS RDATA格式)
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ADDRESS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| PROTOCOL | |
+--+--+--+--+--+--+--+--+ |
| |
/ <BIT MAP> /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段:
- ADDRESS: 32位Internet地址
- PROTOCOL: 8位IP协议号
- BIT MAP: 可变长度位图,指示哪些端口上的服务可用。位图必须是8位的倍数
用途: WKS记录用于描述特定Internet地址上特定协议支持的众所周知服务
注意: WKS记录在现代DNS实践中很少使用
3.5. IN-ADDR.ARPA domain (IN-ADDR.ARPA域)
反向DNS查找
IN-ADDR.ARPA域用于将Internet地址映射到主机名。
格式: IP地址的八位字节以相反顺序表示,并附加.in-addr.arpa
结构:
- 域按反向IP地址八位字节组织
- 每个八位字节在域名中形成一个标签
示例:
IP地址: 192.0.2.1
反向域名: 1.2.0.192.in-addr.arpa
PTR记录:
1.2.0.192.in-addr.arpa. 3600 IN PTR host.example.com.
查询流程:
1. 应用程序请求: "192.0.2.1的主机名是什么?"
2. 解析器构造: 1.2.0.192.in-addr.arpa
3. 查询类型: PTR
4. 返回: host.example.com
用途:
- IN-ADDR.ARPA域中的PTR记录指向规范主机名
- 这允许应用程序从地址映射到名称
- 常用于安全验证、日志记录和访问控制
3.6. Defining new types, classes, and special namespaces (定义新类型、类和特殊名称空间)
扩展性原则
DNS被设计为可扩展的。新的RR类型、类和特殊名称空间可以被定义。
要求:
- 新定义必须在RFC中发布
- 必须获得IANA分配的代码
- 必须向后兼容现有实现
指南:
- 新类型和类应向IANA注册
- 实现应能够优雅地处理未知类型
- 名称服务器应保留并传递未知RR类型
- RR的通用格式允许添加新类型而不破坏现有实现
实验性类型:
- 可以在本地使用
- 不应在Internet上使用
- 应使用保留范围内的类型代码
私有使用:
- TYPE 65280-65534: 私有使用
- CLASS 65280-65534: 私有使用
未知类型处理:
- 名称服务器必须能够加载和提供未知类型的RR
- 解析器必须能够处理和缓存未知类型的RR
- 未知类型在传输时保持其线格式
RR类型快速参考
常用RR类型
| 类型 | 用途 | 示例 |
|---|---|---|
| A | IPv4地址 | www.example.com. IN A 93.184.216.34 |
| AAAA | IPv6地址 | www.example.com. IN AAAA 2001:db8::1 |
| CNAME | 别名 | www.example.com. IN CNAME server.example.com. |
| MX | 邮件服务器 | example.com. IN MX 10 mail.example.com. |
| NS | 名称服务器 | example.com. IN NS ns1.example.com. |
| PTR | 反向查找 | 1.2.0.192.in-addr.arpa. IN PTR host.example.com. |
| SOA | 区域授权 | 见上文SOA示例 |
| TXT | 文本记录 | example.com. IN TXT "v=spf1 mx -all" |
RR编码示例
A记录编码:
www.example.com. 3600 IN A 93.184.216.34
编码:
NAME: 3www7example3com0 (压缩格式可能更短)
TYPE: 0x0001 (A)
CLASS: 0x0001 (IN)
TTL: 0x00000E10 (3600秒)
RDLENGTH: 0x0004 (4字节)
RDATA: 0x5DB8D822 (93.184.216.34)
下一章: 4. Messages (消息) - DNS消息格式和编码