Diameter基础协议摘要

Diameter是新一代AAA协议,可以承载与TCP或者SCTP协议之上,被广泛应用于IMSLTE网络中。RFC3588定义了Diameter的基础协议,各种应用可以在此基础上对其进行扩展(主要是定义新的Application IDCommandAVP);基础协议中包括一个基本的Accounting功能,如果需要Authentication或者Authorization通常需要进行对基础协议扩展。

1.      基本概念:

·         Connection: 是传输层的概念,负责在两端直接传输Diameter消息;

·         Session: 是应用层的概念,可以用Session-id AVP来标识;下图展示了ConnectionSession的区别;

+--------+            +-------+            +--------+
| 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 IDRelay Application Identifier ;使用Relay Agents的好处是简化网络的复杂性,不需要对所有Diameter节点都进行复杂的配置,比如只需配置节点让Diameter消息转发到Relay Agents,然后在Relay Agents上进行比较全面的路由配置即可。

·         Proxy AgentsProxy Agents也负责转发消息,与Relay Agent不同的是,它需要理解应用层的信息,进而维护Transaction的状态;在CER/CEA进行能力交互时,需要返回自己支持的所有Application ID

·         Redirect Agents收到Diameter消息后不进行转发,而是回复一个应答消息给发送者,应答消息中包含一个或者多个地址,告诉发送者应该将消息发往这些地址;

·         Translation Agents完成RadiusDiameter协议之间的转换;

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用来匹配RequestAnswer消息,在一个指定的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 lengthAVP长度;

·         Vendor ID可选的,如果AVP flags中的V被置位,说明该域存在;该值也是由IANA分配的;

4.      Diameter和连接相关的三对基本消息:

Diamete通过传输层TCP/SCTP建立连接后,传输的第一个消息就是CER/CEA,通过该消息的交互了解对端都支持哪些应用,看是否有共同的应用;如果对端是Relay Agent,则认为肯定存在共同应用;获知对方支持你哪些应用后,发送消息的时候就不会发送对方不认识的消息,对方对收到的不认识的消息也不会处理。此外双方的IP地址也会在CER/CEA消息中交换。CER/CEA是不能被ProxyRelay或者是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, PXY123456 >
<Session-Id>               //
AVP必须存在一个,且位置固定

{ User-Name }            //
AVP必须存在一个
 [ Destination-Host ]  //
AVP可存在一个或者不存在
1*{ Origin-Host }        //
AVP可存在一个或者多个
*[ AVP ]                       //
AVP可存在零个或者多个

 

你可能感兴趣的:(session,header,application,Authentication,authorization,translation)