MeGaCo

Posted by Max on December 9, 2014

Historic RFC 3525

概述

H.248和MeGaCo是同一协议,是ITU与IETF共同努力的结果,ITU称之为H.248,IETF称之为MeGaCo, 是用于连接MGC(媒体网关控制器)与MG(媒体网关)的网关控制协议,在早期的MGCP协议基础上改进而成。

将网关分解成MG和MGC是研制大型电信级IP电话网关的需要。MGCP协议描述能力有欠缺,限制了其在大型网关的应用。 H.248协议是由MGC控制MG的协议,引入了conntext概念,增加了许多package的定义,从而将MGCP大大推进一步。 可以说H.248已取代MGCP,成为MGC与媒体网关MG之间的标准接口协议。 然而在固网中MGCP还是存在很大的应用,H248主要是应用于移动方面。

H.248协议底层传输机制采用UDP、TCP、SCTP(基于IP的信令传输),也可以基于ATM传输。 目前固网应用都是基于UDP的。协议消息编码可采用二进制或文本形式。

H.248/Megaco协议的连接模型主要描述媒体网关中的逻辑实体,这些逻辑实体由媒体网关控制器控制。 连接模型中包括关联和终端两个实体。一个关联中至少要包含一个终端,否则此关联将被删除; 同时一个终端在任一时刻也只能属于一个关联。

基本概念

媒体网关(Media Gateway)

媒体网关将一种类型网络的媒体转换成另一网络所要求的格式。例如,媒体网关可以交换电路网的承载信道(如PCM) 和分组网络的媒体流(如IP网络中的RTP媒体流);可以分别对音频、视频和数据进行处理,并且能够进行全双工的媒体转换; 也可以播放一些音频/视频信号,甚至具有提供媒体会议的能力。

媒体网关控制器(Media Gateway Controller)

负责对相关媒体网关内媒体信道连接控制的呼叫状态进行维护。

终端(Termination)

终端是位于媒体网关中的一个逻辑实体,可以发送/接收媒体和(或)控制流。 例如表示一个时隙(CIC电路)、一个IP端口(IP地址+端口号)、或一个ATM端口(VPI/VCI)。

终端通常可分为两类,一类是半永久终端,用来表示物理实体。 例如TDM信道,只要这个TDM信道在媒体网关中被配置,就一直存在,只有当配置信息被删除与之对应的终端才会消失。 另一类称为临时终端,代表临时性的信息流,例如RTP流,当需要时创建,使用完毕后就删除。 临时终端通过ADD命令创建,通过SUBTRACT命令清除。与此不同,当一个半永久终端被加入一个特定关联时,它是从NULL关联中获取,而当从特定关联中删除时,它又被返回到NULL关联。

终端特征通过属性来描述,这些属性被组合成描述符在命令中携带。终端被创建时,媒体网关会为其分配一个唯一标识。

关联(Context)

关联描述一个终端集之间的关联关系。当一个关联涉及多个终端时,关联将描述这些终端所组成的拓扑结构以及媒体混合交换的参数。 它可以通过Add 命令进行创建,通过Subtract 进行删除。一个关联中必须包含终端。

Context包含四个属性:

  • 关联标识码(ContextID)
  • 拓扑结构(Topology of who hears/sees whom)

    关联拓扑结构描述了从属一个关联的终端之间的媒体流。 与之相对,(收/发)终端的模式描述了位于媒体网关入/出口处的媒体流。

  • 优先级(Priority)

    关联用此优先级向MG提供恰当优先顺序的信息;MGC也会在合适的情景(如restart)用此优先级 独立的控制MG上的流量优先级,避免关联过多情况下的混杂。优先级最高为15,最低为0。

  • 紧急呼叫标识(An indicator for an emergency call)

    标识一个紧急呼叫,允许MG优先处理。

连接模式示例

MediaGatewayModule

协议消息编码

消息结构

MessageArchitecure

消息头中包含消息标识符(MID,Message Identifier)和版本字段。 MID用于标识消息的发送者,可以是域地址、域名或设备名,一般采用域名。 版本字段用于标识消息遵守的协议版本。版本字段有1位或2位数,目前版本为1。

消息内的事务是相互独立的,当多个被独立处理时,消息没有规定处理的先后次序。

事务(Transaction)

MGC和MG之间的一组命令构成事务,由TransactionID进行标识。事务包含一个或多个行为,一个行为由一系列局限于一个关联的命令组成。

一个事务从“事务头部”(TransHdr)开始。在TransHdr中包含TransactionID。TransactionID由事务的发送者指定,在发送者范围内是唯一的。 TransHdr后面是该事务的若干行为,这些行为必须顺序执行。若某行为中的一个命令执行失败,该事务中以后的命令将终止执行(Optional命令除外)。 事务包括请求和响应两种类型,而响应也有两种:TransactionReply和TransactionPending。

行为(Action)

行为是由一系列局限于一个关联的命令组成。 行为与关联(Context)密切相关,由ContextID进行标识。在一个行为内,命令需要顺序执行。

一个行为从关联头部(CtxHdr)开始,在CtxHdr包含ContextID,用于标识该行为对应的关联。ContextID由MG指定,在MG范围内是唯一的。 MGC必须在以后的与此关联相关的事务中使用ContextID。

在CtxHdr后面是若干命令,这些命令都与ContextID标识的关联相关。

命令和描述符

命令(Command)是H.248消息的主要内容,实现对关联和终端属性的控制,包括指定终端报告检测到的事件,通知终端使用什么信号和行为,以及指定关联的拓扑结构等。 命令由命令头部(CMDHdr)与命令参数构成,在H.248协议中,命令参数被组织成“描述符”(Descriptor)。

H.248协议定义了八个命令,其中“Notify”是由MG发给MGC,“ServiceChange”可由MG或MGC发送,其它命令都是由MGC发给MG。

命令 说明
ADD 增加一个Termination到一个Context中,当不指定ContextID时(或第一次增加一个Termination),将生成一个Context,然后加入Termination。
MODIFY 修改一个Termination的属性、事件和信号参数。如:修改终端的编码类型、通知终端检测摘机/挂机事件、修改终端的拓扑结构(双向/单向/隔离等)。
SUBSTRACT 从一个Context中删除一个Termination,同时返回Termination的统计状态。如果Context中再没有其它的Termination,将删除此Context。
MOVE 将一个Termination从一个Context转移到另一个Context中。
AUDITVALUE 返回Termination的当前的Properties、Events、Signals、Statistics。
AUDITCAPABILITIES 返回MG中Termination特性的能力集。
NOTIFY 允许MG将检测到的事件通知给MGC。 例如:MGW将检测到的摘机事件上报给MGC。
SERVICECHANGE 允许MG向MGC通知一个或者多个终端将要脱离或者加入业务,MG用ServiceChange来向MGC进行注册、重启通知。MGC可以使用ServieceChange对MG进行重启,或通知MG注销一个或一部分的Termination。

一个命令的参数被定义为描述符。Descriptor是由Name和item组成(item可以携带Value)。 一些命令可以共享一个或几个描述符。 Descriptor可以作为一个Command的输出返回值。在大多数情况下Descriptor作为返回值,只有Name没有其它item。

通常,文本格式的描述符的形式如下:

DescriptorName=<someID>{parm=value, parm=value, ...}

描述符参数可以分为完全指定、指定范围、不指定三类。完全指定的需要有一个独立而明确的值; 不指定的参数使用CHOOSE值,允许命令响应方选择其支持的任意值; 指定范围的参数需要命令响应方从命令发起方提供的列表中选择一个值,并返回给命令发起方。

描述符 说明 示例
Modem descriptor 调制解调器类型与参数(默认情况下,终端不含调制解调器)。类型包含V.18, V.22, V.22 bis,V.32, V.32 bis, V.34, V.90, V.91, Synchronous ISDN,支持扩展。  
Multiplex descriptor 关联媒体流类型和其持有者。类型包含H.221、H.223、H.226、V.76,允许扩展。持有者由TerminationIDs指代。 Mux = H.221{ MyT3/1/2, MyT3/2/13, MyT3/3/6, MyT3/21/22}
Media descriptor 指定针对所有媒体流的参数,由一个TerminationState descriptor、一个或多个Stream descriptors构成。  
TerminationState descriptor 包含服务状态、事件缓冲控制以及非媒体流指定的终端属性。  
Stream descriptor 指定一条双向媒体流的参数,由LocalControl descriptor、Local descriptor、Remote descriptor三部分构成。  
LocalControl descriptor 包含模式、预备组、预备值以及媒体流指定的终端属性。  
Local and Remote descriptors MGC使用近远端描述符向MG指定的媒体流和终端提供编解码资料。MG包含这两个描述符及其响应来表明本身所能提供的支持。  
Events descriptor 包含一个请求标识码和一个MG需要监听报告的事件列表。每个事件包含一个事件名,有时还有媒体流ID、活跃标记及其它可选参数。  
EventBuffer descriptor 包含一个MG需要监听的含参事件列表和一个缓冲区(当事件缓冲控制等于LockStep时)。  
Signals descriptor 是一个MG需要向终端提供的信号集合。  
Audit descriptor 指明将被审核的信息(可能的描述符集合)。  
ServiceChange descriptor 包含参数ServiceChangeMethod、ServiceChangeReason、ServiceChangeAddress、ServiceChangeDelay、ServiceChangeProfile、ServiceChangeVersion、ServiceChangeMGCId、TimeStamp、Extension。  
DigitMap descriptor DigitMap是MG用来监听和上报数字事件的a dialing plan resident,包含一个数字映射名称和指定的数字映射。  
Statistics descriptor 描述终端在一个Context中的状态和使用。  
Packages descriptor 只用于AuditValue命令, 返回终端实现的报文列表。  
ObservedEvents descriptor ObservedEvents用于Notify命令通知MGC哪些事件被检测到了;用于AuditValue命令返回事件缓冲中未被通知的事件。  
Topology descriptor 表明一个COntext中终端间的拓扑结构。  
Error Descriptor 包含一个IANA指定的错误码,有时附加文本说明。可能包含于响应和Notify请求中。 422 - Syntax Error

事务、行为和命令的关系

      +----------------------------------------------------------+
      | Transaction x                                            |
      |  +----------------------------------------------------+  |
      |  | Action 1                                           |  |
      |  | +---------+  +---------+  +---------+  +---------+ |  |
      |  | | Command |  | Command |  | Command |  | Command | |  |
      |  | |    1    |  |    2    |  |    3    |  |    4    | |  |
      |  | +---------+  +---------+  +---------+  +---------+ |  |
      |  +----------------------------------------------------+  |
      |                                                          |
      |  +----------------------------------------------------+  |
      |  | Action 2                                           |  |
      |  | +---------+                                        |  |
      |  | | Command |                                        |  |
      |  | |    1    |                                        |  |
      |  | +---------+                                        |  |
      |  +----------------------------------------------------+  |
      |                                                          |
      |  +----------------------------------------------------+  |
      |  | Action 3                                           |  |
      |  | +---------+  +---------+  +---------+              |  |
      |  | | Command |  | Command |  | Command |              |  |
      |  | |    1    |  |    2    |  |    3    |              |  |
      |  | +---------+  +---------+  +---------+              |  |
      |  +----------------------------------------------------+  |
      +----------------------------------------------------------+

信令流程

本节中, MG1的IP地址为124.124.124.222, MG2的为125.125.125.111,MGC的为123.123.123.4,三者的默认Megaco端口都是55555。

RAS

网关注册/注销流程

     MG1                        MGC
     |                           |
     |             SVC_CHG_REQ   |
     |-------------------------->|
     |                           |
     |  SVC_CHG_REPLY            |
     |<--------------------------|
     |                           |

MG1 to MGC:

MEGACO/1 [124.124.124.222] Transaction = 9998 {
  Context = - {  
    ServiceChange = ROOT {Services {
      Method=Restart,
      ServiceChangeAddress=55555, Profile=ResGW/1}
    }
    } }

MGC replys MG1:

MEGACO/1 [123.123.123.4]:55555 Reply = 9998 {
  Context = - {ServiceChange = ROOT {
    Services {ServiceChangeAddress=55555, Profile=ResGW/1} } } }

网关初始化流程

      MG1                        MGC
      |                           |
      |  MOD_REQ                  |
      |<--------------------------|
      |                           |
      |               MOD_REPLY   |
      |-------------------------->|
      |                           |

MGC to MG1:

MEGACO/1 [123.123.123.4]:55555 Transaction = 9999 {
  Context = - {
    Modify = A4444 {
      Media { Stream = 1 {
        LocalControl {
          Mode = SendReceive,
          tdmc/gain=2,  ; in dB,
          tdmc/ec=on
          },

        }
        },
        Events = 2222 {al/of(strict=state)}
      }
      } }

MG1 accepts the Modify with this reply:

MEGACO/1 [124.124.124.222]:55555 Reply = 9999 {
  Context = - {Modify = A4444} }

MG1注册成功后,MGC将对空关联中的MG1的所有半永久终端的属性进行修改,指示MG1检测用户的摘机事件。此时,此终端可以接收或者发起呼叫。

本例中,MG1注册得到一个空闲终端A4444(Termination1);MG2与MGC经过相同的交互后得到空闲终端A5555(Termination2)。

同一网关下终端之间的H.248呼叫流程

ConnectionModule

MG1检测到UserA摘机,通知MGC
MEGACO/1 [124.124.124.222]:55555 Transaction = 10000 {
  Context = - {
    Notify = A4444 {ObservedEvents =2222 {
      19990729T22000000:al/of(init=false)}}
      } }
MEGACO/1 [123.123.123.4]:55555 Reply = 10000 {
  Context = - {Notify = A4444} }
MGC修改MG1终端属性,使其播放拨号音,等待拨号并同时监听挂机事件
MEGACO/1 [123.123.123.4]:55555 Transaction = 10001 {
  Context = - {
    Modify = A4444 {
      Events = 2223 {
        al/on(strict=state), dd/ce {DigitMap=Dialplan0}
        },
        Signals {cg/dt},
        DigitMap= Dialplan0{ (0| 00|[1-
          7]xxx|8xxxxxxx|Fxxxxxxx|Exx|91xxxxxxxxxx|9011x.)}
        }
        } }
MEGACO/1 [124.124.124.222]:55555 Reply = 10001 {
  Context = - {Modify = A4444} }
MG1在收到第一个号码数字时停止拨号音,当收到的号码在拨号方案中有匹配时,通知MGC
MEGACO/1 [124.124.124.222]:55555 Transaction = 10002 {
  Context = - {
    Notify = A4444 {ObservedEvents =2223 {
      19990729T22010001:dd/ce{ds="916135551212",Meth=UM}}}
      } }
MEGACO/1 [123.123.123.4]:55555 Reply = 10002 {
  Context = - {Notify = A4444} }
MGC分析号码,决定建立一个从MG1到MG2的连接。新建Context,添加TDM终端A4444和RTP终端,默认模式为只接收模式,编码从MGC编码列表中顺序选出
MEGACO/1 [123.123.123.4]:55555 Transaction = 10003 {
  Context = $ {
    Add = A4444,
    Add = $ {
      Media {
        Stream = 1 {
          LocalControl {
            Mode = ReceiveOnly,

            nt/jit=40 ; in ms
            },
            Local { v=0 c=IN IP4 $ m=audio $ RTP/AVP 4
              a=ptime:30 v=0 c=IN IP4 $ m=audio $ RTP/AVP 0
            }
          }
        }
      }
      } }
MG1确认新终端,并填写本地描述符(IP地址和UDP端口号),从MGC提供的编码列表中作出选择,将RTP端口设置为2222
MEGACO/1 [124.124.124.222]:55555 Reply = 10003 {
  Context = 2000 {
    Add = A4444,
    Add=A4445{
      Media {
        Stream = 1 {
          Local { v=0 o=- 2890844526 2890842807 IN IP4
            124.124.124.222 s=- t= 0 0 c=IN IP4 124.124.124.222 m=audio 2222
            RTP/AVP 4 a=ptime:30 a=recvonly
            } ; RTP profile for G.723.1 is 4
          }
        }
      }
      } }
MGC联系MG2,将A5555终端和一个RTP终端加入Context,建立RTP连接,并使A5555振铃
MEGACO/1 [123.123.123.4]:55555 Transaction = 50003 {
  Context = $ {
    Add = A5555  { Media {
      Stream = 1 {
        LocalControl {Mode = SendReceive} }},
        Events=1234{al/of(strict=state)},
        Signals {al/ri}

        },
        Add  = $ {Media {
          Stream = 1 {
            LocalControl {
              Mode = SendReceive,
              nt/jit=40 ; in ms
              },
              Local { v=0 c=IN IP4 $ m=audio $ RTP/AVP 4
                a=ptime:30
                },
                Remote { v=0 c=IN IP4 124.124.124.222 m=audio 2222
                  RTP/AVP 4 a=ptime:30
                  } ; RTP profile for G.723.1 is 4
                }
              }
            }
            } }
MG2确认添加终端,并指定连接端口号,本例指定1111
MEGACO/1 [125.125.125.111]:55555 Reply = 50003 {
  Context = 5000 {
    Add = A5555,
    Add = A5556{
      Media {
        Stream = 1 {
          Local { v=0 o=- 7736844526 7736842807 IN IP4
            125.125.125.111 s=- t= 0 0 c=IN IP4 125.125.125.111 m=audio 1111
            RTP/AVP 4 }
            } ; RTP profile for G723.1 is 4
          }
        }

        } }
MGC将MG2指定的RTP终端IP地址和UDP端口号告知MG1
MEGACO/1 [123.123.123.4]:55555 Transaction = 10005 {
  Context = 2000 {
    Modify = A4444 {
      Signals {cg/rt}
      },
      Modify = A4445 {
        Media {
          Stream = 1 {
            Remote { v=0 o=- 7736844526 7736842807 IN IP4
              125.125.125.111 s=- t= 0 0 c=IN IP4 125.125.125.111 m=audio 1111
              RTP/AVP 4
            }
            } ; RTP profile for G723.1 is 4
          }
        }
        } }
MEGACO/1 [124.124.124.222]:55555 Reply = 10005 {
  Context = 2000 {Modify = A4444, Modify = A4445} }
现在,两个网关已经建立连接,UserA听到回铃音;等到UserB摘机,则通话连接建立

From MG2 to MGC:

MEGACO/1 [125.125.125.111]:55555 Transaction = 50005 {
  Context = 5000 {

    Notify = A5555 {ObservedEvents =1234 {
      19990729T22020002:al/of(init=false)}}
      } }

From MGC to MG2:

MEGACO/1 [123.123.123.4]:55555 Reply = 50005 {
  Context = - {Notify = A5555} }

From MGC to MG2:

  MEGACO/1 [123.123.123.4]:55555 Transaction = 50006 {
    Context = 5000 {
      Modify = A5555 {
        Events = 1235 {al/on(strict=state)},
        Signals { } ; to turn off ringing
      }
      } }

From MG2 to MGC:

  MEGACO/1 [125.125.125.111]:55555 Reply = 50006 {
    Context = 5000 {Modify = A4445} }
将MG1修改为收发模式,停止回铃音

MGC to MG1:

MEGACO/1 [123.123.123.4]:55555 Transaction = 10006 {
  Context = 2000 {
    Modify = A4445 {
      Media {
        Stream = 1 {
          LocalControl {
            Mode=SendReceive

          }
        }
      }
      },
      Modify = A4444 {
        Signals { }
      }
      } }

From MG1 to MGC:

MEGACO/1 [124.124.124.222]:55555 Reply = 10006 {
  Context = 2000 {Modify = A4445, Modify = A4444}}
MGC有权检查MG2的RTP终端
MEGACO/1 [123.123.123.4]:55555 Transaction = 50007 {
  Context = - {AuditValue = A5556{
    Audit{Media, DigitMap, Events, Signals, Packages, Statistics }}
    } }
MEGACO/1 [125.125.125.111]:55555 Reply = 50007 {
  Context = - { AuditValue = A5556 {
    Media {
      TerminationState { ServiceStates = InService, Buffer = OFF },
      Stream = 1 {
          LocalControl { Mode = SendReceive, nt/jit=40 },
          Local { v=0 o=- 7736844526 7736842807 IN IP4 125.125.125.111 s=- t= 0 0 c=IN IP4 125.125.125.111 m=audio 1111 RTP/AVP  4 a=ptime:30 },
          Remote { v=0 o=- 2890844526 2890842807 IN IP4 124.124.124.222 s=- t= 0 0 c=IN IP4 124.124.124.222 m=audio 2222
RTP/AVP  4 a=ptime:30 }
                 } },
    Events,
    Signals,
    DigitMap,
    Packages {nt-1, rtp-1},
    Statistics { rtp/ps=1200,  ; packets sent
                 nt/os=62300, ; octets sent
                 rtp/pr=700, ; packets received
                 nt/or=45100, ; octets received
                 rtp/pl=0.2,  ; % packet loss
                 rtp/jit=20,
                 rtp/delay=40 } ; avg latency
                }
    } }
当MGC收到任何一方MG的挂机的信号时,关闭连接。本例中MG1先行挂机,通知MGC
MEGACO/1 [124.124.124.222]:55555 Transaction = 50008 {
  Context = 5000 {
    Notify = A4444 {ObservedEvents =1235 {
      19990729T24020002:al/on(init=false)}
    }
    } }
MEGACO/1 [123.123.123.4]:55555 Reply = 50008 {
  Context = - {Notify = A4444} }
此后MGC向两个MG发送Subtract命令来关闭连接。此处示例关闭MG2的报文(MGC可以不需要得到两个MG的回应)
MEGACO/1 [123.123.123.4]:55555 Transaction = 50009 {
  Context = 5000 {
    Subtract = A5555 {Audit{Statistics}},
    Subtract = A5556 {Audit{Statistics}}
    } }
MEGACO/1 [125.125.125.111]:55555 Reply = 50009 {
  Context = 5000 {
    Subtract = A5555 {
      Statistics {
        nt/os=45123, ; Octets Sent
        nt/dur=40 ; in seconds
      }
    },
    Subtract = A5556 {
      Statistics {
        rtp/ps=1245, ; packets sent
        nt/os=62345, ; octets sent
        rtp/pr=780, ; packets received
        nt/or=45123, ; octets received
        rtp/pl=10, ;  % packets lost
        rtp/jit=27,
        rtp/delay=48 ; average latency
      }
    }
    } }
最后MGC设置两个MG,为下一次摘机做好准备