Resiprocate简介 联系客服

发布时间 : 星期日 文章Resiprocate简介更新完毕开始阅读3f700a01b52acfc789ebc9bc

Resiprocate简介

1、背景介绍

随着VoIP和NGN技术的发展,H.323时代即将过渡到SIP时代,在H.323的开源协议栈中,Openh323占统治地位,它把一个复杂而又先进的H.323协议栈展现在普通程序员的眼前,为H.323普及立下了汗马功劳。而然当在SIP时代,则出现了群雄割据的状况,SIP相对于H.323简单,灵活,于是各种协议栈层出不穷,一下主要介绍对ReSIProcate协议栈的理解。

ReSIProcate是由SIPFoundry开发,ReSIProcate最开始起源于Vocal,由于Vocal开始只支持rfc3254,为了支持最新的rfc3261,ReSIProcate诞生了,但现在,ReSIProcate已经成为一个独立SIP协议栈了,它十分稳定,并且很多商业程序都在使用。 具体参数:

Language : C++ VxWorks port : No Win32 port : Yes Linux port : Yes

Supports RFC 3261 : Yes Supports RFC 2327 : Yes Supports RFC 3264 : Yes

Supports RFC 3263 : Partial Supports RFC 3515 : Yes Supports RFC 3262 : No Supports RFC 3311 : No TCP : Yes UDP : Yes

SIZE : < 2.5 Mb License : Vovida Document : Few Samples : None

2、 SIP基本呼叫

下面是一个SIP协议的基本呼叫流程图以及对该流程的简单讲解。

SIP UA(Client/Caller)SIP ProxySIP ProxySIP UAS(Client/Callee)主叫摘机发起呼叫InviteInviteInvite100:Trying100:Trying100:Trying180:Alertting180:Alertting200:OK200:OK被叫振铃180:Alertting被叫摘机应答200:OKRTP通道:主被叫通话主叫先挂机ByeByeBye200:OK200:OK200:OKSIP Base Call Flow

上图描述的是一个SIP基本呼叫的流程图,主被叫SIP UA分别注册在不同的Server上,以下对上述流程做一简单说明。 流程说明:

2.1、 首先主叫SIP UA摘机拨叫被叫号码,SIP UA向注册的server上发送invite

消息,携带主被叫的URL和主叫SDP(也可以不带); 2.2、 SIP Proxy1收到invite后对URL进行解析,找到被叫SIP UA的注册Server并路由; 2.3、 SIP Proxy收到invite后解析URL,找到被叫SIP UA,发送invite; 2.4、 被叫SIP UA收到后,分析该消息处理时间可能超长,向主叫发送100Trying,

通知主叫被叫正在处理主叫请求; 2.5、 然后被叫SIP UA指示放回铃音,并发送Alertting(可能会带SDP)消息给

主叫,通知主叫被叫正在放回铃音; 2.6、 之后被叫摘机应答,向主叫发送200OK携带被叫的SDP(如果Alertting已

经携带了SDP,则200OK不带SDP),主叫收到后向被叫回ACK消息确认。

2.7、 双方建立起呼叫,主被叫进行通话。

2.8、 然后主叫先挂机,释放呼叫资源并向被叫发送Bye消息,被叫收到BYE后释

放资源并响应200OK最终响应,会话结束。

3、 Resiprocate设计模式

Resiprocate将SIP协议栈设计为以下四个层次:

事务用户层(Transaction User)【SIP UA 与协议栈的接口层:该层负责将SIP消息入栈并触发事务,以及进行事务管理】事务层(Transaction )【SIP 事物层:对SIP事务进行管理,以及事件超时处理】传输层(Transport)【SIP消息传输层:根据SIP消息中标记的协议类型选择合适的协议将消息发送到IP网】语法与编码层(Syntax and Encoding)【SIP消息处理层:检测SIP消息是否合法,并对消息进行编解码和响应】

Resiprocate通过以上层次之间的密切配合完成对SIP消息的处理,以下是我的一些浅显理解:

3.1、事务用户层:SIP UA 与协议栈的接口层:该层负责将SIP消息入栈并触发事务,

以及进行事务管理,在代码中对应定义的管理类“DialogUsageManager”;它继承了类“HandleManager”和“TransactionUser”。DialogUsageManager类负责

保存对话(dialog)链表,对每一个SIP消息构造一个事务会话,并对SIP消息的接收、处理和发送提供上层接口,以及初始事务会话(Session)。(Dialog:

指一个呼叫从主叫摘机发起呼叫直到通话后主被叫挂机为止,编号:CallId)。 另外:由于DialogUsageManager下面管理的Dialog很多,为了分步管理并且提高查询效率,DialogUsageManager将Dialog放在DialogSet里面,然后通过DialogSet间接管理每一个Dialog。于是有下述关系:DialogUsageManager包含DialogSet,DialogSet包含Dialog。

3.2、事务层:对SIP事务进行管理,以及事件超时处理;这些事务在代码中应该就是

指的一个会话(Session),对应于“InviteSession”类,继承关系:

Handled->BaseUsage->DialogUsage->InviteSession.由于每个session都是属于一个dialog的,所以这里提供getDialogId函数;每一个事物会话还设有状态,通过状态机控制对每一个请求消息进行响应,从而完成一整个事务会话;对于每个消息的处理是在虚基类InviteSessionHandler中定义的纯虚函数,在InviteSession类中只是定义了函数getSessionHandle,返回处理方式,而具体的实现则在定义UA时完成(例如Mrcagent就必须继承InviteSessionHandler并定义实现部分);另外事务层还保证了每个dialog的offer/answer平衡,根据判断offer/answer是否平衡来确认响应消息是否带SDP。(Session:指一个呼叫中发起的请求消息和响应消息对,例如BYE和其响应消息200OK一起构成了一个事物会话,所以一个Session事务一般至少包含两个SipMessage)。

3.3、传输层:根据SIP消息中标记的协议类型选择合适的协议将消息发送到IP网,网

络层是负责SIP消息在IP网的传输;该部分处理是在类DialogUsageManager中进行的,通过调用该类的成员函数internalProcess完成的,但是事实上是从类TransactionUser中继承过来的,发送/收到消息的队列为mFifo。

3.4、语法与编码层:SIP消息处理层,检测SIP消息是否合法,并对消息进行编解码和

响应;主要是在类DialogUsageManager中的process函数处理,它贯穿整个SIP消息的处理流程;基本流程为:

internalProcess->incomingProcess->processRequest/processResponse->DialogSet::dispatch【如果出错就makeResponse and sendResponse】

->dialog::dispatch->InviteSession::dispatch->InviteSession::dispatchConnected->InviteSession::dispatchOthers->InviteSession::dispatchInfo->mDialog.makeResponse and 回调InviteSessionHandler的纯虚函数handler->onInfo(getSessionHandle(), msg)在MRC中实现部分为【MrcAgent::onInfo】

4、 Resiprocate中类的继承关系

以下只列出了一部分类的关系,并且类的成员没分私有共有也只列出了一些个人认为典型的,没有列出 friend class。

Dialog:mDum\\mDialogSet\\mId\\mInviteSession\\DialogType\\mCallId\\mRequests\\mRemoteTargetHandleManager:mHandleMap\\ mShuttingDown\\ mLastId;InviteServer:mTransceiverMessage:tuTransactionMessage:Handled:mHam\\mIdHandleManager:mHandleMap\\ mShuttingDown\\ mLastId;TransactionUser:mRuleList\\mDomainListSipMessage:mTransport\\mSource\\mDestination\\mBufferList\\mContents\\mReason\\mEncoded\\mForceTargetBaseUsage:mDum\\mHandleDialogUsage:mDialogDialogUsageManager:mDialogSetMap\\mMasterProfile\\mInviteSessionHandler\\mClientRegistrationHandler\\mStack\\mIncomingTarget\\mCancelMap\\mConnectionTerminatedEventDispatcherModelAdmin:adminCommandLineParser:mLogType\\ mEncrypt\\ mUdpPort\\\\mAor\\mPasswordmOutboundProxy\\mBuddies\\mTarget\\mCertPathClientPublicationHandlerClientRegistrationHandlerOutOfDialogHandlerClientSubscriptionHandlerInviteSessionHandlerInviteSession:mPeerSupportedMethods\\mPeerUserAgent\\mState\\mCurrentLocalSdp\\mCurrentRemoteSdp\\mCurrentEncryptionLevel\\mEndReason\\mAcksSessionLogicMng:slmMsgList\\slmConfMsgList\\slmDialogMsgList\\seqValueConf\\seqValueConn\\ssdSeqNum\\mcdSeqNumMrcAgent:pSendMessage\\IsAvailable\\pControl\\SpecifymContact\\mRequestMap\\mUacCallIdMap\\first\\mInfoHandleStateMap\\SendMessageList\\InfoMessageList