2. 协议概述
2. 协议概述
基础 Diameter 协议涉及与对等节点建立连接、能力协商、消息如何通过对等节点发送和路由,以及连接最终如何拆除。基础协议还定义了适用于 Diameter 节点之间所有消息交换的某些规则。
Diameter 对等节点之间的通信始于一个对等节点向另一个 Diameter 对等节点发送消息。消息中包含的 AVP 集合由特定的 Diameter 应用程序确定。其中一个用于引用用户会话的 AVP 是 Session-Id。
用户认证和/或授权的初始请求将包含 Session-Id AVP。然后,Session-Id 在所有后续消息中用于标识用户的会话(有关更多信息,请参见第 8 节)。通信方可以接受该请求,或通过返回一个应答消息来拒绝它,其中 Result-Code AVP 设置为指示发生了错误。接收请求的 Diameter 服务器或客户端的具体行为取决于所采用的 Diameter 应用程序。
会话状态(与 Session-Id 关联)必须在收到 Session-Termination-Request、Session-Termination-Answer、Session-Timeout AVP 中授权的服务时间到期时释放,并且还要根据特定 Diameter 应用程序中建立的规则释放。
基础 Diameter 协议本身可以用于计费应用程序。对于认证和授权,它总是针对特定应用程序进行扩展。
Diameter 客户端必须支持基础协议,其中包括计费。此外,它们必须完全支持实现客户端服务所需的每个 Diameter 应用程序,例如网络访问服务器需求(NASREQ)[RFC2881] 和/或 Mobile IPv4。Diameter 客户端必须称为"Diameter X 客户端",其中 X 是它支持的应用程序,而不是"Diameter 客户端"。
Diameter 服务器必须支持基础协议,其中包括计费。此外,它们必须完全支持实现预期服务所需的每个 Diameter 应用程序,例如 NASREQ 和/或 Mobile IPv4。Diameter 服务器必须称为"Diameter X 服务器",其中 X 是它支持的应用程序,而不是"Diameter 服务器"。
Diameter 中继和重定向代理对 Diameter 应用程序是透明的,但它们必须支持 Diameter 基础协议(包括计费)和所有 Diameter 应用程序。
Diameter 代理必须支持基础协议,其中包括计费。此外,它们必须完全支持实现代理服务所需的每个 Diameter 应用程序,例如 NASREQ 和/或 Mobile IPv4。Diameter 代理必须称为"Diameter X 代理",其中 X 是它支持的应用程序,而不是"Diameter 代理"。
2.1. 传输
Diameter 传输配置文件在 [RFC3539] 中定义。
基础 Diameter 协议在端口 3868 上运行,支持 TCP [RFC0793] 和 SCTP [RFC4960]。对于 TLS [RFC5246] 和数据报传输层安全(DTLS)[RFC6347],在任何消息交换之前发起连接的 Diameter 节点必须在端口 5658 上运行。假设当使用 TLS 时,它在 TCP 之上运行,当使用 DTLS 时,它在 SCTP 之上运行。
如果 Diameter 对等节点不支持在端口 5658 上接收 TLS/TCP 和 DTLS/SCTP 连接(即,对等节点仅符合 RFC 3588),则发起方可以回退到在端口 3868 上使用 TCP 或 SCTP。请注意,此方案仅出于向后兼容性的目的而保留,并且当初始 CER/CEA 消息以未受保护的方式发送时存在固有的安全漏洞(请参见第 5.6 节)。
Diameter 客户端必须支持 TCP 或 SCTP;代理和服务器应该同时支持两者。
Diameter 节点可以从除其声明接受传入连接的端口之外的源端口发起连接,并且它必须始终准备好在端口 3868 上接收 TCP 或 SCTP 连接,在端口 5658 上接收 TLS/TCP 和 DTLS/SCTP 连接。当使用基于 DNS 的对等节点发现(第 5.2 节)时,从 SRV 记录接收的端口号优先于默认端口(3868 和 5658)。
对等节点状态机的给定 Diameter 实例不得使用多个传输连接与给定对等节点通信,除非对等节点上存在多个实例,在这种情况下允许每个进程使用单独的连接。
当与对等节点不存在传输连接时,应该定期尝试连接。此行为通过 Tc 定时器处理(有关详细信息,请参见第 12 节),其推荐值为 30 秒。此规则有某些例外,例如当对等节点终止传输连接并声明它不希望通信时。
在连接到对等节点时,如果指定了零个或多个传输,应该首先尝试 TLS,然后是 DTLS,然后是 TCP,最后是 SCTP。有关对等节点发现的更多信息,请参见第 5.2 节。
Diameter 实现应该能够将 ICMP 协议端口不可达消息解释为服务器不可达的明确指示,但需遵守关于信任此类消息的安全策略。有关处理 ICMP 错误的进一步指导可以在 [RFC5927] 和 [RFC5461] 中找到。Diameter 实现还应该能够解释来自传输层的重置和超时的连接尝试。如果 Diameter 从下层接收到无法解析或识别为对等节点发出的 Diameter 错误的数据,则流已受损且无法恢复。必须使用 RESET 调用(发送 TCP RST 位)或 SCTP ABORT 消息关闭传输连接(优雅关闭已受损)。
2.1.1. SCTP 指南
Diameter 消息应该以避免队头阻塞(HOL)的方式映射到 SCTP 流中。在满足此要求的不同映射方式中,建议 Diameter 节点在设置了无序标志的情况下,通过流零发送每个 Diameter 消息(请求或响应)。但是,Diameter 节点可以选择并实现其他避免 HOL 阻塞的设计替代方案,例如使用清除了无序标志的多个流(如 RFC 3588 中最初指示的那样)。在接收端,Diameter 实体必须准备好在任何流上接收 Diameter 消息,并且可以自由地在不同的流上返回响应。这样,双方在发送方向上独立地管理可用流,而不依赖于另一方选择的流来发送特定的 Diameter 消息。这些消息可以是无序的,并属于不同的 Diameter 会话。
在连接建立和终止期间,无序交付存在特殊问题。当建立连接时,响应方发送 CEA 消息并按照第 5.6 节中的规定移动到 R-Open 状态。如果在 CEA 之后不久发送应用消息并以无序方式交付,则仍处于 Wait-I-CEA 状态的发起方将丢弃应用消息并关闭连接。为了避免这种竞争条件,接收方不应该使用无序交付方法,直到从发起方接收到第一条消息,证明它已移动到 I-Open 状态。为了触发这样的消息,接收方可以在发送 CEA 后立即发送 DWR。在收到相应的 DWA 后,接收方应该开始使用无序交付方法来对抗 HOL 阻塞。
当使用 DPR 和 DPA 消息时,可能会发生另一种竞争条件。DPR 和 DPA 的大小都很小;因此,当使用无序交付机制时,它们可能比应用消息更快地交付给对等节点。因此,可能在应用消息仍在传输中时,DPR/DPA 交换就完成了,导致这些消息丢失。实现可以缓解此竞争条件,例如,使用定时器,并等待短时间以便待处理的应用级消息到达,然后再继续断开传输连接。最终,丢失的消息由第 5.5.4 节中描述的重传机制处理。
Diameter 代理应该为明文和加密的 SCTP DATA 块使用专用的有效载荷协议标识符(PPID),而不是仅使用未指定的有效载荷协议标识符(值 0)。为此,分配了两个 PPID 值:PPID 值 46 用于明文 SCTP DATA 块中的 Diameter 消息,PPID 值 47 用于受保护的 DTLS/SCTP DATA 块中的 Diameter 消息。
2.2. 保护 Diameter 消息
Diameter 对等节点之间的连接应该受到 TLS/TCP 和 DTLS/SCTP 的保护。所有 Diameter 基础协议实现必须支持使用 TLS/TCP 和 DTLS/SCTP。如果需要,可以部署独立于 Diameter 的替代安全机制(例如 IPsec [RFC4301])来保护对等节点之间的连接。不得在没有 TLS、DTLS 或 IPsec 之一的情况下使用 Diameter 协议。
2.3. Diameter 应用程序符合性
应用程序 ID 在能力交换阶段公布(请参见第 5.3 节)。公布对应用程序的支持意味着发送方支持相应 Diameter 应用程序规范中指定的功能。
实现可以向应用程序中定义的命令添加任意可选的 AVP(M 位已清除)(包括供应商特定的 AVP),但前提是命令的 CCF 语法规范允许这样做。有关详细信息,请参阅第 11.1.1 节。
2.4. 应用程序标识符
每个 Diameter 应用程序必须有一个 IANA 分配的应用程序 ID。基础协议不需要应用程序 ID,因为它的支持是强制性的。在能力交换期间,Diameter 节点通知其对等节点本地支持的应用程序。此外,所有 Diameter 消息都包含一个应用程序 ID,该 ID 在消息转发过程中使用。
定义了以下应用程序 ID 值:
Diameter common message 0
Diameter base accounting 3
Relay 0xffffffff
中继和重定向代理必须公布中继应用程序 ID,而所有其他 Diameter 节点必须公布本地支持的应用程序。接收到公布中继服务的能力交换消息的接收方必须假设发送方支持所有当前和未来的应用程序。
Diameter 中继和代理代理负责查找支持特定消息应用程序的上游服务器。如果找不到,则返回错误消息,其中 Result-Code AVP 设置为 DIAMETER_UNABLE_TO_DELIVER。
2.5. 连接与会话
本节试图使读者了解"连接"和"会话"之间的区别,这两个术语在本文档中广泛使用。
连接是指两个对等节点之间的传输层连接,用于发送和接收 Diameter 消息。会话是应用层的逻辑概念,存在于 Diameter 客户端和 Diameter 服务器之间;它通过 Session-Id AVP 进行标识。
+--------+ +-------+ +--------+
| Client | | Relay | | Server |
+--------+ +-------+ +--------+
<----------> <---------->
对等连接 A 对等连接 B
<----------------------------->
用户会话 x
图 1:Diameter 连接和会话
在图 1 提供的示例中,对等连接 A 建立在客户端和中继之间。对等连接 B 建立在中继和服务器之间。用户会话 X 从客户端经由中继跨越到服务器。服务的每个"用户"都会导致发送一个认证请求,该请求具有唯一的会话标识符。一旦被服务器接受,客户端和服务器都知道该会话。
重要的是要注意,连接和会话之间没有关系,并且多个会话的 Diameter 消息都通过单个连接进行多路复用。另外,请注意,与会话相关的 Diameter 消息,包括应用程序特定的消息和本文档中定义的消息(如 ASR/ASA、RAR/RAA 和 STR/STA),必须携带应用程序的应用程序 ID。与对等连接建立和维护相关的 Diameter 消息(如 CER/CEA、DWR/DWA 和 DPR/DPA)必须携带应用程序 ID 零(0)。
2.6. 对等节点表
Diameter 对等节点表用于消息转发,并由路由表引用。对等节点表条目包含以下字段:
主机标识
遵循第 4.3.1 节中描述的 DiameterIdentity 派生的 AVP 数据格式约定,此字段包含在 CER 或 CEA 消息中找到的 Origin-Host(第 6.3 节)AVP 的内容。
StatusT
这是对等节点条目的状态,它必须与第 5.6 节中列出的值之一匹配。
静态或动态
指定对等节点条目是静态配置的还是动态发现的。
过期时间
指定动态发现的对等节点表条目要刷新或过期的时间。如果将公钥证书用于 Diameter 安全性(例如,使用 TLS),则此值不得大于相关证书中的到期时间。
TLS/TCP 和 DTLS/SCTP 已启用
指定在与对等节点通信时是否使用 TLS/TCP 和 DTLS/SCTP。
需要时的其他安全信息(例如,密钥、证书)。
2.7. 路由表
所有基于域的路由查找都针对通常称为路由表的内容执行(请参见第 12 节)。每个路由表条目包含以下字段:
域名
这是必须在路由表查找中用作主键的字段。请注意,某些实现基于域从右侧开始的最长匹配执行查找,而不是要求精确匹配。
应用程序标识符
应用程序由应用程序 ID 标识。路由条目可以根据消息头中的应用程序 ID 具有不同的目的地。此字段必须在路由表查找中用作辅助键字段。
本地操作
本地操作字段用于标识应如何处理消息。支持以下操作:
-
LOCAL - 可以在本地满足且不需要路由到另一个 Diameter 实体的 Diameter 消息。
-
RELAY - 属于此类别的所有 Diameter 消息必须路由到由下面描述的标识符指示的下一跳 Diameter 实体。路由在不修改任何非路由 AVP 的情况下完成。有关中继指南,请参见第 6.1.9 节。
-
PROXY - 属于此类别的所有 Diameter 消息必须路由到由下面描述的标识符指示的下一个 Diameter 实体。本地服务器可以在路由之前通过向消息中包含新的 AVP 来对消息应用其本地策略。有关代理指南,请参见第 6.1.9 节。
-
REDIRECT - 属于此类别的 Diameter 消息必须附加主 Diameter 服务器的标识,并返回给消息的发送方。有关重定向指南,请参见第 6.1.8 节。
服务器标识符
消息要路由到的一个或多个服务器的标识。此标识也必须存在于对等节点表(第 2.6 节)的主机标识字段中。当本地操作设置为 RELAY 或 PROXY 时,此字段包含消息必须路由到的服务器的标识。当本地操作字段设置为 REDIRECT 时,此字段包含消息必须重定向到的一个或多个服务器的标识。
静态或动态
指定路由条目是静态配置的还是动态发现的。
过期时间
指定动态发现的路由表条目过期的时间。如果将公钥证书用于 Diameter 安全性(例如,使用 TLS),则此值不得大于相关证书中的到期时间。
重要的是要注意,Diameter 代理必须至少支持 LOCAL、RELAY、PROXY 或 REDIRECT 操作模式之一。代理不需要支持所有操作模式即可符合协议规范,但它们必须遵循第 2 节中的协议符合性指南。中继代理和代理不得重新排序 AVP。
路由表可以包括一个默认条目,该条目必须用于不匹配任何其他条目的任何请求。路由表可能仅由这样的条目组成。
当路由请求时,目标服务器必须已为给定消息公布应用程序 ID(请参见第 2.4 节),或已将自己公布为中继或代理代理。否则,将返回错误,其中 Result-Code AVP 设置为 DIAMETER_UNABLE_TO_DELIVER。
2.8. Diameter 代理的角色
除了客户端和服务器之外,Diameter 协议还引入了中继、代理、重定向和转换代理,每个代理在第 1.2 节中定义。Diameter 代理在以下几个方面很有用:
- 它们可以将系统管理分配给可配置的分组,包括维护安全关联。
- 它们可以用于将来自多个同位置或分布式 NAS 设备集的请求集中到一组类似的用户组。
- 它们可以对请求或响应进行增值处理。
- 它们可以用于负载平衡。
- 复杂的网络将有多个认证源,它们可以对请求进行分类并转发到正确的目标。
Diameter 协议要求代理维护事务状态,该状态用于故障转移目的。事务状态意味着在转发请求时,保存其 Hop-by-Hop 标识符;该字段被替换为本地唯一的标识符,当接收到相应的应答时,该标识符将恢复为其原始值。请求的状态在收到应答时释放。无状态代理是仅维护事务状态的代理。
Proxy-Info AVP 允许无状态代理向 Diameter 请求添加本地状态,并保证应答中将存在相同的状态。但是,协议的故障转移过程要求代理维护待处理请求的副本。
有状态代理是通过跟踪所有授权的活动会话来维护会话状态信息的代理。每个授权的会话都绑定到特定的服务,并且其状态被视为活动状态,直到代理收到其他通知或会话过期为止。每个授权的会话都有一个过期时间,该过期时间由 Diameter 服务器通过 Session-Timeout AVP 传达。
在某些应用程序中,维护会话状态可能很有用,例如:
- 协议转换(例如,RADIUS <-> Diameter)
- 限制授权给特定用户的资源
- 按用户或按事务审计
Diameter 代理可以对某些请求以有状态方式操作,而对其他请求则是无状态的。Diameter 实现可以对某些请求充当一种类型的代理,而对其他请求充当另一种类型的代理。
2.8.1. 中继代理
中继代理是 Diameter 代理,它们接受请求并根据消息中找到的信息(例如,Destination-Realm AVP 第 6.6 节的值)将消息路由到其他 Diameter 节点。此路由决策使用支持的域和已知对等节点的列表执行。这称为路由表,如第 2.7 节中进一步定义的那样。
例如,中继可以用于聚合来自公共地理区域(存在点,POP)内的多个网络访问服务器(NAS)的请求。使用中继是有利的,因为它消除了 NAS 需要配置与其他域中的 Diameter 服务器通信所需的必要安全信息的需求。同样,这减少了添加、更改或删除 NAS 时 Diameter 服务器上的配置负载。