Megaco/H.248是在MGCP的基础上发展起来的,比MGCP具有更强大的可扩展能力,可应用于大型网关;Megaco和H.248是一个协议,只不过是由两个组织同时制定的,IETF称其为Megaco,ITU-T称其为H.248,后来就合二为一了。IETF制定Megaco的时候用的是文本编码方式,ITU-T制定H.248的时候用的是ASN.1的BER编码方式。所以我们可以说Megaco/H.248支持两种编码方式。在Wireshark的解包过程中,如果发现是文本编码格式就显示为Megaco协议,如果发现是二进制编码格式就显示为H.248协议。Megaco/H.248可承载于UDP/TCP/SCTP等协议之上,文本编码格式的默认端口是2944,二进制编码格式的默认端口是2945。协议规范可参考RFC 3525。
1. 基本概念:
· Termination:类似MGCP中的Endpoint概念,不过两者的标识符不同,Endpoint使用类似电子邮件的格式来标识,而Termination使用Termination ID来表示,Termination ID用一个十六进制字串来表示,也可以使用通配符表示。
· Context: 一个Context就是一些Termination间的联系。 它描述了Termination之间的拓扑关系以及媒体混合/交换的参数。Context由一组Termination组成。一个Context可以包含多个Termination,一个Termination在同一时刻只能属于一天Context,一个Context中至少要包含一个Termination。Context用一个Context ID来标识,在MG范围内唯一。下图是一个典型的双方通话时的Context和Termination之间的关系。
+------------------------------------------------------+
|Media Gateway |
| |
| +-------------------------------------------------+ |
| |Context | |
| | +-------------+ +-------------+ | |
| | | Termination | +-----+ | Termination | | |
| | |-------------| | | |-------------| | |
<-+--->| SCN Bearer |---| * |------| SCN Bearer |<---+->
| | | Channel | | | | Channel | | |
| | +-------------+ +-----+ +-------------+ | |
| +-------------------------------------------------+ |
| |
+------------------------------------------------------+
· Transaction:是指MGC和MG之间的一次消息交互,用Transaction ID表示,该值由消息的发起方分配。Transaction的第一消息为TransactionRequest消息,对方可以回复TransactionReply消息来结束这个Transaction也可以回复TransactionPending消息告诉发起者TransactionRequest消息已经收到,正在处理,无须重发。
· Action:有Context属性和一组Commands组成;一个消息中可以有多个Actions,每一个Action中通常包含一个Context ID;
· Package:和MGCP中的Package概念类似,是为了对H.248进行扩展,RFC3525的附录E中定义了一些基本的Package,其它扩展Package在另外相关的文档中定义,每一个Package有一个字符串作为名字标识,由IANA进行统一管理。Pakcage就像一个名字空间,把一些不同的属性分隔开来;Package中可以包含Property,Signal,Event,Statistics等,它们也有相应的Id来标识自己。
2. 消息格式:
下面第一个图展示了H.248的消息结构图,从途中可以看出,消息是按层次组织的,如果使用的是ASN.1的编码方式,那么就是一些了嵌套的TLV格式,如果是用文本编码的话,就是用大括号来进行层次组织的。第二个图是一个消息的实例。
3. H.248命令:
H.248一共有八个命令如下:
类别 |
命令 |
描述 |
Termination管理 |
ServiceChange |
双向命令,代表一个/一组Termination 加入/退出服务 MGC->MG: 指定网关或一组Termination加入或退出服务 指示网关的切换(handoff) MG->MGC: 网关注册/倒换(failover) 指示终结点能力改变 |
AuditValue |
MGC->MG,获取网关(RootTermination)/ Termination当前设置的特性、事件、信号、统计信息 |
|
AuditCapabilities |
MGC->MG,获取网关(RootTermination)/ Termination可能的特性、事件、信号、统计信息 |
|
Termination操作 |
Add |
MGC->MG:向一个Context添加一个Termination |
Modify |
MGC->MG:修改一个Termination的特性、事件和信号 |
|
Subtract |
MGC->MG:解除一个Termination与Context之间的联系 |
|
Move |
MGC->MG:Termination在Context之间的移动 |
|
事件通知 |
Notify |
MG->MGC:上报MG中发生的事件 |
4. 呼叫流程:
上图画出了两个媒体网关MG1呼叫MG2 时,MGC和发起呼叫的MG1以及被叫MG2之间的媒体流的流程;其中(3)(4)(5)(6)(7)(8)是呼叫的建立过程,(9)(10)是呼叫的连接过程,(11)(12)(13)(14)是被叫挂机后的删除连接过程。
整个媒体流的流程如下:
(1)主叫摘机,MG检测到后通过Notify命令将事件(Off-Hook)报告给MGC;
(2)用户拨号,MG将收到的号码通过Notify命令报告给MGC;
(3) MGC分析收到数据决定建立MG1到MG2的一个Context,并通过Add命令让MG1将主叫端口加入一个Context,向主叫送拨号音。因为MGC还未获得包含特定媒体流接收方的属性,所以媒体流的Mode是ReceiveOnly,并且在命令中,未知的参数用参数通配符“$”表明,意思为“选择”,具体的参数值将由MG1在下一条Reply中填入具体的值。
(4) MG1接受新的终端(Termination),并把自己的IP和UDP端口填入。
(5) MGC分析被叫号码,找出被叫端口,决定建立MGC到MG2的一个新的Context,并通过Add命令让MG2将主叫端口加入一个Context。
(6) MG2把自己的IP和UDP端口填入。
(7) MGC命令MG1将被叫端口加入前面所说的那个Context 。MGC命令MG1向主叫送回铃音,向被叫送振铃音;
(8) MG1再向MGC发送回应消息。
(9)被叫摘机,MGC命令MG1连接主被叫,把媒体流的Mode从ReceiveOnly修改为SendReceive,并停止回铃。
(10) MG再向MGC发一个Reply。
此后,双方进入通话。
(11)(12)(13)(14)主/被叫挂机(由于主叫挂机和被叫挂机返回的命令是一样的,下面只列出被叫挂机的情况),MGC命令MG1和MG2释放主被叫连接,将主/被叫端口放空Context,此处只列出MGC对MG1的媒体流。至此,MG1与MGC的连接释放,媒体流终止。