2. SRV RR 的格式 (The Format of the SRV RR)
2.1 基本格式 (Basic Format)
以下是 SRV RR 的格式,其 DNS 类型码为 33:
_Service._Proto.Name TTL Class SRV Priority Weight Port Target
(本文档末尾附近有一个示例。)
2.2 字段规格 (Field Specifications)
2.2.1 Service
所需服务的符号名称,定义于 Assigned Numbers [STD 2] 或本地定义。服务标识符前置一个下划线(_),以避免与自然出现的 DNS 标签发生冲突。
某些被广泛使用的服务(尤其是 POP)并没有一个统一的通用名称。如果 Assigned Numbers 为所指的服务规定了名称,那么该名称就是 SRV 查找时唯一合法的名称。Service 字段不区分大小写。
2.2.2 Proto
所需协议的符号名称,前置一个下划线(_)以避免与自然出现的 DNS 标签发生冲突。目前该字段最有用的取值是 _TCP 和 _UDP,不过也可以使用任何由 Assigned Numbers 定义或本地定义的名称(与 Service 字段相同)。Proto 字段不区分大小写。
2.2.3 Name
该 RR 所指向的域。SRV RR 的独特之处在于:检索时所使用的名字并非此处的 Name;本文档末尾的示例清楚地说明了这一点。
2.2.4 TTL
标准 DNS 含义 [RFC 1035]。
2.2.5 Class
标准 DNS 含义 [RFC 1035]。SRV 记录出现在 IN 类中。
2.2.6 Priority
此目标主机的优先级。客户端必须 (MUST) 尝试联系其能够到达的、优先级编号最低的目标主机;具有相同优先级的目标主机应当 (SHOULD) 按照 weight 字段所定义的顺序依次尝试。取值范围为 0-65535。这是一个网络字节序的 16 位无符号整数。
2.2.7 Weight
一种服务器选择机制。weight 字段为具有相同优先级的条目指定相对权重。权重较大的条目应当 (SHOULD) 被赋予相应更高的选中概率。该数值的取值范围为 0-65535,是一个网络字节序的 16 位无符号整数。当不需要进行服务器选择时,域管理员应当 (SHOULD) 使用权重 0,以使 RR 更便于人工阅读(减少干扰信息)。在存在权重大于 0 的记录时,权重为 0 的记录被选中的概率应当极小。
2.3 负载均衡算法 (Load Balancing Algorithm)
在没有规范要求使用其他权重信息的情况下,客户端应为具有相同 Priority 的 SRV RR 排序,以决定各 SRV RR 所指定的目标主机被联系的顺序。应当 (SHOULD) 使用下列算法为相同优先级的 SRV RR 排序:
要选择下一个被联系的目标,先将所有(尚未排序的)SRV RR 以任意顺序排列,但所有权重为 0 的记录必须置于列表开头。
计算这些 RR 的权重之和,并按所选顺序为每个 RR 关联一个累积和。随后在 0 与所计算出的总和之间(含端点)选取一个均匀随机数,并选中其累积和值在所选顺序中第一个大于或等于该随机数的 RR。被选中的 SRV RR 所指定的目标主机,即为客户端下一个要联系的目标主机。将该 SRV RR 从无序的 SRV RR 集合中移除,并对剩余的无序 SRV RR 重复上述算法以选择下一个目标主机。持续此排序过程,直至不存在无序的 SRV RR。对每一个 Priority 都重复执行该过程。
2.4 其他字段 (Other Fields)
2.4.1 Port
此目标主机上该服务的端口。取值范围为 0-65535。这是一个网络字节序的 16 位无符号整数。该值通常(但并非必须)与 Assigned Numbers 中的规定一致。
2.4.2 Target
目标主机的域名。该名称必须 (MUST) 拥有一个或多个地址记录,且该名称不得 (MUST NOT) 是别名(依 RFC 1034 或 RFC 2181 的含义)。强烈建议(但非强制)实现者在附加数据段(Additional Data Section)中返回这些地址记录。除非未来的标准动作另有许可,否则不得对此字段使用名字压缩。
Target 为 "." 表示该服务在此域中确实不可用。