Diameter是新一代AAA协议,可以承载与TCP或者SCTP协议之上,被广泛应用于IMS,LTE网络中。RFC3588定义了Diameter的基础协议,各种应用可以在此基础上对其进行扩展(主要是定义新的Application ID,Command和AVP);基础协议中包括一个基本的Accounting功能,如果需要Authentication或者Authorization通常需要进行对基础协议扩展。
1. 基本概念:
· Connection: 是传输层的概念,负责在两端直接传输Diameter消息;
· Session: 是应用层的概念,可以用Session-id 这AVP来标识;下图展示了Connection与Session的区别;
+--------+ +-------+ +--------+
| Client | | Relay | | Server |
+--------+ +-------+ +--------+
<----------> <---------->
peer connection A peer connection B
<---------------------------------------------------->
User session x
· Destination Host:用于标识一台运行Diameter应用的主机,命名方式类似DNS格式,但并不是域名,只是一个标识符而已,一台运行Diameter应用的主机可以支持一个或者多个Diameter应用;
· Destination Realm:用于标识一组运行Diameter应用的主机,可以将多台Host划归为一个Realm中;
· Peer Table:用于消息路由的数据配置, Peer table中的主机都是能和本地主机之间通信的(也就是说中间无需经过消息转发),格式如下表:
Host identity |
StatusT |
Static or Dynamic |
Expiration time |
abc.example.com |
R-Open |
statically |
0 |
xyz.example.net |
R-Open |
dynamically |
10 |
· Realm-Based Routing Table : 用于消息路由的数据配置,格式如下表:
Realm Name |
Application Identifier |
Local Action |
Server Identifier |
Static or Dynamic |
Expiration time |
example |
16777250 |
RELAY |
abc.example.com |
statically |
0 |
example |
16777272 |
RELAY |
xyz.example.net |
dynamically |
10 |
2. Diameter Agents:
· Relay Agents:对消息进行转发,只增加或者删除路由信息,而不会修改任何应用层信息;在CER/CEA进行能力交互时,需要返回自己支持的Application ID为Relay Application Identifier ;使用Relay Agents的好处是简化网络的复杂性,不需要对所有Diameter节点都进行复杂的配置,比如只需配置节点让Diameter消息转发到Relay Agents,然后在Relay Agents上进行比较全面的路由配置即可。
· Proxy Agents:Proxy Agents也负责转发消息,与Relay Agent不同的是,它需要理解应用层的信息,进而维护Transaction的状态;在CER/CEA进行能力交互时,需要返回自己支持的所有Application ID;
· Redirect Agents:收到Diameter消息后不进行转发,而是回复一个应答消息给发送者,应答消息中包含一个或者多个地址,告诉发送者应该将消息发往这些地址;
· Translation Agents:完成Radius和Diameter协议之间的转换;
3. 消息格式:
MAC header |
IP header |
SCTP | TCP header |
Diameter header |
Data ::: |
1) Diameter header:
00 |
01 |
02 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
Version |
Message length |
||||||||||||||||||||||||||||||
Flags |
Code |
||||||||||||||||||||||||||||||
R |
P |
E |
T |
r |
r |
r |
r |
||||||||||||||||||||||||
Application ID |
|||||||||||||||||||||||||||||||
Hop by Hop ID |
|||||||||||||||||||||||||||||||
End to End ID |
|||||||||||||||||||||||||||||||
AVP[] ::: |
· Version: Diameter的版本号,目前为1;
· Message length:包含头部在内的消息长度,也就是头部+所有AVP的长度之和;
· Flags:
R(equest):如果 置位表示这是一个Request消息;
P(roxiable):如果被置位说明该消息可以被转发,否则必须本地处理;
E(rror):如果置位,说明产生了一个协议错误,只能出现在Answer消息中;
T:如果被置位,说明该消息有可能是一个被重传的消息;
r:保留位;
· Code:消息命令码,用来标识各种Diameter消息,由IANA负责统一分配;
· Application ID:用来表示不同的Diameter应用,由IANA负责统一分配;
· Hop by Hop ID:用来匹配Request和Answer消息,在一个指定的Connection上的任何时间都必须是唯一的;该值在Diameter消息转发时会被Agent修改;
· End to End ID:用来识别重复消息;该值在本地的一段时间内必须是唯一的,传输过程中一直保持不变;目标主机会根据该值和Original-Host AVP来判读是否是重复消息;
2) AVP header:
00 |
01 |
02 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
AVP code |
|||||||||||||||||||||||||||||||
AVP flags |
AVP length |
||||||||||||||||||||||||||||||
V |
M |
P |
r |
r |
r |
r |
r |
||||||||||||||||||||||||
Vendor ID (Optional) |
|||||||||||||||||||||||||||||||
Data ::: |
· AVP code:用来标识一个AVP,由IANA来统一分配;
· AVP flags:
V, Vendor specific: 如果置位说明 Vendor ID 存在;
M, Mandatory:如果置位说明该AVP是必须的;
P:如果置位说明需要保证该AVP端到端的安全性;
r:reserved
· AVP length:AVP长度;
· Vendor ID:可选的,如果AVP flags中的V被置位,说明该域存在;该值也是由IANA分配的;
4. Diameter和连接相关的三对基本消息:
Diamete通过传输层TCP/SCTP建立连接后,传输的第一个消息就是CER/CEA,通过该消息的交互了解对端都支持哪些应用,看是否有共同的应用;如果对端是Relay Agent,则认为肯定存在共同应用;获知对方支持你哪些应用后,发送消息的时候就不会发送对方不认识的消息,对方对收到的不认识的消息也不会处理。此外双方的IP地址也会在CER/CEA消息中交换。CER/CEA是不能被Proxy,Relay或者是Redirection的,所以说CER/CEA只能是直连节点之间的交换,如果节点A经过Relay Agent发送消息到节点B,那么需要建立两个连接,进行两次CER/CEA的交互。当需要断开连接时,主动方需要发起DPR消息给对端指示断开传输层连接。在连接期间,双方需要互发DWR/DWA (Watching Dog) 消息,用来检测对方是否处于Active状态.
5. 如何看规范中的Diameter命令的ABNF 定义:
具体参见协议的3.2,这里用一个例子大概总结一下:
Example-Request ::= < "Diameter-Header: 9999999, REQ, PXY,123456 >
<Session-Id> //该AVP必须存在一个,且位置固定
{ User-Name } //该AVP必须存在一个
[ Destination-Host ] //该AVP可存在一个或者不存在
1*{ Origin-Host } //该AVP可存在一个或者多个
*[ AVP ] //该AVP可存在零个或者多个