首页 > 代码库 > Diameter协议
Diameter协议
Diameter是计算机网络中使用的一个认证、授权和审计协议。它从功能更少的RADIUS协议进化而来,并且取代之。
Dimater应用通过添加新的命令或属性扩展基础协议,例如使用扩展认证 协议(EAP)。
与RADIUS协议比较
名字是一个单词游戏(从RADIUS,半径到DIAMETER,直径),从前任RADIUS协议演化而来(直径是半径的二倍)。Diameter不直接后向兼容,但是提供RADIUS升级路径。DIAMETER提供的主要特征(RADIUS中缺乏的)有:
* 可靠传输协议(TCP或SP,不是UDP)
* IETF正在标准化RADIUS的TCP传输
* 网络或者传输层安全(IPsec或TLS)
* IETF正在标准化话RADIUS的TLS
* 支持RADIUS过度,虽然Diameter不完全兼容RADIUS
* 属性值对(AVP)和标示符的更大地址空间(32bit替代8bit)
* 客户端服务器协议,除了支持一些服务器发起的消息
* 可以使用有状态和无状态的模型
* 对端动态自动发现(使用DNS SRV和NAPTR)
* 协商功能
* 支持应用层应答,定义容错方法和状态机(RFC 3539)
* 错误指示
* 更好的漫游支持
* 更容易扩展,能够定义新的命令和属性
* 32字节的边界对齐
* 用户会话和审计的基本支持
注:RADIUS协议http://en.wikipedia.org/wiki/RADIUS
应用
Diameter应用不是软件应用,而是一个基于定义在RFC 6733(过时:RFC 3588)Diameter基本协议的协议层应用。通过一个应用标识符定义每个应用,可以添加新的命令代码或者新的必选AVP。添加新的可选AVP不要求一个新的应用。
Diameter应用示例:
1) Diameter移动IPV4应用(MobileIP,RFC 4004)
2)Diameter网络访问服务应用(NASREQ,RFC 4005)
3)Diameter扩展认证协议应用(RFC4072)
4) Diameter信任控制应用(DCCA,RFC 4740)
5)3GPP IP多媒体子系统(IMS)中各种应用
6) 使用Diameter协议在HSS和SF之间进行通信。
通用自展结构:自举服务功能。
历史
Diameter协议由Pat R. Calhoun、Glen Zorn和Ping Pan于1998年开始开发提供认证、鉴权和审计(AAA)框架,它克服了RADIUS的限制。RADIUS有可靠性、扩展性、安全性和灵活性的问题。RADIUS不能有效地处理远程访问、IP移动性和策略控制。Diameter协议定义一个策略协议,提供给客户端执行策略、AAA和资源控制。这允许单个服务处理许多服务的策略。
就像RADIUS,Diameter提供AAA功能,但是使用TCP和SCTP替代UDP,因此通信问题的检测逻辑不包括在Diameter协议中(由TCP和SCTP保证)。Diameter协议通过开发3GPP IP多媒体系统(IMS)进一步增强。Diameter应用支持Cx、Dh、Dx、Rf和Sh接口。通过使用扩展,协议设计成可扩展支持代理、中间件、强安全性、移动IP、网络访问服务、账号和资源管理。
协议描述
Diameter基础协议定义在RFC6733追踪,定义AAA协议的最小的需求。Diameter应用可扩展成基础协议,通过添加新的命令、属性。Diameter安全由IPsec和TLS提供。IANA已经提供TCP或SCTP端口号给Diameter,SCTP的PPI(负载协议标识)为46。
报文格式:
报文由Diameter头部和可变数量的属性-值对或AV组成,用于Diameter消息相关的封装信息。
R(Request)位:如果设置,消息是请求,如果清除,消息是响应
P(代理)位:如果设置消息可能是代理、中继和重定向,如果清除,消息必须被本地处理。
E(错误)位:如果设置,消息包含协议错误,消息将不符合该命令的ABNF。带有E的消息位设置通常认为是错误消息。在请求消息中该位必须设置。
T(潜在重传消息)位:在链路故障产生时设置该标志,帮助删除重复的请求。当重发请求时设置,不作为由于链路失效可能的指示应答。
命令:
每个命令赋予一个命令代码,它用于请求和应答。
值0-255保留作为RADIUS后项兼容。值256-16777213是永久的,由IANA分配标准命令。值16777214和1677725(0xfffffe和0xffffff)保留给实验和测试目的。其它的可以给扩展使用。
一些通用的Diameter命令:
Command-Name | Abbr. | Code |
AA-Request | AAR | 265 |
AA-Answer | AAA | 265 |
Diameter-EAP-Request | DER | 268 |
Diameter-EAP-Answer | DEA | 268 |
Abort-Session-Request | ASR | 274 |
Abort-Session-Answer | ASA | 274 |
Accounting-Request | ACR | 271 |
Accounting-Answer | ACA | 271 |
Credit-Control-Request | CCR | 272 |
Credit-Control-Answer | CCA | 272 |
Capabilities-Exchange-Request | CER | 257 |
Capabilities-Exchange-Answer | CEA | 257 |
Device-Watchdog-Request | DWR | 280 |
Device-Watchdog-Answer | DWA | 280 |
Disconnect-Peer-Request | DPR | 282 |
Disconnect-Peer-Answer | DPA | 282 |
Re-Auth-Request | RAR | 258 |
Re-Auth-Answer | RAA | 258 |
Session-Termination-Request | STR | 275 |
Session-Termination-Answer | STA | 275 |
User-Authorization-Request | UAR | 300 |
User-Authorization-Answer | UAA | 300 |
Server-Assignment-Request | SAR | 301 |
Server-Assignment-Answer | SAA | 301 |
Location-Info-Request | LIR | 302 |
Location-Info-Answer | LIA | 302 |
Multimedia-Auth-Request | MAR | 303 |
Multimedia-Auth-Answer | MAA | 303 |
Registration-Termination-Request | RTR | 304 |
Registration-Termination-Answer | RTA | 304 |
Push-Profile-Request | PPR | 305 |
Push-Profile-Answer | PPA | 305 |
User-Data-Request | UDR | 306 |
User-Data-Answer | UDA | 306 |
Profile-Update-Request | PUR | 307 |
Profile-Update-Answer | PUA | 307 |
Subscribe-Notifications-Request | SNR | 308 |
Subscribe-Notifications-Answer | SNA | 308 |
Push-Notification-Request | PNR | 309 |
Push-Notification-Answer | PNA | 309 |
Bootstrapping-Info-Request | BIR | 310 |
Bootstrapping-Info-Answer | BIA | 310 |
Message-Process-Request | MPR | 311 |
Message-Process-Answer | MPA | 311 |
Update-Location-Request | ULR | 316 |
Update-Location-Answer | ULA | 316 |
Authentication-Information-Request | AIR | 318 |
Authentication-Information-Answer | AIA | 318 |
Notify-Request | NR | 323 |
Notify-Answer | NA | 323 |
属性-值对(AVP)
为了简化,“V”位表示厂商专用,M为意味着必须,P位意味着保护。
V位:作为厂商专用位,表示可选的Vendor-ID字段是否出现在AVP头部中,当设置时,AVP代码属于专用厂商代码地址空间。
M位:作为必选(强制)位,表示是否要求AVP支持。如果Diameter客户端、服务、代理和传输代理接收带有M位的AVP时,如果AVP或者它的值不能识别,消息必须被拒绝。Diameter中继和重定向代理绝不能拒绝带有不认识AVP的消息。
P位表示是否需要加密,提供端对端的安全。
Attribute-Name | Code | Data Type |
Acct-Interim-Interval | 85 | Unsigned32 |
Accounting-Realtime-Required | 483 | Enumerated |
Acct-Multi-Session-Id | 50 | UTF8String |
Accounting-Record-Number | 485 | Unsigned32 |
Accounting-Record-Type | 480 | Enumerated |
Accounting-Session-Id | 44 | OctetString |
Accounting-Sub-Session-Id | 287 | Unsigned64 |
Acct-Application-Id | 259 | Unsigned32 |
Auth-Application-Id | 258 | Unsigned32 |
Auth-Request-Type | 274 | Enumerated |
Authorization-Lifetime | 291 | Unsigned32 |
Auth-Grace-Period | 276 | Unsigned32 |
Auth-Session-State | 277 | Enumerated |
Re-Auth-Request-Type | 285 | Enumerated |
Class | 25 | OctetString |
Destination-Host | 293 | DiamIdent |
Destination-Realm | 283 | DiamIdent |
Disconnect-Cause | 273 | Enumerated |
E2E-Sequence | 300 | Grouped |
Error-Message | 281 | UTF8String |
Error-Reporting-Host | 294 | DiamIdent |
Event-Timestamp | 55 | Time |
Experimental-Result | 297 | Grouped |
Experimental-Result-Code | 298 | Unsigned32 |
Failed-AVP | 279 | Grouped |
Firmware-Revision | 267 | Unsigned32 |
Host-IP-Address | 257 | Address |
Inband-Security-Id | 299 | Unsigned32 |
Multi-Round-Time-Out | 272 | Unsigned32 |
Origin-Host | 264 | DiamIdent |
Origin-Realm | 296 | DiamIdent |
Origin-State-Id | 278 | Unsigned32 |
Product-Name | 269 | UTF8String |
Proxy-Host | 280 | DiamIdent |
Proxy-Info | 284 | Grouped |
Proxy-State | 33 | OctetString |
Redirect-Host | 292 | DiamURI |
Redirect-Host-Usage | 261 | Enumerated |
Redirect-Max-Cache-Time | 262 | Unsigned32 |
Result-Code | 268 | Unsigned32 |
Route-Record | 282 | DiamIdent |
Session-Id | 263 | UTF8String |
Session-Timeout | 27 | Unsigned32 |
Session-Binding | 270 | Unsigned32 |
Session-Server-Failover | 271 | Enumerated |
Supported-Vendor-Id | 265 | Unsigned32 |
Termination-Cause | 295 | Enumerated |
User-Name | 1 | UTF8String |
Vendor-Id | 266 | Unsigned32 |
Vendor-Specific-Application-Id | 260 | Grouped |
状态机
RFC3588定义维护对端之间的连接状态机和消息处理。这是基本协议功能的一部分,所有栈必须支持它,虚拟的连接相关的操作也一样。
参考网址:
http://en.wikipedia.org/wiki/File:RFC3588_peer_state_machine_1.png
http://en.wikipedia.org/wiki/File:RFC3588_peer_state_machine_2.png
此外,应用专用状态机也随后或更高虚拟层上引入。RFC 3588定义一个认证和审计状态机。
http://en.wikipedia.org/wiki/File:RFC3588_auth_state_machine_client.png
http://en.wikipedia.org/wiki/File:RFC3588_acct_state_machine_client.png
http://en.wikipedia.org/wiki/File:RFC3588_auth_state_machine_server.png
http://en.wikipedia.org/wiki/File:RFC3588_peer_state_machine_1.png
消息流
两个Diameter对之间的通信开始于传输连接的建立(TCP或SCTP)。然后发起者发送一个CER(能力交换请求)到对端,返回一个CEA的响应。对于RFC 3588服从对端TLS作为可选的协商。对于RFC 6733兼容的对端TLS协商在CER/CEA之前任意的出现。
然后连接准备交换应用消息。
如果一些时间之内没有消息交换,两端需要发送DWR(设备看门狗请求),并且另外一个对端必须响应DWA。
两端都可以发送DPR(断开对端请求)来终止通信,另外一端必须响应DPA。之后可以端口传输连接。
RFC参考
Diamter协议当前定义在下面的IETF中:
# | Title | Date published | Related article | Obsoleted by | Notes |
RFC 3588 |
|
| RFC 6733 | ||
RFC 3589 | Diameter Command Codes for Third Generation Partnership Project (3GPP) Release 5. | September 2003 | |||
RFC 4004 | Diameter Mobile IPv4 Application. | August 2005 | |||
RFC 4005 |
|
| RFC 7155 | ||
RFC 4006 | Diameter Credit-Control Application. | August 2005 | Diameter Credit-Control Application | ||
RFC 4072 | Diameter Extensible Authentication Protocol (EAP) Application. | August 2005 | |||
RFC 4740 | Diameter Session Initiation Protocol (SIP) Application. M. | November 2006 | |||
RFC 5224 | Diameter Policy Processing Application. | March 2008 | |||
RFC 5431 | Diameter ITU-T Rw Policy Enforcement Interface Application. | March 2009 | |||
RFC 5447 | Diameter Mobile IPv6: Support for Network Access Server to Diameter Server Interaction. | February 2009 | |||
RFC 5516 | Diameter Command Code Registration for the Third Generation Partnership Project (3GPP) Evolved Packet System (EPS). | April 2009 | - | ||
RFC 5624 | Quality of Service Parameters for Usage with Diameter. | August 2009 | |||
RFC 6733 | Diameter Base Protocol. | October 2012 | |||
RFC 6737 | The Diameter Capabilities Update Application. | October 2012 | |||
RFC 7155 | Diameter Network Access Server Application. | April 2014 |
Diameter协议