Diameter 基本概念 For RFC3588 and TS129.229 起源 • Diameter 协议的最初提出是作为 Radius 协 议的改进或者替代,它的引入是作为支持 基于 IP 技术的 AAA 协议。 功能 • Diameter 基础协议(RFC3588)旨在提供一个 AAA 框架: 1. 认证(Authentication),用户在使用网络系统中的资 源时对用户身份进行确认; 2. 授权(Authorization),网络系统授权用户以特定的方 式使用其资源; 3. 计费(Accounting),网络系统收集、记录用户对其资 源的使用情况,以便向用户收取资源使用费用,或者 用于审计等目的。 • Diameter 扩展协议根据这一框架实现特定的功能,例如 IMS 系统中的: 1. Cx 接口(I-CSCF / S-CSCF 与 HSS 间的接口); 2. Rf 接口(离线计费接口),Ro 接口(实时计费接口)。 协议栈 • • • • • Diameter 应用协议 Diameter 基础协议 TLS(传输层安全) TCP / SCTP IP / IPSec 协议栈 > SCTP • SCTP 与 TCP 相同点是: 1. 面向连接; 2. 保证数据的可靠性和有序性; 3. 应用窗口机制以提供流控。 • SCTP 还提供一些 TCP 不具备的能力: 1. 两端点间的多数据流传输; 2. 面向消息,而 TCP 则是面向比特的; 3. 基于多宿主主机的高可用性,多宿主主机是 指一台具有多个网络接口的主机。 角色 • 每一个 Diameter 节点都被称为 Peer。任何 一个 Peer 至少充当如下角色之一: 1. Client 2. Server 3. Relay Agent(中继代理) 4. Proxy Agent(委托代理) 5. Redirector Agent(重定向代理) 6. Translation Agent(翻译代理) 角色 > Client / Server • 发起请求消息方被称为 Client。 • 接收并处理请求方被称为 Server。 • 哪个节点作为 Client,哪个节点作为 Server 仅仅是一个逻辑概念,没有实际的物理实 现上的差别。 • Diameter 是对等协议(Peer-To-Peer protocol)。 角色 > Client / Server +--------------------+ | +------+ | | | CSCF | | | +------+ | ACR +--------------------+ | +------+ |------------------------------->| +------+ | | Client | AS | | | | CCF | Server | | +------+ |<-------------------------------| +------+ | | +------+ | ACA +--------------------+ | | MGCF | | | +------+ | +--------------------+ +--------------------+ RTR / PPR +--------------------+ | +------+ |<-------------------------------| +------+ | | Server | CSCF | | | | HSS | Client | | +------+ |------------------------------->| +------+ | +--------------------+ RTA / PPA +--------------------+ 角色 > 中继代理 • 根据消息中的路由信息以及路由表转发消 息。 • 会在消息中插入、删除路由信息,但不会 修改消息的其它部分。 • 不维护会话状态,但必须维护事务状态。 • 可以减少服务器的配置负担。 +------+ | NAS | +------+ example.net 1. Request ---------> 4. Answer <--------- +------+ | DRL | +------+ example.net 2. Request ---------> 3. Answer <--------- +------+ | HMS | +------+ example.com 角色 > 委托代理 • 与中继代理类似,根据消息中的路由信息 以及路由表转发消息。 • 但是除了会在消息中插入、删除路由信息, 还会修改消息的其它部分以提供增值功能。 角色 > 重定向代理 • 当中继代理无法找到适当的路由时,可以将消息 通过缺省路由发给重定向代理,重定向代理返回 一个特定路由响应给中继代理以重定向该消息。 • 存在的价值之一是集中配置域内所有的路由信息。 • 本身并不转发任何消息。 +------+ | DRD | +------+ ^ | 1. Request | | 2. Answer (Redirect-Host) | v 3. Request +------+ ---------> +------+ | NAS | 4. Answer | HMS | +------+ <--------+------+ example.net example.com 角色 > 翻译代理 • 提供了协议转换的功能。 • 保证了传统 AAA 协议和新协议的互通。 RADIUS Request Diameter Request +------+ ---------> +------+ ---------> +------+ | NAS | RADIUS Answer | TLA | Diameter Answer | HMS | +------+ <--------+------+ <--------+------+ example.net example.net example.com 消息结构 > 消息头 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Version | Message Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | command flags | Command-Code | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Application-ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Hop-by-Hop Identifier | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | End-to-End Identifier | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | AVPs ... +-+-+-+-+-+-+-+-+-+-+-+-+- 消息结构 > 消息头 • Version:目前全部填写 1。 • Message Length:填写包含消息头的整个消息的长度。 • Command Flags: 0 1 2 3 4 5 6 7 +-+-+-+-+-+-+-+-+ |R P E T r r r r| +-+-+-+-+-+-+-+-+ 1. R:请求消息填写为 1,响应消息填写为 0; 2. P:本消息是否可以被转发; 3. E:如果本消息是响应消息,并且指明了某种错误信息,则置为 1; 4. T:本消息是否是重发消息。 • Command-Code:消息命令码,响应消息和对应的请求消息的命令码 是一样的。 • Application-ID:消息涉及的应用 ID。 • Hop-by-Hop,End-to-End:后面描述。 消息结构 > AVP 头 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | AVP Code | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V M P r r r r r| AVP Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Vendor-ID (opt) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data ... +-+-+-+-+-+-+-+-+ 消息结构 > AVP 头 • AVP Code:AVP 码。 • AVP Flags: 1. V:本 AVP 头之中是否出现 Vendor-ID 字段; 2. M:本 AVP 是否属于必需 AVP,有一些 AVP 是必须出现的,例 如 Original-Host AVP 和 Original-Realm AVP,Session-ID AVP 在 计费消息中必须出现; 3. P:本 AVP 的数据部分是否经过了加密。 • AVP Length:本 AVP 包含数据部分的长度,注意任何 AVP 的数 据部分长度都必须为 4 的整数倍,不够的以‘\0’填充。 • Vendor-ID:可选,标识生成本 AVP 值的设备的供应商。 • Data:记录具体的数据值,具体数据的类型是 AVP Code 决定。 消息结构 > 基本 AVP 格式 • • • • • • • • OctetString:包含任意长度的数据。除非另外注明,AVP 长度字段必须至少设 置为 8(如果“V”比特有效,则为 12)。这种 AVP 应该按照 32 比特对齐,这 样下一个 AVP 才能在一个 32 比特边界开始。 Integer32:32 比特有符号值,按照网络字节顺序传送。AVP 长度字段必须设 置为 12(如果“V”比特有效,则为 16)。 Integer64:64 比特有符号值,按照网络字节顺序传送。AVP 长度字段必须设 置为 16(如果“V”比特有效,则为 20)。 Unsigned32:32 比特无符号值,按照网络字节顺序传送。AVP 长度字段必须 设置为 12(如果“V”比特有效,则为 16)。 Unsigned64:64 比特无符号值,按照网络字节顺序传送。AVP 长度字段必须 设置为 16(如果“V”比特有效,则为 20)。 Float32:单精度浮点值,按照网络字节顺序传送。AVP 长度字段必须设置为 12(如果“V”比特有效,则为 16)。 Float64:双精度浮点值,按照网络字节顺序传送。AVP 长度字段必须设置为 16(如果“V”比特有效,则为 20)。 Grouped:包含一系列子 AVP。这些子 AVP 按其定义的顺序排列,每一个都包 括它们的头和填充位。AVP 长度字段必须设置为 8(如果“V”比特有效,则为 12)加上所有子 AVP 的 AVP 长度字段值的总和。 消息结构 > 派生 AVP 格式 • • • • • Address:从 OctetString 格式派生。 Time:从 OctetString 格式派生。 UTF8String:从 OctetString 格式派生。 DiameterIdentity:从 OctetString 格式派生。 DiameterURI:从 OctetString 格式派生。它必 须遵循统一资源标识符(URI)语法规则。 • Enumerated:从 Integer32 格式派生。该定义 包含一个有效值的列表和它们的解释。 • IPFilterRule:从 OctetString 格式派生。 • QoSFilterRule:从 OctetString 格式派生。 消息结构 > Grouped AVP • Grouped AVP 使消息呈现一个树形结构。 Command |- Avp |- Avp | |- Avp | |- Avp | \- Avp |- Avp \- Avp 对等端 • 一个 Diameter 节点具有和多个对等端通信 的能力。 对等端 > 对等端列表 • 每一个对等端列表项应包括: 1. Host identity,主机标识; 2. StatusT,对端状态,RFC3588 > 5.6; 3. Static or Dynamic,不确定; 4. Expiration time,不确定; 5. TLS Enabled,TLS 是否生效。 对等端 > 连接和会话 • 连接是两个对等端之间的一个传输层连接,用于 发送和接收消息。会话是一个应用层的逻辑概念, 在一个接入设备和一个服务器之间共享,并且通 过 Session-Id AVP 来标识。 • 连接和会话之间并没有关系,一个会话可以跨越 多个连接,而用于多会话的消息也可以在一个单 独的连接中传送。 +--------+ +-------+ +--------+ | Client | | Relay | | Server | +--------+ +-------+ +--------+ <----------> <----------> peer connection A peer connection B <-----------------------------> User session x 对等端 > 建立连接 • 两个对等端建立连接时,必须交换能力信息,以 了解对等端的标识和能力(协议版本号、支持的 应用、安全机制等)。一个节点必须缓存对等端 所支持的应用,以确保未被识别的命令和 AVP 不 会发送给它的对等端。 +--------+ +--------+ | Client | | Server | +--------+ +--------+ | TCP / SCTP connect | |<----------------------------->| | CER | |------------------------------>| | CEA | |<------------------------------| | | 对等端 > 建立连接 • 能力交换请求消息(Capabilities-Exchange-Request) <CER> ::= < Diameter Header: 257, REQ > { Origin-Host } { Origin-Realm } 1* { Host-IP-Address } { Vendor-Id } { Product-Name } [ Origin-State-Id ] * [ Supported-Vendor-Id ] * [ Auth-Application-Id ] * [ Inband-Security-Id ] * [ Acct-Application-Id ] * [ Vendor-Specific-Application-Id ] [ Firmware-Revision ] * [ AVP ] 对等端 > 建立连接 • 能力交换应答消息(Capabilities-Exchange-Answer) <CEA> ::= < Diameter Header: 257 > { Result-Code } { Origin-Host } { Origin-Realm } 1* { Host-IP-Address } { Vendor-Id } { Product-Name } [ Origin-State-Id ] [ Error-Message ] * [ Failed-AVP ] * [ Supported-Vendor-Id ] * [ Auth-Application-Id ] * [ Inband-Security-Id ] * [ Acct-Application-Id ] * [ Vendor-Specific-Application-Id ] [ Firmware-Revision ] * [ AVP ] 对等端 > 监视状态 +--------+ +--------+ | Client | | Server | +--------+ +--------+ | DWR | |------------------------------>| | DWA | |<------------------------------| | | 对等端 > 监视状态 • 设备监控请求消息(Device-Watchdog-Request) <DWR> ::= < Diameter Header: 280, REQ > { Origin-Host } { Origin-Realm } [ Origin-State-Id ] • 设备监控应答消息(Device-Watchdog-Answer) <DWA> ::= < Diameter Header: 280 > { Result-Code } { Origin-Host } { Origin-Realm } [ Error-Message ] * [ Failed-AVP ] [ Original-State-Id ] 对等端 > 断开连接 +--------+ +--------+ | Client | | Server | +--------+ +--------+ | DPR | |------------------------------>| | DPA | |<------------------------------| | TCP / SCTP disconnect | |<----------------------------->| | | 对等端 > 断开连接 • 拆除对等端连接请求(Disconnect-Peer-Request) <DPR> ::= < Diameter Header: 282, REQ > { Origin-Host } { Origin-Realm } { Disconnect-Cause } • 拆除对等端连接应答(Disconnect-Peer-Answer) <DPA> ::= < Diameter Header: 282 > { Result-Code } { Origin-Host } { Origin-Realm } [ Error-Message ] * [ Failed-AVP ] 消息处理 > 转发请求消息 • Diameter 节点根据请求消息中的转发信息以及对等端列 表对其进行转发。 • 转发信息包括: 1. Destination-Host AVP。 • 在转发请求之前,应该给该消息分配一个新的 Hop-byHop 值,然后在待响应请求列表中添加对应项; • 待响应请求列表节点应记录: 1. 新分配的 Hop-by-Hop 值; 2. 上一跳的 Hop-by-Hop 值(非第一跳时); 3. 上一跳的 Peer 信息,包括 IP、port 和 protocol 等(非 第一跳时); 4. 消息体(可选)。 消息处理 > 路由请求消息 • Diameter 代理根据请求消息中的路由信息以及路由表对其进行 路由。 • 路由信息包括: 1. Destination-Realm AVP; 2. Acct-Application-Id AVP、Auth-Application-Id 或 Vendor-SpecificApplication-Id AVP; • 路由表的生成依赖于对等端列表。 • 路由表的每一个路由项应包括: 1. 查询输入:域名,应用标识; 2. 查询输出:下一跳的主机名,该主机名必须出现在对等端列 表中。 • 在路由请求之前,在该消息中添加一个 Router-Record AVP,记 录上一跳的 Peer 标识。 消息处理 > 处理请求消息 • 消息中没有 Destination-Host AVP 和 Destination-Realm AVP,则交给本端上层应用处理。 • 消息中有 Destination-Host AVP: 1. 如果其值等于本端标识,则交给本端上层应用处理; 2. 如果其值等于一个与本端直接相连的对端标识,则转 发给该对端处理。 • 消息中没有 Destination-Host AVP 但是有 DestinationRealm AVP: 1. 如果该字段值等于本端可以支持的域范围,并且本端 可以处理该应用的请求,则交给本端上层应用处理; 2. 否则查询路由表,寻找一个特定的路由将该消息转发 给一个与本端直接相连的对端。 消息处理 > 路由响应消息 • 响应消息根据待响应请求列表进行路由。 • 在路由响应消息之前,应该设置该消息的 Hop-by-Hop 值为待响应请求列表中对应项 的上一跳的 Hop-by-Hop 值,然后删除该对 应项。 消息处理 > 例子 • relay.cn 的对等端列表: { HostIdentity: "client.cn", ... } { HostIdentity: "relay.tw", ... } { HostIdentity: "relay.hk", ... } • relay.cn 的路由表: { Realm: "tw", HostIdentity: "relay.tw" } { Realm: "hk", HostIdentity: "relay.hk" } +----------+ +-----------+ +------------------| relay.tw |---------------| server.tw | | +----------+ +-----------+ | +-----------+ +----------+ +----------+ +-----------+ | client.cn |---------------| relay.cn |---------------| relay.hk |---------------| server.hk | +-----------+ +----------+ +----------+ +-----------+ 消息处理 > 例子 1. 2. 3. 4. 5. 6. 7. client.cn 产生 Request: { HopByHop: 1, DestinationHost: "server.hk", DestinationRealm: "hk", ... },待响应请求列表[1]: { LastHopByHop: null, ... },发送 Request; relay.cn 收到 Request,修改为 { HopByHop: 2, DestinationHost: "server.hk", DestinationRealm: "hk", RouteRecord: "client.cn", ... },待响应请求列表[2]: { LastHopByHop: 1, ... },路由 Request; relay.hk 收到 Request,修改为 { HopByHop: 3, DestinationHost: "server.hk", DestinationRealm: "hk", RouteRecord: "relay.cn", RouteRecord: "client.cn", ... },待响应请 求列表[3]: { LastHopByHop: 2, ... },转发 Request; server.hk 收到 Request,产生 Answer: { HopByHop: 3, ... },发送 Answer; relay.hk 收到 Answer,修改为 { HopByHop: 2, ... },删除待响应请求列表[3],转发 Answer; relay.cn 收到 Answer,修改为 { HopByHop: 1, ... },删除待响应请求列表[2],转发 Answer; client.cn 收到 Answer,删除待响应请求列表[1]。 +----------+ +-----------+ +------------------| relay.tw |---------------| server.tw | | +----------+ +-----------+ | +-----------+ 1. Request -> +----------+ 2. Request -> +----------+ 3. Request -> +-----------+ | client.cn |---------------| relay.cn |---------------| relay.hk |---------------| server.hk | +-----------+ <- 6. Answer +----------+ <- 5. Answer +----------+ <- 4. Answer +-----------+ 错误处理 > 协议栈错误 • 当节点收到代表协议栈错误的响应消息或超时 没有收到响应消息时: 1. 如果保存了原始请求消息,可以寻找替代路 由发送该消息; 2. 否则,应该通知上一跳。 1. Request +---------+ Link Broken +-------------------------->|Diameter |----///----+ | +---------------------| | v +------+--+ | 2. Answer + ’E’ set | Relay 2 | +--------+ |Diameter |<-+ (Unable to Forward) +---------+ |Diameter| | | | Home | | Relay 1 |--+ +---------+ | Server | +---------+ | 3. Request |Diameter | +--------+ +-------------------->| | ^ | Relay 3 |-----------+ +---------+ 错误处理 > 应用错误 • 主要是消息格式或内容有错误,错误原因 由 Result-Code 表示。 +---------+ 1. Request +---------+ 2. Request +---------+ | Access |------------>|Diameter |------------>|Diameter | | | | | | Home | | Device |<------------| Relay |<------------| Server | +---------+ 4. Answer +---------+ 3. Answer +---------+ (Missing AVP) (Missing AVP) IMS 中的 Diameter 应用 Cx 命令 缩写 发送方向 User-Authorization-Request UAR I-CSCF -> HSS User-Authorization-Answer UAA HSS -> I-CSCF Multimedia-Auth-Request MAR S-CSCF -> HSS Multimedia-Auth-Answer MAA HSS -> S-CSCF Server-Assignment-Request SAR S-CSCF -> HSS Server-Assignment-Answer SAA HSS -> S-CSCF Location-Info-Request LIR I-CSCF -> HSS Location-Info-Answer LIA HSS -> I-CSCF Registration-Termination-Request RTR HSS -> S-CSCF Registration-Termination-Answer RTA S-CSCF -> HSS Push-Profile-Request PPR HSS -> S-CSCF Push-Profile-Answer PPA S-CSCF -> HSS Cx > UAR / UAA • 应用场景: 1. 用户注册; 2. 用户注销。 • 作用: 1. I-CSCF 通过 HSS 查询 S-CSCF。 • HSS 处理: 1. 判断 IMPU 在当前网络是否具有漫游权限; 2. 判断 IMPU 是否有注册权限; 3. 判断 IMPU 是否未闭锁。 4. 返回 S-CSCF 的名字或能力集。 Cx > MAR / MAA • 应用场景: 1. S-CSCF 向 HSS 获取鉴权向量(AV); 2. UE 和 HSS 之间同步失败,S-CSCF 向 HSS 上报重同步请 求。 • HSS 重同步处理: 1. 解析和验证 AUTS; 2. 同步 SQNhe 为 SQNms; 3. 计算新的鉴权向量返回给 S-CSCF。 • HSS 鉴权向量处理: 1. 检查用户的注册状态并且判断 S-CSCF 的名字是否和 HSS 中保存的相同; 2. 计算鉴权向量返回给 S-CSCF。 Cx > SAR / SAA • 应用场景: 1. S-CSCF 通知 HSS 注册或者注销用户; 2. S-CSCF 向 HSS 请求用户的签约数据。 • HSS 处理: 1. 检查用户的注册状态并且更新为新的注册 状态; 2. 为用户保存 S-CSCF 的名字; 3. 返回用户的签约数据和 / 或计费地址信息。 Cx > LIR / LIA • 应用场景: 1. 当用户作为被叫,I-CSCF 向 HSS 查询用户所属 的 S-CSCF。 • HSS 处理: 1. 当用户的状态为 registered 或者 unregistered, HSS 返回 S-CSCF 的名字; 2. 当用户的状态为 not registered,而且用户签 约了未注册状态业务,HSS 返回 S-CSCF 名字 或者能力集; 3. 其他情况,HSS 返回响应的错误信息。 Cx > RTR / RTA • 应用场景: 1. 用户的签约关系被更改; 2. 用户分配了新的 S-CSCF; 3. 用户的 S-CSCF 将会产生变化; 4. S-CSCF 不能再为用户服务。 • HSS 发送 RTR 给 S-CSCF 进行网络侧用户注 销。 Cx > PPR / PPA • 应用场景: 1. 当用户的签约数据或者计费地址信息被更 改,HSS 将更改后的数据通过 PPR 发送给 S-CSCF。 • S-CSCF 处理: 1. 马上更新用户数据; 2. 如果用户数据不支持、用户不存在或者用 户数据过大,将返回响应的错误码给 HSS。 Cx > 注册流程 Visited Network UA P-CSCF 1. Register • Home Network I-CSCF HSS S-CSCF 2. Register • 3. UAR 4. UAA 选择 S-CSCF • 5. Register 6. MAR 选择鉴权向量 9. 401 Unauthorised 10. 401 Unauthorised RAND||AUTN||CK||IK RAND||AUTN 11. Register 12. Register response response 7. MAA RAND||AUTN||XRES||CK||IK 8. 401 Unauthorised RAND||AUTN||CK||IK 13. UAR 14. UAA 15. Register response 鉴权 18. SAR 19. SAA 22. OK 21. OK 20. OK I-CSCF 通过 UAR 向 HSS 查询 S-CSCF。 S-CSCF 通过 MAR 向 HSS 查询鉴权向量。 S-CSCF 通过 SAR 向 HSS 查询用户数据。