Skip to main content

5. 服务名称 (Service Names)

服务名称是服务名称和传输协议端口号注册表中的唯一键。服务的这个唯一符号名称也可用于其他目的,例如在 DNS SRV 记录 [RFC2782] 中。

在注册表中,这个唯一键确保可以明确区分不同的服务,从而防止名称冲突并避免关于谁是特定条目的分配者的混淆。

一个特定的传输协议和端口可能有多个服务名称与之关联。这种端口号重载可以通过三种方式发生:

  • 重载发生在一个服务是另一个服务的扩展时,并且存在用于确定扩展是否存在的带内机制。一个例子是端口 3478,它具有服务名称别名"stun"和"turn"。NAT 中继穿越 (TURN) [RFC5766] 是 NAT 会话穿越实用程序 (STUN) [RFC5389] 服务的扩展。希望定位 TURN 服务器的支持 TURN 的客户端可以尝试发现"stun"服务,然后在带内检查服务器是否也支持 TURN,但这将是低效的。使它们能够直接按名称查询"turn"服务器是更好的方法。(请注意,在这种情况下,TURN 服务器也应该可以通过"stun"发现,因为每个 TURN 服务器也是一个 STUN 服务器。)

  • 由于历史原因,服务名称"http"有两个同义词"www"和"www-http"。当在 SRV 记录 [RFC2782] 和类似的服务发现机制中使用时,应该只使用服务名称"http",而不是这些附加名称。如果服务器要公布"www",它将不会被浏览"http"的客户端发现。除了主服务名称之外,公布或浏览别名是低效的,并且除了专门使用服务名称"http"已经实现的功能之外,什么也没有实现。

  • 如本文档第 10.1 节所示,重载已被用于创建符合本文档为不符合此语法的旧名称规定的语法的替换名称。对于这种情况,应该只在 SRV 记录中使用新名称,以避免与多个名称的历史情况相同的问题,并且因为旧名称与 SRV 记录使用不兼容。因此,为现有注册服务请求新名称的分配请求将被拒绝。

实现者被要求通知 IANA,如果他们发现单个服务具有多个名称的其他情况,以便可以将一个名称记录为用于服务发现目的的主名称。

服务名称按照"先到先得"的原则分配,如第 8.1 节所述。名称应简洁且信息丰富,避免在注册表上下文中冗余的词或缩写(例如,"port"、"service"、"protocol"等)。引用发现服务的名称,例如,使用多播或广播来识别能够提供给定服务的端点,应该使用易于识别的后缀(例如,"-disc")。

5.1. 服务名称语法 (Service Name Syntax)

有效的服务名称在此规范性定义如下:

  • 必须至少 1 个字符且不超过 15 个字符长
  • 必须仅包含 US-ASCII [ANSI.X3.4-1986] 字母 'A' - 'Z' 和 'a' - 'z',数字 '0' - '9',和连字符 ('-', ASCII 0x2D 或十进制 45)
  • 必须至少包含一个字母 ('A' - 'Z' 或 'a' - 'z')
  • 不得以连字符开头或结尾
  • 连字符不得与其他连字符相邻

要求至少一个字母的原因是避免像"23"(可能与数字端口混淆)或"6000-6063"(可能与数字端口范围混淆)这样的服务名称。

虽然服务名称可以包含大写和小写字母,但出于比较目的,大小写被忽略,因此"http"和"HTTP"都表示同一服务。

服务名称纯粹是不透明的标识符,给定服务名称可能看起来具有的任何表面结构都不暗示任何语义。例如,一家名为"Example"的公司可以选择为其"Foo"和"Bar"产品注册服务名称"Example-Foo"和"Example-Bar",但"Example"公司不能声称"拥有"所有以"Example-"开头的服务名称;他们不能阻止其他人为不同的服务注册"Example-Baz",也不能阻止其他开发者使用"Example-Foo"和"Example-Bar"服务类型以便与"Foo"和"Bar"产品互操作。

从技术上讲,在服务发现协议中,服务名称只是线路上的一系列字节值;为了人类开发者的助记方便,可以将这些字节值解释为人类可读的 ASCII 字符,但软件应该将它们视为纯粹的不透明标识符,不应尝试解析它们以获取任何额外的嵌入含义。

截至 2009 年 8 月 5 日,现有端口号分配 [PORTREG] 的大约 98% 的所谓"短名称" [SYSFORM] [USRFORM] 已经符合第 8.1 节所述的合法服务名称规则,因此对于这些服务,它们的服务名称与它们的历史"短名称"完全相同。在大约 2% 的情况下,新的"服务名称"是根据下面第 10.1 节所述的旧"短名称"派生的。

有效服务名称的规则(不包括最多 15 个字符的限制)也使用 ABNF [RFC5234] 在下面表示(作为非规范性的便利)。

SRVNAME = *(1*DIGIT [HYPHEN]) ALPHA *([HYPHEN] ALNUM)
ALNUM = ALPHA / DIGIT ; A-Z, a-z, 0-9
HYPHEN = %x2D ; "-"
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z [RFC5234]
DIGIT = %x30-39 ; 0-9 [RFC5234]

5.2. 在 DNS SRV 记录中使用服务名称 (Service Name Usage in DNS SRV Records)

DNS SRV 规范 [RFC2782] 指出,DNS SRV 记录的所有者名称的服务标签部分包括"服务"元素,描述为"所需服务的符号名称",但如上所述,目前尚不清楚这究竟意味着什么。

本文档澄清,服务标签必须是如本文所定义的服务名称,前面加下划线。服务名称应该向 IANA 注册并记录在服务名称和传输协议端口号注册表 [PORTREG] 中。

在 SRV 服务标签中使用服务名称的详细信息在 DNS SRV 规范 [RFC2782] 中规定。