osip2协议栈原理分析以及总结.docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《osip2协议栈原理分析以及总结.docx》由会员分享,可在线阅读,更多相关《osip2协议栈原理分析以及总结.docx(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、OSIP2 协议栈学习总结1、Osip2协议栈介绍Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点。它的核心特性为sip协议数据的解析和事务的治理。数据包的收发、RTP 流的处理等,并不在Osip2中完成。应用程序使用Osip 时需要单独去实现这些模块。Osip2的缺点是没有很好的上层api封装,使得上层应用在调用协议栈时很裂开;只做到了transaction层次的协议过程解析,缺少call、session、dialog等过程的解析,这也增加了使用的难度。2、Osip2 协议栈体系构造OSIP主要由解析模块、工具模块和状态机模块构成,其核
2、心是状态机模块OSIP构造如以下图应用程序SIP 解析SRL 解析DIALOG 工具SDP 协商工具SDP 解析状态机模块有限状态2.1 语法解析器libosip库源码src/osipparser2为解析器源码,OSIP解析模块主要用于对SIP恳求与响 应进展封装与解析处理,分为SIP解析、URL解析与SDP解析完成对sip协议相关字段的构造和 解析。比方,将紧凑的存储于内存buffer中的sip 数据解析到清楚定义的数据构造体中,每 一个字段代表sip协议中有意义的一个头域。SIP解析主要负责SIP标题头的解析与封装。 SDP解析除了对数据包中SDP会话各类型进展解析外还包含对各类型的初始化
3、和释放操作以 及对整个SDP包的一些根本操作。URL解析主要负责对SIP URI中包含的host,port,username, password等信息进展解析与设置。2.2 有限状态机SIP状态机模块负责完成对某个事务状态的维持及处理。并且在特定的状态下触发相应的大事或者回调函数。OSIP协议栈的状态机主要分为4类:INVITE客户端事务ICT,非INVITE 客户端事务NICT,INVITE效劳器端事务IST,非INVITE效劳器端事务NIST。2.3 工具模块OSIP工具模块分为对话治理工具和SDP协商工具。对话治理工具使用户能够依据RFC3261 对dialog进展操作,建立相应dial
4、og构造体。并通过对dialog构造体的添加、删除、查询实现对话治理。SDP协商工具负责向SIP终端用户供给协商codec等功能。2.4 协议栈框架框架并不是指代码的某一局部,而是指它的构成形式。主要有三局部:底层套接字接收/发送,模块间通信管道,上层调用api接口。Osip2并不实现底层套接字的接收/发送,由eXosip实现,现在只支持UDP的链路连接。10模块间的通信管道包括:transaction的消息管道、jevent的消息管道。Transaction 的消息管道是驱动其状态机的部件,通过不断的接收来自底层套接字的远端信令,或者来自上层调用的指令,依据上述的状态机制来驱动这个trans
5、action的运转。Jevent的消息管道是eXosip实现的,用于汇报底层大事,使得调用程序能处理感兴趣的大事。上层调用的api接口大致有两类:sip协议的调用接口和sdp协议的调用接口。EXosip封装了大局部的sip协议调用接口,一般来说都不需要直接调用osip2的接口函数。接口函数很多,在这里就不详述了,函数定义请参照源代码局部的注释。2.5 osip2与sip协议层次的关系LIBOSIP2开发库层次关系3、OSIP 关键数据构造及其说明3.1 osip构造体定义从该构造体的定义可以看出,osip主要有两局部构成,其一是事务链表,各个状态的事务的大事都挂载在该链表上;其二是回调函数,回
6、调函数中前三个是内部使用,也就是osip 库在处理消息的过程中,假设匹配某个状态,就执行对应的回调函数。用户可以使用这些回调函数显示一些状态,处理一些错误等。最终一个是消息发送回调函数,也就是osip需要发送sip 数据包时,就是通过该回调函数完成的。3.2 transition_t :transition_t构造体定义了事务state 为事务的状态,type 是事务对应大事的类型,method 为函数指针,定义了当前状态收到type 类型大事后应当执行的动作。next 和parent 为构成链表和队列时的前向和后向指针。这是一个通用的构造体,也就是说,ict、ist、nict,nist 都是
7、用该构造体表示事务的。3.3 osip_message_config_t :该构造体主要用于sip消息的解析hname 为sip消息头的某一个域的名称,比方cseq、from、to 或者via 等。setheader 是处理该局部的函数。最终一项为哪一项一个标识,当被设置为1时,说明当前头域数据假设无效的话,可以无视,不影响整个消息头的处理。3.4 osip_transaction这也是一个事务的定义,与之前的transaction_t 的区分在于:之前定义的事务主要用在状态机处理中,主要包括了事务的 状态,大事的类型以及要调用的处理函数;而这里定义的osip_transaction,则包含了
8、事务相关的全部信息,存放在osip 的事务队列上。该构造体包含了与事务处理相关的信息,包括事 务ID,事务队列其上是事务的大事,事务关联的sip 信息via、from、to、callid 以及cseq 五元素,关联的sip messageorig_request、last_response、ack,以及该事务在状态机 中的上下文信息ict_context、ist_context、nict_context、nist_context。osip_transaction_t 是RFC 中的事务的定义, 它表示的是一个会话的某个Dialog 之间的某一次消息发送及其完整的响应,例如invite-100-
9、180-200-ack 这是一个完整的事务,bye-200这也是一个完整的事务,表达在SIP消息中,就是Via 中的branch 的值一样表示属于一个事务的消息固然,事务是在Dialog 中的,所以From、To 的tag,Call-id 值也是一样的。事务对于UAC,UAS 的终端类型不同及消息的不同,分为四类,前面说的invite 的事务,主叫uac中会关联一个ict事务,被叫uas 会关联一个ist事务,而除了invite之外, 都归类定义主叫nict,被叫nist。在osip 中,它是靠有限状态机来实现的上述四种事务osip_fsm_type_tctx_type 中定义的,它的主要属性
10、值有callid,transactionid,分别来标识dialog和transaction,其中还有一个时间戳birth_time 标识事务创立时间,可由超时处理函数用来推断和打算超时状况下的事务的进展和销毁。它的state 属性也是格外重要的,依据上述的事务类型不同,其值也不同,它是前面提到的状态机的“状态”, 在实际状态机的规律执行中是一个关键值。3.5 osip_dialogosip_dialog 中包含的主要都是与对话相关的sip头中的信息, 这些信息可以区分不同的对话,比方call_id,local_tag, remote_tag 等。另外,还指出了对话的类型,是caller 还是
11、callee。osip_dialog_t 是SIP RFC 中的dialog或叫call leg的定义,它标识了uac和uas的一对关系,并始终保持到会话(session) 完毕。一个完整的dialog主要包括from,to,callid,fromtag,totag,state, 其中fromtag,totag,callid在一个dialog 成功建立后才完整,表达在SIP 消息中,就是From、To 的tag,Call-id 字段的值一样时, 这些消息是属于它们对应的一个Dialog 的。例如将要发起invite 时,只有fromtag,callid 填充有值,在收到to远端的响应时,收到t
12、otag 填充到dialog 中,建立成功一个dialog,后继的规律均是使用这个dialog 进展处理如transaction 事务处理。state表示本dialog的状态,与transaction的state有很大的关联,共同由enum 构造state_t 定义。3.6 osip_message_t3.7 osip_event可以看到这是一个格外大的构造体。该构造体用来保存与sip 消息相关的大局部信息。一般都是一个消息头对应其中的一项。比方,像sip 头数据中的call_id、from、to、via、等等,都能在该构造体中找到。在程序中,接收到的sip消息都是以紧凑的方式放在buffer
13、中的,解析器模块的功能就是将其进展解析 分类,放到这个构造体的具体对应项上,这样便于在程序中使 用。同时,假设需要发送数据时,解析器会依据该构造体中的 信息重将sip信息以紧凑方式放到buffer中供发送模块使用。简洁来说,sip协议中定义的各个头,在接收发送处理中都是一个接一个在内存中存放的,而在osip中对其的使用是依据上面 的构造体来的,我们在程序中不再需要移动指针从buffer中来 找各个sip头数据。这个构造体用来表示事务上的大事。Type 指出大事的类型,transactionid 指出事务的id,sip 指向上面介绍的osip_message 构造体,也就是大事对应的sip 消息
14、。4、osip 协议栈工作原理4.1 系统初始化过程在OSIP工作之前,必需先初始化,主要有以下几个局部:(1) 系统资源申请,包括资源和链表的处理函数:osip_init(2) 设置系统 CALLBACK 函数Callback 函数有很多,但是主要可以分为以下四类:n 用于发送sip 消息的网络接口。这通过osip 构造体的cb_send_message 函数指针指向。n 当一个sip 事务被terminate 的时候调用的回调函数。这由osip 构造体的kill_callbacks 数组保存n 当消息通过网络接口发送失败的时候调用的回调函数。这由osip 构造体的tp_error_call
15、backs 数组保存。n sip 事务处理过程中需要通知用户的回调函数。这局部由osip 构造体的msg_callbacks 数组保存。上面的回调函数中,有一些是必需设置的,比方第一项,有些则是可选的,比方第四项中的局部回调函数。对于可选的回调函数,简洁的处理可以是不做任何处理,或者仅仅打印通知信息。osip_set_cb_send_message ;/系统的信令发送函数,在这个函数中,要完成信令包的向外发送功能。osip_set_kill_transaction_callback ;/设置四个状态机下消息传输失败的处理函数。osip_set_message_callback ;/设置各种状态
16、机下各种大事发生后用户的回调(3) 翻开接收远端消息接收通道翻开通道就是保证远方的消息能够顺当的被本地接收到,然后交给 SIP CORE 处理,它包括以下几个步骤 Step1:监听端口 翻开 SIP 端口 SOCKET,然后监听此端口,如 5060。需要留意的是,SIP 支持 TCP和 UDP 两种方式,SIP 首先UDP 方式。 Step2:解析消息 接收到消息后,调用 osip_parse 函数,来完成对消息包的解析。这个函数完成后, 消息就从一般信令消息分解成了 OSIP2 自己可以理解的消息大事。osip_parse 函数在 srcosipparser2 下。 Step3:将消息送给
17、SIP CORE 处理 解析后的消息,系统调用 osip_find_transaction_and_add_event 函数,把消息发送给和此消息相关的处理事物或者说session,假设系统中没有和这个消息相关的 session也就是说是个的 request,那么此时将建立一个session(或者说 transaction,由于在不同层面有不同理解),用于处理的事务。实际上,这个 session 创立的过程也就是一个的系统状态机的建立过程,依据这个消息的种类,osip_transaction_init 负责初始化,建立一个的和种类对应的状态机四种状态机中的一种,然后调用 osip_transa
18、ction_add_event 把消息扔给这个刚建立起来的状态机处理。一个的状态机也就开头运做。到此,OSIP 就已经正常工作,可以接收网络来的消息。4.2 一个呼叫过程简要分析下面通过一对呼叫的连接过程说明OSIP的消息的整个处理过程。假设终端A呼叫终端B, 两放都是用的OSIP CORE。u Stp1:A生成一个Invite消息这个过程是大家都生疏的过程,也就是利用本地信息,组建一个SIP包的过程,需要留意的是:rtp流的本地接收发送端口是在这里就建立的,然后放到SDP中。u Step2:A把生成的消息交给核心处理。首先系统调用osip_transaction_init ,产生一个的状态机
19、。在发送invite恳求的时候,这个状态机是ICT(带invite的client端状态机)。状态机产生后,系统调用函数把消息扔给状态机处理,osip_transaction_add_event负责把消息插到队列中。u Step3:A的ICT状态机调用ict_snd_invite函数发送invite包给对方,状态机自身从初始状态跳转到calling状态,等待对方回应,并设置响应的A超时和B超时,当A 超时到达的时候,向对方重发一次数据包,并且把A时间的时间增加一倍最长为4S,假设超过4S,将不再增加。当B时间到达后,系统认为对方没有响应,则释放资源,完毕本次操作。u Step4:B的信令监听端口
20、接收到此invite恳求包,调用osip_parse函数,来完成对消息包的解析,然后系统调用osip_find_transaction_and_add_event函数来试图把此消息包插入已经存在的session的传输队列比方系统还有另外一个呼叫,当系统觉察当前信令包并不属于已经存在的session的时候,系统认为之是一个的呼叫过程,因此,系统调用osip_transaction_init函数建立一个信的状态机来处理这个session,这个状态机也就是IST(带invie的server状态机),然后把信令消息插到状态机的大事列表中,供其处理。u Step5:B的IST处理A的invite恳求,自
21、身的状态机从IST_PRE_PROCEEDING跳转到IST_PROCEEDING状态,并发送100消息给对方,调用用户设置的回掉函数来完成用户收到恳求时候的处理。留意,B应当发两次1XX消息给对方,一个是100,一个是180。下面的状态也一样。u Step6:A收到1xx的回应,自身从ICT_CALLING状态跳转到ICT_PROCEEDING状态,并调用用户的回掉函数来完成用户的要求。留意,A会收到B过来的两次1XX消息,参考step5的说明。u Step7:B的用户认可,可以接收A的此次呼叫,B发送调用ist_snd_2xx函数,发送200 OK消息给A,B的状态机IST从IST_PRO
22、CEEDING IST_TERMINATED。完成一次IST的效劳。u Step8:A接收到200 0K,状态机跳转到ICT_TERMINATED状态,完成一个ICT效劳。u Step9:信令完毕后,RTP流的建立在Invite信令中,A告知了B本地的RTP接收地址和端口,B在200 OK中告知了A本地的RTP 的接收地址和端口,因此,信令完毕后,A和B就可实现流的互通通常是音频,需要留意的是,RTP并不是OSIP的一局部,从模块上说,它是规律上的另外一个局部,RTP流是依靠SIP 信令里的信息建立起来的,但和SIP或者SIP信令本身而言并没有任何必定联系。另外,就RTP要传送的音频数据本身而
23、言例如音频数据,和SIP更没有必定联系。通常,数据是这样产生的,A采集音频数据,然后交给编码局部编码例如711,723,压缩 完后的数据,由RTP打包,然后发送给B。B接收这些数据,拆RTP包,拿出原始数据,交给解码,解出数据后给播放进展播放。从这里也可以看出,OSIP2和这局部也是没有任何联系的。关于RTP流的建立的过程请看朱葵阳整理rtp文挡。4.3 sip消息发送接收具体分析4.3.1 sip 消息的发送发送 SIP 消息,需要用到如下三个主要的数据构造:osip_messag_t,保存待发送消息;osip_dialog_t,保存dialog 信息;osip_transaction_t,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- osip2 协议 原理 分析 以及 总结
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内