Skip to main content

7. 虚构示例 (Fictional Example)

7.1 示例说明 (Example Description)

示例用途

此示例使用虚构的服务 "foobar" 作为理解 SRV 记录的辅助工具。

免责声明

如果服务 "foobar" 被实现,并不意味着它一定会使用 SRV 记录。本示例仅用于教学目的。


7.2 示例区域文件 (Example Zone File)

7.2.1 完整区域文件 (Complete Zone File)

以下是 example.com 的区域文件的一部分 (一个仍未使用的域):

$ORIGIN example.com.
@ SOA server.example.com. root.example.com. (
1995032001 ; Serial (序列号)
3600 ; Refresh (刷新时间)
3600 ; Retry (重试时间)
604800 ; Expire (过期时间)
86400 ) ; Minimum TTL (最小 TTL)
NS server.example.com.
NS ns1.ip-provider.net.
NS ns2.ip-provider.net.

; foobar - 如果 old-slow-box 或 new-fast-box 中的任何一个可用,
; 则使用它们,让四分之三的登录转到 new-fast-box。
_foobar._tcp SRV 0 1 9 old-slow-box.example.com.
SRV 0 3 9 new-fast-box.example.com.

; 如果 old-slow-box 或 new-fast-box 都不可用,则切换到
; 使用系统管理员的机器和服务器
SRV 1 0 9 sysadmins-box.example.com.
SRV 1 0 9 server.example.com.

server A 172.30.79.10
old-slow-box A 172.30.79.11
sysadmins-box A 172.30.79.12
new-fast-box A 172.30.79.13

; 不支持其他服务
*._tcp SRV 0 0 0 .
*._udp SRV 0 0 0 .

7.3 配置详解 (Configuration Analysis)

7.3.1 SOA 记录解析 (SOA Record Analysis)

@               SOA server.example.com. root.example.com. (
1995032001 3600 3600 604800 86400 )

字段说明 (Field Explanation):

字段含义
Primary NSserver.example.com.主名称服务器
Admin Emailroot.example.com.管理员邮箱 ([email protected])
Serial1995032001序列号 (1995年3月20日版本1)
Refresh3600 秒辅助服务器刷新间隔 (1小时)
Retry3600 秒刷新失败后重试间隔 (1小时)
Expire604800 秒区域过期时间 (7天)
Minimum TTL86400 秒否定缓存 TTL (24小时)

7.3.2 名称服务器记录 (Name Server Records)

                NS  server.example.com.
NS ns1.ip-provider.net.
NS ns2.ip-provider.net.

配置说明 (Configuration Explanation):

  • 内部 NS: server.example.com (自托管)
  • 外部 NS: ns1/ns2.ip-provider.net (ISP 提供的冗余)

冗余设计 (Redundancy Design):

主 NS:    server.example.com.     (内部)
辅助 NS 1: ns1.ip-provider.net. (外部 ISP 1)
辅助 NS 2: ns2.ip-provider.net. (外部 ISP 2)

优势:
✅ 多点冗余
✅ 内部和外部混合
✅ 提高可用性

7.3.3 Foobar 服务的 SRV 记录 (Foobar Service SRV Records)

主服务器组 (Primary Servers - Priority 0)

_foobar._tcp    SRV 0 1 9 old-slow-box.example.com.
SRV 0 3 9 new-fast-box.example.com.

配置分析 (Configuration Analysis):

服务器PriorityWeightPort含义
old-slow-box019旧的慢速服务器,权重 1
new-fast-box039新的快速服务器,权重 3

负载分配 (Load Distribution):

总权重 W = 1 + 3 = 4

选择概率:
old-slow-box: 1/4 = 25% (较慢,分配较少流量)
new-fast-box: 3/4 = 75% (较快,分配更多流量)

设计意图:
→ 优先使用新的快速服务器
→ 旧服务器作为辅助,分担部分负载
→ 权重比例 3:1 反映硬件性能差异

选择过程模拟 (Selection Process Simulation):

第 1 次连接:
R = random(0, 4) = 2.7 (例如)
累计权重: old-slow-box=1, new-fast-box=4
2.7 > 1 且 2.7 ≤ 4 → 选择 new-fast-box ✅

第 2 次连接:
R = random(0, 4) = 0.5 (例如)
累计权重: old-slow-box=1, new-fast-box=4
0.5 ≤ 1 → 选择 old-slow-box ✅

第 3 次连接:
R = random(0, 4) = 3.2 (例如)
累计权重: old-slow-box=1, new-fast-box=4
3.2 > 1 且 3.2 ≤ 4 → 选择 new-fast-box ✅

统计结果 (100 次连接):
new-fast-box: 约 75 次
old-slow-box: 约 25 次

备份服务器组 (Backup Servers - Priority 1)

                SRV 1 0 9 sysadmins-box.example.com.
SRV 1 0 9 server.example.com.

配置分析 (Configuration Analysis):

服务器PriorityWeightPort含义
sysadmins-box109系统管理员的机器
server109DNS 主服务器

备份策略 (Backup Strategy):

Priority = 1 (仅在 Priority 0 服务器全部失败时使用)
Weight = 0 (两台服务器均等对待)

使用场景:
✅ old-slow-box 失败
✅ new-fast-box 失败
→ 客户端切换到 Priority 1 组
→ 随机选择 sysadmins-box 或 server (50%:50%)

设计意图:
→ 紧急故障转移
→ 使用备用资源维持服务
→ Weight=0 表示没有性能差异,均匀分配

故障转移流程 (Failover Flow):

正常情况:
客户端 → new-fast-box (75%) / old-slow-box (25%)

故障场景 1: new-fast-box 不可用
1. 尝试 new-fast-box → 失败
2. 尝试 old-slow-box → 成功 ✅

故障场景 2: Priority 0 全部不可用
1. 尝试 new-fast-box → 失败
2. 尝试 old-slow-box → 失败
3. 切换到 Priority 1
4. 随机选择 sysadmins-box 或 server → 成功 ✅

完全故障:
1-4 步全部失败 → 服务不可用 ❌

7.3.4 地址记录 (Address Records)

server           A   172.30.79.10
old-slow-box A 172.30.79.11
sysadmins-box A 172.30.79.12
new-fast-box A 172.30.79.13

网络拓扑 (Network Topology):

子网: 172.30.79.0/24

主机列表:
172.30.79.10 → server.example.com (DNS 服务器 + 备份应用服务器)
172.30.79.11 → old-slow-box.example.com (旧主服务器)
172.30.79.12 → sysadmins-box.example.com (管理员工作站)
172.30.79.13 → new-fast-box.example.com (新主服务器)

网络设计特点:
✅ 同一子网,低延迟
✅ IP 连续分配,便于管理
✅ 每个主机有唯一的 A 记录

7.3.5 通配符拒绝记录 (Wildcard Denial Records)

; 不支持其他服务
*._tcp SRV 0 0 0 .
*._udp SRV 0 0 0 .

含义 (Meaning):

明确拒绝

这些记录表示 example.com 域明确不支持除 foobar 之外的任何其他 TCP 或 UDP 服务。

通配符匹配 (Wildcard Matching):

客户端查询 _http._tcp.example.com:
1. DNS 查找 _http._tcp.example.com
2. 未找到精确匹配
3. 匹配通配符 *._tcp
4. 返回: SRV 0 0 0 .
5. 客户端解释: HTTP 服务明确不可用 ❌

客户端查询 _ldap._tcp.example.com:
1. DNS 查找 _ldap._tcp.example.com
2. 匹配通配符 *._tcp
3. 返回: SRV 0 0 0 .
4. 客户端解释: LDAP 服务明确不可用 ❌

客户端查询 _foobar._tcp.example.com:
1. DNS 查找 _foobar._tcp.example.com
2. 找到精确匹配 (4 条 SRV 记录)
3. 返回完整的 SRV 记录集
4. 客户端解释: Foobar 服务可用 ✅

优势 (Advantages):

传统方式 (无 SRV 记录):
查询 _http._tcp.example.com
→ NXDOMAIN (域名不存在)
→ 客户端不确定是服务不可用还是配置错误

SRV 方式 (使用通配符拒绝):
查询 _http._tcp.example.com
→ 返回 SRV 0 0 0 .
→ 客户端明确知道服务不可用
→ 不会尝试回退到 A 记录查询
→ 节省时间和网络资源

7.4 客户端查询示例 (Client Query Example)

7.4.1 查询场景 (Query Scenario)

客户端需求 (Client Requirement):

"example.com" 域中 "foobar" 服务的客户端需要:

  1. SRV 查询: _foobar._tcp.example.com.
  2. 地址查询: new-fast-box.example.com. 和/或其他主机

7.4.2 DNS 查询和响应 (DNS Query and Response)

查询命令 (Query Command):

dig _foobar._tcp.example.com SRV +additional

预期响应 (Expected Response):

;; QUESTION SECTION:
;_foobar._tcp.example.com. IN SRV

;; ANSWER SECTION:
_foobar._tcp.example.com. 86400 IN SRV 0 1 9 old-slow-box.example.com.
_foobar._tcp.example.com. 86400 IN SRV 0 3 9 new-fast-box.example.com.
_foobar._tcp.example.com. 86400 IN SRV 1 0 9 sysadmins-box.example.com.
_foobar._tcp.example.com. 86400 IN SRV 1 0 9 server.example.com.

;; AUTHORITY SECTION:
example.com. 86400 IN NS server.example.com.
example.com. 86400 IN NS ns1.ip-provider.net.
example.com. 86400 IN NS ns2.ip-provider.net.

;; ADDITIONAL SECTION:
old-slow-box.example.com. 86400 IN A 172.30.79.11
new-fast-box.example.com. 86400 IN A 172.30.79.13
sysadmins-box.example.com. 86400 IN A 172.30.79.12
server.example.com. 86400 IN A 172.30.79.10
ns1.ip-provider.net. 86400 IN A 192.0.2.1
ns2.ip-provider.net. 86400 IN A 192.0.2.2

7.5 响应大小分析 (Response Size Analysis)

7.5.1 大小计算 (Size Calculation)

RFC 原文引用

SRV 回复的大小约为 365 字节

详细分解 (Detailed Breakdown):

1. 通用开销 (General Overhead):
DNS 报文头部 = 30 字节

2. 查询部分 (Query Section):
查询字符串 "_foobar._tcp.example.com." = 20 字节

3. 应答部分 (Answer Section):
4 × SRV RR
每个 SRV RR = 20 字节 (固定部分)
+ Target 名称长度

目标名称:
"old-slow-box.example.com." ≈ 25 字节
"new-fast-box.example.com." ≈ 25 字节
"sysadmins-box.example.com." ≈ 26 字节
"server.example.com." ≈ 19 字节

注意: "example.com" 在查询中已引用,
通过名称压缩可以节省空间

实际计算:
"old-slow-box" + ".example.com" (压缩指针)
≈ 13 + 2 = 15 字节/条

4 × (20 + 平均15) = 4 × 35 = 140 字节

实际应答部分总计 ≈ 130 字节

4. 权威部分 (Authority Section):
3 × NS RR
每个 NS RR = 15 字节 (固定部分)
+ NS 名称长度

NS 名称:
"server" (引用) ≈ 8 字节
"ns1.ip-provider.net." ≈ 20 字节
"ns2" (引用 "ip-provider.net.") ≈ 5 字节

3 × (15 + 平均11) = 3 × 26 = 78 字节

实际权威部分总计 ≈ 75 字节

5. 附加数据部分 (Additional Section):
6 × A RR (4 个 SRV 目标 + 3 个 NS 主机,
但 server.example.com 重复,实际 6 个)
每个 A RR = 20 字节 (包括压缩后的名称)

6 × 20 = 120 字节

──────────────────────────────────────────────────
总计 (Total):
30 + 20 + 130 + 75 + 120 = 375 字节

实际测量约为 365 字节 (考虑名称压缩的优化效果)

7.5.2 与 512 字节限制的比较 (Comparison with 512-Byte Limit)

DNS UDP 响应限制:             512 字节
本示例响应大小: 365 字节
剩余空间: 147 字节

安全边际: 147 / 512 ≈ 28.7%

结论: ✅ 安全,有足够的余量

最大化记录数估算 (Maximum Record Estimation):

假设每个 SRV RR ≈ 35 字节
基础开销 ≈ 30 + 20 + 75 = 125 字节
可用空间 = 512 - 125 = 387 字节

最大 SRV 记录数 ≈ 387 / 35 ≈ 11 条

建议最大数量: 8-10 条 SRV 记录
(考虑 Additional Data 和名称变化)

7.6 验证命令示例 (Verification Command Examples)

使用 dig 验证 (Verification with dig)

# 基本查询
dig _foobar._tcp.example.com SRV

# 查看完整响应 (包括附加数据)
dig _foobar._tcp.example.com SRV +additional

# 查看响应大小
dig _foobar._tcp.example.com SRV +stats | grep "MSG SIZE"

# 查看通配符拒绝
dig _http._tcp.example.com SRV

# 查看完整的区域传输 (如果允许)
dig @server.example.com example.com AXFR

7.7 本章小结 (Chapter Summary)

示例的教学价值 (Educational Value):

  1. 完整配置 (Complete Configuration)

    • 展示了真实的区域文件格式
    • 包含 SRV、NS、A 记录的完整配置
  2. 负载均衡 (Load Balancing)

    • 演示了 3:1 的权重比例
    • 展示了如何反映硬件性能差异
  3. 故障转移 (Failover)

    • 主服务器组 (Priority 0) + 备份组 (Priority 1)
    • 多层次的高可用性设计
  4. 明确拒绝 (Explicit Denial)

    • 使用通配符 SRV 记录拒绝其他服务
    • 避免客户端的无效尝试
  5. 大小优化 (Size Optimization)

    • 响应大小在 512 字节限制内
    • 利用名称压缩节省空间

实际应用启示 (Practical Insights):

本示例可作为模板用于:
✅ Web 服务器集群配置
✅ 数据库主从架构
✅ 微服务负载均衡
✅ 邮件服务器冗余
✅ LDAP/Kerberos 高可用部署

导航 (Navigation)