MGCP用于MGC和MG之间的通信,MGC通过MGCP协议对MG上的资源进行分配管理。MGCP协议定义在RFC 3435中,采用文本编码方式,承载于UDP之上。
1. 通信模型:
下图是一个简单的网络拓扑图,从中可以看到MGCP所处位置(图中的Call Agent也就是MGC,端口是RFC 3435中给出的默认值):
2. 基本概念:
· Endpoint:是MG中的概念,可以是虚拟的端口也可以是实际的硬件,比如一个中继,一条走模拟信号的电话线等;Endpoint采用类似电子邮件的格式来表示,例如local-endpoint-name@domain-name,@之前的部分是在MG中的唯一标识,@后面的部分是MG的域名;
· Connection:每一个参与呼叫的Endpoint都会有一个Connection, 一个Call中可以有多个Connection,下图是一个典型的例子,一个Call中有两个Endpoint(EP1和EP2),两个Connection(C1和C2):
+---+ +---+
(channel1) ===|EP1|--(C1)--... ...(C2)--|EP2|===(channel2)
+---+ +---+
Connection在创建的时候由它所归属的MG分配一个十六进制字串来标识,比如,在MDCX命令中会带有一个名字为ConnectionIdentifier(I)的参数,说明要修改的是哪个Connection;
· Call:也就是一次呼叫,Call Agent会分配一个十六进制字串来表示一个唯一的Call。命令中会用参数Callid(C)来传输;
· Digit Maps:收号方案,Call Agent需要向MG请求用户所拨打的号码,如果MG每收到号码中的一位数字就上报一次的话,效率会比较低下,最好是等号码收齐之后一次性传递给Call Agent,可是MG怎么知道何时收到的才是用户拨打的完整号码呢?这就是Digit Maps的作用,Call Agent下发一套收号方案给MG,MG根据这套规则判断合适为收号完毕。比如下面是一个Digit Maps的例子:
(0T|00T|[1-7]xxx|8xxxxxxx|#xxxxxxx|*xx|91xxxxxxxxxx|9011x.T),当MG收到了91两位数字后,根据收号方案得知后面还有10位需要等待,等再收到10位数字后就一次性上报给Call Agent;
· Package:MGCP是一个可扩展的协议,RFC 3435中只是描述了基本协议,如果需要对协议继续扩展就需要定义一些Package(有点Diameter扩展需要定义新的AVP的意思);所有的Package都有一个名字来标识,这个名字是有IANA来统一管理的;Package中可以包含一些Events,Actions,Signals等,Package就像一个名字空间一样,把一些属性限制在特定的Package中表示特定的含义;RFC 3660中定义了Basic MGCP Packages;
· Signal and Event:Event,比如摘机、挂机、拍叉或拨号号码等;Signal,比如拨号音、回铃音、忙音等。
3. MGCP消息格式:
MGCP消息分为Command和Response,两者是对应的,一个Command和一个Response消息构成一个Transaction用Transaction ID来唯一标识;两种消息都是有一个头部加上可选的SDP构成;Command消息的头部格式如下:
CommandName TransactionID Endpoint Version
Parameter name: value
...
Response消息头部如下:
ResponseCode TransactionID ResponseString
Parameter name: value
...
下面分别是一个Command消息和一个Response消息的实例:
这是一个RQNT命令,里面呆了两个参数,没有SDP信息:
RQNT 67184230 aaln/[email protected] MGCP 1.0
X: 13 2F3005001FF
R: L/hu(N),L/hf(N)
这是一个Response消息,里面带有一个参数和SDP信息:
200 67671888 OK
I: 7d80
v=0
o= -1212967687 121 2983687 IN IP4 198.138.79.52
s=-
c=IN IP4 198.138.79.52
t=0 0
m=au dio 61288 RTP/AV P 0
b=AS:80
a=mptime:20
a=rtpmap:0 PCMU/8 000/1
4. MGCP命令:
MGCP共有如下九条命令:
|
命令名称 |
代码 |
描述 |
1 |
EndpointConfiguration |
EPCF |
MGC→MG,指示网关某端点电路侧的编码特性 |
2 |
CreateConnection |
CRCX |
MGC→MG,呼叫代理用此命令将某端点和指定的IP地址和UDP端口关联。另外还需要向远端端点发送一个创建连接命令,这样才能建立两个端点间的连接 |
3 |
ModifyConnection |
MDCX |
MGC→MG,修改先前建立连接的参数,呼叫代理用该命令将第二个端点的“会话描述”(IP地址、UDP端口和打包参数等信息)提供给第一个端点。一旦该过程完成,双方可以进行双向通讯 |
4 |
DeleteConnection |
DLCX |
MGC→MG,删除先前建立的连接 |
5 |
NotificationRequest |
RQNT |
MGC→MG请求网关监视某端点发生的某些事件,如发生则通知呼叫代理 |
6 |
Notify |
NTFY |
MG→MGC,网关用此命令通知呼叫代理请求监视的某些事件已发生 |
7 |
AuditEndpoints |
AUEP |
MGC→MG,呼叫代理用此命令获得某端点或一组端点的详细信息 |
8 |
AuditConnection |
AUCX |
MGC→MG,呼叫代理用此命令获得某端点上某连接的详细信息 |
9 |
AuditConnection |
RSIP |
MG→MGC,网关用此命令告知某端点退出服务或投入服务 |
由MG或MGC终端发起的删除连接命令或者重启进程命令中,必须包含Reason Code,用来表明删除连接或者重启的原因,下表是对一些Reason Code的描述:
Cuase Code |
原因描述 |
000 |
表示端点状态正常(该原因码只用来响应审计请求) |
900 |
表示端点功能失常 |
901 |
端点退出业务 |
902 |
表示低层连接失败 |
Response消息中带有Response Code,其含义如下:
· 100-199:表示临时应答
· 200和299之间的值表示成功完成
· 400-499:表明命令执行时遇到一个临时性的错误
· 500-599:表明命令执行时遇到一个永久性的错误
此外,MGCP命令都是用一些缩写来表示的,从消息中可以看出,参数以及Package和Package中的一些属性也都是用几个字母表示,这些参数或者属性的详细含义可以参考RFC 3435中的Section 3, Section 6以及RFC 3660。
5. 呼叫流程:
下面通过一个简单的呼叫来展示MGCP在整个呼叫过程中的消息流:
1) 主叫摘机,MG1向MGC发NTFY命令,报告主叫摘机事件;
2) MGC回响应;
3) MGC向MG1发RQNT命令,命令MG1为用户送拨号音,要求检测用户拨号等动作;
4) MG1回响应,同时向主叫用户送拨号音;
5) 主叫用户拨号码,MG1向MGC发NTFY命令,将收集到的号码告诉MGC;
6) MGC回响应;
7) MGC向MG1发RQNT命令,命令MG1监视主叫用户的挂机事件(如果主叫用户在拨号过程中中途挂机,则停止下面的操作);
8) MG1回响应;
9) MGC向MG1发CRCX命令,命令MG1按要求创建连接;
10) MG1回响应MGC并带有SDP信息;
11) MGC向MG2发CRCX命令,命令MG2按要求创建连接,命令中带有MGC1送上来的SDP信息;
12) MG2回响应MGC并带有SDP信息;
13) MGC向MG1发MDCX命令,命令根据要求改变连接,命令中带有MG2送上来的SDP信息;
14) MG1回响应;
15) MGC向MG1发RQNT命令,命令MG1送回铃音;
16) MG1回响应,同时MG1向主叫用户送回铃音;
17) MGC向MG2发RQNT命令,命令MG2报告被叫用户的摘机事件和提供振铃音;
18) MG2回响应,同时MG2向被叫用户送振铃音;
19) 被叫用户摘机,MG2向MGC发NTFY命令,报告被叫摘机事件;
20) MGC回响应;
21) MGC 向MG2发RQNT命令,命令MG2监视并报告被叫用户的挂机事件;
22) MG2回响应;
23) MGC向MG1发RQNT命令,命令MG1监视并报告主叫用户的挂机事件;
24) MG1回响应;
25) MGC向MG1发MDCX命令,命令MG1根据要求将连接改为全双工模式;
26) MG1回响应,同时MG1建立全双工模式的连接,至此呼叫连接建立,开始进入通话阶段;假设被叫用户挂机,MG2
27) MGC发NTFY命令,报告被叫挂机事件;
28) MGC回响应;
29) MGC向MG2发DLCX命令,命令MG2删除连接,向被叫送忙音;
30) MG2回响应,并向被叫送忙音;
31) MGC向MG1发DLCX命令,命令MG1删除连接,并向主叫送忙音;
32) MG1回响应,同时向主叫送忙音,至此呼叫释放。