目录
(一)、综述
1.H.323协议简介
2.OPENH323协议栈总体框架
3、OPENH323协议栈主要类之间的关系图
(二)、重要协议过程和体系结构分析
1、RAS
2、H.245控制信令
3、H.225呼叫信令
4、Q.931
5、控制协议的实现:
6、编解码器H323Codec
7、逻辑信道:
(三)、运行期分析
1、侦听
2、发现网守并向网守注册:
3、呼叫:
4、逻辑信道的打开及实时数据传输:
5、挂断:
(一)、综述
1.H.323协议简介
H.323是国际电信联盟电信标准部(ITU-T)制定的标准,用于在网间网协议(IP)网络包括英特网上传输音频、视频和数据。如果能够与H.323兼容,供应商的产品和应用系统就可以相互通信和互操作。H.323标准描述了呼叫信令和控制、多媒体传输和控制。点对点带宽控制以及多点会议等业务。H系列标准还定义了综合业务数字网的(IS-DN)H.320和简单老师电话业务(POTS)传输机制的H.324。
H.323标准有下列组建和协议组成:
H.323系统要素包括:终端、网关、网守和多点控制单元(MCU)等。
2.OPENH323协议栈总体框架
OpenH323协议栈的源码是用C++来完成的,适用于Windows平台和Unix平台,该协议栈描述的是H323 Version2.0。OpenH323协议栈的结构非常庞大,包括了实现H323协议的方方面面(当然,目前协议栈的功能还不是很完整)。然而,主要的是H323Endpoint,H323Listener,H323Transport,H323Connection,H245Negotiator,H323Channel, H323Capability和H323Codec。这几个类。而在这几个类中,最为重要的是H323Endpoint和H323Connection类。前者是所有基于OpenH323协议栈的基础。
应用程序一般要创建一个H323Endpoint类的派生类的实例。这是因为通过H323Endpoint类可以直接或间接的对整个OpenH323协议栈的各种主要的类进行调用和处理—H323Endpoint类封装了相当多的方法。当响应用程序实现H323Endpoint的派生类时,通常会定义一些在H323协议栈中没有定义的属性和方法,这些属性和方法用于设定终端的一些初始化的或者基本的属性。比如振铃时播放的音乐文件的名称,缺省的呼叫设置,终端的能力集等。
而在H323Endpoint类中,通常都会创建一个或多个H323Listener类的派生类的实例,每一个实例对应一个后台处理线程(一般普通终端有两个线程,一个用于处理可靠连接TCP,还有一个线程用于处理不可靠连接UDP,普通终端的UDP线程可以在设置网守时才建立,也可以在启动时建立)。当检测到一个新的呼入时,就会创建一个H323Transport类的的实例,负责传输信息。具体过程如下(以公关网守直接选路为例):
在一个应用程序(终端)完成启动过程后,在后台会运行一个处理TCP的侦听线程。然后,如果有一个呼如的话,首先,TCP侦听线程会收到一个连接请求,并建立一个新的TCP传输,用于传输H.225呼叫信令消息。成功建立传输后,该终端会接收到H.225的setup消息。然后,该终端先返回一个H.225的call Proceeding的消息,再通过UDP传输发送ARQ给网守,网守返回ACF给UDP线程后,TCP线程先后发送H.225的Alerting和Connect消息给主叫终端。这里所提到的UDP线程既是H323TransportUDP类的实例。而TCP线程则是H323TransportTCP类的实例。这两个类都派生于H323TransportIP类,而H323TransportIP则派生于H323Transport。
呼叫信息都定义在用于处理两个终端直接的连接的H323Connection类中,H323Eendpoint类的实例则负责记录所有这些活动的连接。终端实例会为每一个呼叫建立不同的连接,连接建立后,就开始新的信令协商(Neggotiation)过程。
对于H323Connection 类,一般要创建一个H323Endpoint类的派生类的实例,使用户根据实际的需要来重载其中的很多虚函数。例如,在收到Alerting消息时,可以播放音乐。通过派生和重载H323Connection类,应用程序可以获得更大的自由度。
H.245的主要协议过程例如主从确定、能力交换、逻辑通道信令等都是在H245Negotiator类的派生类中定义的。
在H245协商的过程中,主叫终端和被叫终端都会创建逻辑信道。H323Channel的派生类负责处理与此相关的过程。H245的控制信道是在H.225的呼叫信令过程的后期建立的。在建立了H245控制信道后,应用程序会先启动该控制信道,然后控制信道才根据需要打开一个或者多个逻辑信道用于传输音频和视频等数据。打开逻辑信道的之前,首先会开始能力集交换过程,在能力集交换过程完成之后,应用程序还可能会有一个主从确定过程(不是任何情况下都需要,但是双向信道中必须要执行此过程)。之后,逻辑信道被打开,开始传输数据。
3、OPENH323协议栈主要类之间的关系图
OpenH323协议栈主要类的关系图如下:
信息要素:Information Element,Q.931消息中的数据单元,不同类型的Q.931消息包含着数目、类型不同的信息要素。
侦听对象:H323Listener类及其派生类的实例。
传输对象:H323Transport类及其派生类的实例。
端点对象:H323Endpoint类及其派生类的实例。
连接对象:H323Connection类及其派生类的实例。
能力对象:H323Capability类及其派生类的实例。
逻辑信道对象:H323Channel类及其派生类的实例。
逻辑信道协议对象:H245NegLogicalChannel类的实例。
编解码器: H323Codec类及其派生类的实例。
能力集对象:H323Capabilities类的实例。
会话对象:RTP_Session类及其派生类的实例。
(二)、重要协议过程和体系结构分析
1、RAS
原理:
RAS是端点和网守之间执行的协议,基本上是管理功能,它包含以下几个过程:
1、 网守搜寻
用于端点搜寻其归属网守,采用多播机制完成。其后所有RAS消息均限定在端点和其归属网守之间传送。
2、 端点登记:用于端点向网守登记其自身信息,主要是别名和呼叫控制信道运输层地址。包括去除登记过程。
3、 端点定位:用于端点或网守向相应的网守询问某一端点的呼叫控制信道的运输层地址。
4、 呼叫接纳:起呼叫时的第一步操作,询问网守是否允许该呼叫发起。
5、 呼叫退出:呼叫结束后通知网守,该端点已经退出呼叫。
6、 带宽管理:支持端点在呼叫过程中提出带宽改变要求,由网守做决定。
7、 状态查询:主要是用于网守询问终端的开机/关机状态。
8、 网关资源指示:向网守通告该网关的可用资源。
RAS消息如表:
过程 |
消息 |
消息名 |
网守搜寻 |
GRQ |
网守搜寻请求 |
GCF |
网守搜寻证实 | |
GRJ |
网守搜寻拒绝 | |
端点登记 |
RRQ |
短点登记请求 |
RCF |
端点登记证实 | |
RRJ |
端点登记拒绝 | |
URQ |
去除登记请求 | |
URJ |
去除登记拒绝 | |
UCF |
去除登记证实 | |
端点定位 |
LRQ |
端点定位请求 |
LCF |
端点定位证实 | |
LRJ |
端点定位拒绝 | |
呼叫接纳 |
ARQ |
呼叫接纳请求 |
ACF |
呼叫接纳证实 | |
ARJ |
呼叫接纳拒绝 | |
呼叫退出 |
DRQ |
呼叫退出请求 |
DCF |
呼叫退出证实 | |
DRJ |
呼叫退出拒绝 | |
带宽管理 |
BRQ |
带宽管理请求 |
BCF |
带宽管理证实 | |
BRJ |
带宽管理拒绝 | |
状态查询 |
IRQ |
信息请求 |
IRR |
信息证实 | |
网关资源指示 |
RAI |
网关资源可用性指示 |
RAC |
网关资源可用性证实 |
消息过程都比较简单,一般是一端发出一个消息,另一方在收到消息后,如果需要响应,则发送一个响应消息完成一个过程。可以参考下图中的登记和去除登记消息。
RAS消息在呼叫开始和结束的时间都起着非常重要的作用,在呼叫开始时,向网守发送ARQ,当网守确认该呼叫时,将会返回包含端点的H.225信道的TCP地址(如果是网守选路方式,返回网守的H.225信道地址)。终端便可以根据该地址连接呼叫,而在呼叫结束的时候,在H.225和H245信道关闭后,也会发送DRQ/DCF消息以释放占用的带宽等资源。
在通话过程中,可能会有带宽的变化,这就需要用到BRQ/BCF消息,至于其如何与H245消息结合起来操作的,请参考下图:
带宽修改(发送方请求改变)
带宽修改(接收方请求改变)
具体的实现:
1、 创建RAS侦听(处理)线程
在网守初始化函数中,通过调用H323GatekeeperServer:AddListener函数创建RAS侦听线程,便可以开始处理RAS消息了,而普通终端的UDP线程可以在设置网守时(H323EndPoint::SetGatekeeper函数)才建立,也可以启动时即建立(人工创建)。
2、 处理RAS的PDU的过程
处理RAS的函数,对应不同的类(H323gatekeeper和H323GatekeeperListener),调用的处理函数。在应用程序中,当调用AddListener时,通过调用H.225_RAS::StartRasChnnel()函数创建了后台线程——以HandleRasChannel()函数为主体,而在HandleRasChannel()函数中,有一个不断循环,从RAS信道中读出数据,交由H.225_RAS::HandleRasPDU()函数处理,而后者H.225_RAS::HandleRasPDU()函数则是根据接收到的PDU的类型,转给不同的处理函数。
3、 如何在应用程序中调用
在应用程序中如果只是实现呼叫或者等待呼叫时,其实根本不需要直接与RAS相关处理类交互。发起呼叫调用终端类的MakeCall过程中,协议栈类库将呼叫涉及到的过程和函数调用已经封装的相当完善,无需开发者干涉。当然,前提是在应用程序开始的时候要先创建RAS侦听线程。
等待呼叫则是只需要保证应用程序已经创建RAS侦听线程即可。在接收到H.225的Setup消息后,应用程序自然会调用RAS线程的相关处理函数,向网守发送ARQ消息。
2、H.245控制信令
1.能力交换过程
原理
这是H.225呼叫 建立成功后首先要执行的一个过程,他使通行双方了解对方接受和发送信号的能力。每个逻辑信道限定传送某种媒体信息,采用一定的编码算法,具有一定的带宽,因此在信道建立之前,收发双方必须就这些参数进行协商,确定双方可接受的参数范围,这就是H.245的能力交换过程。
H.245协议采用接收方控制的原则建立逻辑信道,发送方只能在接收方规定的范围内确定信道特性参数。能力交换的主要功能就是通过适当的消息向对方通告本端的接受能力。该消息也允许通告发送能力,但其作用知识表示本端的一种选择意向,希望对方在确定其接收能力时予以考虑。当获得对方的接受能力后,本端就在此范围内确定其发送方式,启动逻辑信道打开过程。
能力集的主要参数是接受能力,对方(发送方)必须知道本端的接受能力才能建立逻辑信道。如果能力集不含接受能力,表示本端只能发送不能接受。发送能力的作用是供对方(接收方)使用,对方可以在本端给出的发送能力范围内提出它所希望的发送方式。如果本端不希望对方干预自己的发送方式,则可以在能力集中不提供发送能力,这并不表示它不具备发送能力。
描述终端接受能力或发送能力的终端能力集消息不但给出终端可以支持的各种媒体信号的操作模式而且给出终端同时处理多种信号可能的组合操作模式。
消息中包含一个能力表,该表列出了终端所允许的操作模式,每种模式对应能力表中的一个表项,赋予相应的序号。若干个能力号构成了可选能力集(altemative capability set)数据结构,表示该终端可以按其中一种方式工作。实际上能力集描述了终端的一个媒体信道的能力。
若个可选能力有构成一个“同时能力(Simultaneous Capabilities)”数据结构,表示该终端可以同事使用一组能力进行工作。最后若干同时能力又可构成一个“能力描述语集”(capability descriptors)数据结构,他包括一组能力描述语,每个描述语由一个同时能力和一个能力描述语序号组成。该数据结构给出了终端的总体能力。之所以要定义多个描述语,是因为终端选用多种组合方式工作,在不同的组合方式下,各个信道的允许操作模式可以不一样,以满足所需的要求。
下图终端能力集消息的嵌套式数据结构,其中,序号有有证实消息返回,发送端数据可以确定与该证实消息匹配的终端能力集消息。协议标识指明H.245版本号,复用能力主要指示该终端的多点通信能力,用于会议通信。能力表每个表项的内容不只是简单的编译码标准还包含许多相关的参数。
终端能力集消息至少包含一个能力描述语。在通信过程中,允许终端发送新增或修改描述语,以动态增加或删除终端能力。
实现
2主从确定过程
主从确定过程用于避免信令过程中的冲突现象。主要应用于会议通信中的MC仲裁。由于一个会议呼叫只能有一个MC,如果两个参会的H.323实体都含有MC,则必须确定其中一个是主MC。同样的过程也使用与双向信道的建立时主从终端的确定。在建立信道连接之前必须首先解决主从关系。
每个H.323端点应该即能工作在主机模式也能工作在从机模式。在执行过程时,每个端点需要生成一个随机数称为状态确定号,其取值范围为0~2(24)-1,每个端点对于呼叫只能确定一个随机数。为了确定主从消息,任一个端点可以向对方发送一个主从确定消息,该消息包括两个参数:状态确定号和终端类型。
对方收到确定消息后,执行确定计算过程。确定的规则:首先比较两个端点的终端类型值,大者为主机:如果相同,在比较两个端点的状态确定号,大者为主机。如果仍相同,则判断为不可确定,则回送拒绝消息。再次启动主从确定过程。
如果两个实体为不同类型有MC功能的高于无MC功能的实体;若没有MC,则网关高于终端;若都有MC,则优先级别自高到低顺序为:MCU、网守、网关、终端。
实现
3、逻辑信道信令过程
原理
逻辑信道的信令过程包括逻辑信道的打开和关闭。器设计思路是首先建立连接,确定接收方能够接收并已准备好接受由对方发送来的数据后,才开始媒体数据的传输,在接纳新的逻辑信道时,接受方必须确保原有逻辑信道的通信不受影响。
该协议过程还包括双向信道的打开。为了防止双方终端同时打开信道,引起冲突,需将其中一方定义为主终端,另一方定义为从终端。
逻辑信道的关闭一般也是有发送方发起。
1单向信道打开过程
信道打开恒由发送方启动。它向接受方发送打开逻辑信道消息,消息包含前向逻辑信道号和信道参数。其中,信道号必须发送方赋值,证实消息返回此值,以和请求消息匹配。信道参数包括数据类型、媒体信息是否需要确保传送、是否执行静音抑制、目的地终端标记等。如果该信道用来传送RTP封装的实时媒体消息,则信道参数还应该包括会话标记、关联会话标识、媒体信道、媒体控制信道。这样,经过此过程,两端点间建立前向RTP信道和双向RTCP信道。
2双向信道打开过程
双向信道打开过程和单向信道基本相同,其中主要的差别在与消息中还包含反向信道参数。因此一次消息交换同时建立两个方向的信道。此外,请求方接受到对方的证实消息后,还需回发一个确定消息,表示反向信道的建立成功,可以开始传送信号。
如果对方不能支持本端要求的反向信道,则回送拒绝消息,然后立即启动双向信道打开过程,其反向信道参数等于本端发送的前向信道参数,其前向信道参数取为双方都能支持的参数值。
实现
4.呼叫释放过程
原理
通信的任何一方都可发起呼叫释放,器信令过程如下图所示。为简单说明,假设呼叫信令和H.245控制信令都采用直接选路方式,其释放步骤为:
1. 端点1停止在逻辑信道上传送信息,关闭所有逻辑信道。然后在H.245控制信道上向端点2发送结束会话的命令消息,告诉对方要结束该呼叫,其后停止发送H.245消息。
2. 端点2收到上述消息后,关闭所有逻辑信道,向端点1回送结束会话命令消息。至此,H.245控制信道关闭。
3. 如果呼叫信令信道尚未关闭,端点1向端点2发送H.225。Release Complete消息关闭此信道。至此,呼叫已释放。
4. 端点1和端点2分别向其网守发送RAS消息DRQ,告之该呼叫占用的带宽资源可予以释放。
5. 网守向端点回送DCF。其中,端点将不在向网守发送未经过请求的IRR消息。至此,完成全部释放过程。
如果是会议呼叫,则必须首先用H.245“退出会议”消息明确终止会议,然后各个端点等待MC自动呼叫释放过程。
呼叫释放也可以有网守发起如下图:
3、H.225呼叫信令
原理:H.225基本呼叫控制消息取自于Q.931和Q.932消息。但是由于其本身不承担链接控制的任务,所以许多消息不在H.225中出现。
虽然H.225呼叫信令模型取自于Q.931,但不同之处在于,Q.931用于ISDNUNI,两端分别是用户和网络,一般是不对称的应用,而在H323系统中,呼叫是对称应用的。
H323端点之间建立通信关系一般要经过三个过程:
1:呼叫接收控制。
执行RAS协议(H.225),控制信道为RAS信道(不可靠信道),网守同意接纳后在端点和网守或端点之间建立起呼叫信令信道,进入呼叫建立。
2:呼叫控制
执行呼叫信令协议(H.225),控制信令为信令信道(可靠信道),呼叫建立成功后,在端点之间建立H245控制信道。
3:连接控制
执行H245控制协议,控制信道为媒体控制信道,简称控制信道(可靠信道),在端点之间建立起具有一定带宽的一个或多个逻辑信道,实时通行的逻辑信道都是不可靠信道。
具体实现:
当一个ARQ消息到达后,首先会为RAS侦听线程接受,然后,RAS线程开始解码,解码后才分析出是ARQ消息,此时,RAS线程启动相应的处理程序(ONARQ()),程序分析此ARQ的消息是否完整,所提出的请求能否满足,当ARQ所提请求网守可以满足时,网守同意接纳此呼叫,并翻译出被叫终端的呼叫信令信道运输层的地址,有ACF消息回送主叫终端。在回送ACF消息之前,网守还根据网守当前的配置选择网守选路还是直接选路的信令传送方式,作不同的操作,当然,无论信令传送方式,都必须将当前呼叫增加到网守的呼叫表中去。
在直接选路方式中,主叫在接受到ACF后,将建立到被叫的呼叫信令连接,并发送Setup消息,开始H.225呼叫建立过程,被叫在接受到Setup消息后,将回送一个call proceeding消息,同时,向自己的网守发送ARQ消息,在网守返回ACF消息后,在通过H.225发送Alerting消息给主叫,然后发送连接消息给主叫,至此,呼叫建立过程完成。
而在网守选路方式中,主叫在接受到ACF后,将建立到网守的呼叫信道连接,并发送Setup消息,开始H.225呼叫建立过程,网守回送主叫call proceeding消息,同时,向被叫发送Setup消息,被叫在接受到Setup消息后,在通过H.225发送Alerting消息给网守,网守发给主叫,然后发送连接消息给网守,网守转发给主叫,至此,呼叫建立过程完成,此后所有的信令都通过网守转发。
在终端中,发起和接收一个呼叫这两个过程,是有终端类(H323EndPoint)实现的,这两种行为都要经过前述的呼叫接纳控制(RAS),呼叫控制(H.225)和链接控制(H245)三个过程。两者并无很大不同指出,基本类似。以下描述一个终端主动发起呼叫的过程。
终端在完成应用程序初始化过程后,创建继承自EndPoint类的实例,会进行初始化的工作,包括当前呼叫设置,终端能力集设置,打开信道(H323ListennerTCP),打开RAS信道(H323TransportUDP)。然后,终端会立即发起一个呼叫,或者等待呼叫,或者等待用户的操作。假设直接发起一个呼叫,则终端通过调用MakeCall函数实现此过程。然后程序执行以下步骤:
1.H323EndPoint::MakeCall()函数产生一个呼叫。
该函数先检查传输是否为空,是则建立一个传输transport,然后进行一些设置,在调用H323EndPoint::CreateConnection()建立连接。然后通过H323Connection::AttachSignalChannelb绑定。此后再建立一个新的H.225CallThread类(线程)。
2.在H.225CallThread类的主函数(main)只是简单的调用H323Connection::SendSignalSetup()函数,并根据该结果选择H323Connection::ClearCall()失败或者H323Connection::HandleSignallingChannel()成功.
3.在H323Connection::SendSignalSetup()中开始H.225呼叫信令建立过程
4. H323Connection::HandleSignallingChannel()函数:对到来的数据传递给HandleSignalPDU函数处理。
5. H323Connection:: HandleSignalPDU函数,此函数对到来的H.255(Q.931)消息的主要函数,同时也对可能出现的H245隧道数据进行简单的分析,并将之交给由H323Connection::HandleTunelPDU函数处理。如下图所示:
4、Q.931
Q.931消息有4大类,22个。分别为呼叫建立消息,呼叫信息阶段消息,呼叫清除消息,其它消息。H.323协议栈中实现Q.931只是定义本身需要用到的各种数据结构和基本的消息和信息单元操作函数,编码解码函数。至于具体的各个连接,建立,维护和释放过程的控制,都不在类里实现,而是在实际应用中其它类的函数中实现。
下面是Q.931典型通信过程
5、控制协议的实现:
H.245控制协议的基本框架在H323Connection类中实现,主要包括消息的接收和分发,但协议的状态机由H245Negotiator的几个派生类进行了封装,他们是H245Neglogicalchannels、H245Negmasterslavedetermination、H245Negrequestmode、H245Negroundtripdelay以及H245Negterminalcapabilityset,分别描述逻辑信道,主从关系确定、模式优先请求、环路延迟检测以及能力集交换过程,反过来,H323Connection类又通过定义若干可重载的回调函数供这些子类调用以实现对协议的控制。
下图给出H323Capability与其派生类之间的层次关系,这一层次基本上和H.245规定的Capability结构相对应。具体的编解码能力类可以直接派生自H323Capaility,也可以派生图中的其他接点,派生类需要根据H.245协议的规定增加对应的参数并实现父类的纯虚函数。
6、编解码器H323Codec
编解码器由抽象类H323Codec描述,该类及其子类的层次关系如下图。H323Codec有几个重要的保护成员:logicalchannel为联到编解码器上的H323Channel指针,指向使用编解码器的逻辑信道对象; rawdatachannenl 为联到编解码器上的PChannel指针,指向采集和播放原始媒体数据的设备;direction为编码器的方向,取Encoder和Decoder两个值;mediaformat描述媒体格式,是一个Opalmediaformat对象,规定了RTP负载类型,采样率,帧长度,会话类型,帧率等参数。
7、逻辑信道:
逻辑信道由抽象类H323Channel描述,该类及其子类的层次关系由下图给出;
逻辑信道的属性主要包括:逻辑信道编号、会话类型标示、传输方向、所属的H.323端点、所属的H.323连接、使用的能力以及使用的编解码器,其,所属连接和使用的能力在逻辑信道对象建立时指定。