osip源代码框架详解.doc
《osip源代码框架详解.doc》由会员分享,可在线阅读,更多相关《osip源代码框架详解.doc(35页珍藏版)》请在咨信网上搜索。
1、Q/CT XXXX.1-2008Osip协议源代码框架详解Prepared byMao minghuaDate2009.09.25Reviewed by DateApproved byDateRevision HistoryVersionAuthorReviewed ByCommentsIssued Date0.1Mao minghua描述osip协议栈的源代码框架目录1符号及缩写42整体描述43OSIP包的源代码框架解析53.1osip的transaction的event的产生53.1.1定时器事件的产生过程63.1.2报文触发的事件73.2osip 的transaction的event处理
2、流程73.2.1ICT的处理流程83.2.2IST的处理流程93.2.3NICT的处理流程93.2.4NIST的处理流程93.3Osip报文的解析103.3.1sip协议报文的解析整理流程103.3.2Osip报文头的解析123.3.3uri的解析143.3.4添加一个新的协议header字段153.4osip的transaction的管理163.5osip中dialog的管理184EXOSIP包的源代码框架解析194.1Lib库的初始化和销毁204.2Lib库的主处理线程234.2.12xx应答的重发处理机制244.2.2Exosip_execute执行流程244.2.2.1Exosip_r
3、ead_message的处理264.2.2.2eXosip_process_response_out_of_transaction的处理流程:294.2.3eXosip_automatic_action处理流程294.3Call的处理304.3.1创建Call的第一个INVITE304.3.2INVITE的ACK应答的创建和发送324.3.3dialog内的请求的创建和发送334.3.4Dialog内answer的创建和发送334.4Register的处理344.4.1向一个服务器第一次注册354.4.2调整一个注册的注册超时时间354.4.3发送一个register注册35Osip源代码框架
4、详解1 符号及缩写缩写英文全称中文名称ICTInvite Client Transaction Invite类型的客户端事务ISTInvite Server TransactionInvite类型的服务端事务NICTNot Invite Client Transaction 非Invite类型的客户端事务NISTNot Invite Server Transaction非Invite类型的服务端事务IMSIP Multimedia SubsystemIP多媒体子系统PSVTPacket service video telephony分组域可视电话SIPSession Initiation Pr
5、otocol会话初始协议UDPUser Datagram Protocol用户数据报协议URLUniform Resource Locator统一资源定位器2 整体描述开源代码的osip协议栈分为两个源代码包,整个协议栈采用lib库的形式,在内部没有使用到任务,采取与TCP/IP协议栈一样的策略,所以在使用上需要上层管理任务直接调用lib库提供的接口。因为在Lib库内部没有使用到像定时器、发送队列等的任务,而同时需要使用到定时器,所以在lib库的内部采用轮训遍历的方式不停的检查是否有定时器超时,这在某种程度上会浪费CPU的允许时间。同时整个lib库实现了对call, notify等的管理,为了
6、实现重入,在应用启用多线程的条件下,内部启用的信号量和锁的使用,在下面的分析中不涉及到信号量和锁机制。Lib库按照sip协议栈的层次关系分为两个lib包,底层的osip lib包实现对单个请求、应答、ACK的处理,包括message的解析、拼装、内容set和get,单个请求形成的transaction相关操作以及通信两端形成的一个dialog的操作。Lib库上层的exosip lib在底层osip lib库的实现基础上,实现对sip协议整理逻辑上的管理。Exosip主要关注的是sip协议的业务流程,包括call的整体管理,notify的整体管理, publish的管理,register的管理,
7、option的管理,refer的管理和subscription的管理,其中最主要的为call和register的管理,这两个为sip协议栈必须实现的部分,另几个功能为sip协议栈扩展部分。从这几个业务的管理流程出发,在业务的底层它们会使用到相似的一些功能,如注册的认证,发送message,接收message,每个请求和应答形成的transaction,多个transaction组合而成的dialog。在message的处理方面,可以分为两类,一类为发送的message,因为是主动发送,所以上层管理层知道是什么类型的message,lib库直接提供各类接口供使用。一类为接收到的message,因
8、为不知道是哪种类型,所以需要根据解析出来的message的信息来进行处理,这部分的处理在udp.c文件中。整个lib库的初始化在exOsip中介绍。3 Osip包的源代码框架解析在osip源代码包中最主要的包括了message的相关操作,其中最重要的为message的解析,即从获取到的一个message中解析生成一个能够被代码直接处理的message数据结构osip_message_t。与message结构相关的操作包括根据message数据结构的信息安装sip协议规范组装成一个message字符串;message结构的初始化和释放;message结构的拷贝操作;以及从message结构中获取
9、各种已经解析的成员变量的值和设置各个成员变量的值。在message的解析部分,除了message的头之外,还包括了body的解析,涉及到sdp协议,包括对每个sdp字段的解析。在osip源代码包中,设计了一个与同一个请求相关的所有message的集合transaction,在发送或接收到一个新的请求的时候就会生成一个transaction,其中ACK和CANCEL请求是比较特殊的,对于非2xx应答的ACK和初始INVITE请求是属于同一个transaction的,而对于2xx的请求是属于单独的transaction的,所以其重传操作由UAC来控制,而不在INVITE的transaction内部
10、进行控制。CANCEL的请求除了本身建立一个transaction外,根据协议它还会去匹配要CANCEL掉的请求的transaction,如果匹配成功会CANCEL掉相应的transaction。在osip包中同样设计了dialog相关操作,包括dialog的建立,dialog信息的保存,dialog的匹配及删除等操作。其它方面,包括多线程中使用到的锁和信号量及信号,内部使用到的链表,用于事件的队列(需要先进先出策略),一些平台无关的封装,定时器以及常量等的定义。这部分比较简单,而且都是最底层函数,直接封装了系统调用层。3.1 osip的transaction的event的产生transact
11、ion的状态变化是由事件来驱动的,当transaction上有事件产生时,根据事件的类型和当前transaction的状态来处理该event。Transaction上的事件分为两类:一为定时器事件,在设定的定时器超时时会产生相应的定时器事件;另一类为事件驱动事件,如发送一个请求、应答或接收到一个请求、应答,发送一个ACK和接收到一个ACK,即是由报文产生的事件。3.1.1 定时器事件的产生过程ICT、IST、NICT和NIST的定时器的事件产生流程都一样,对于每一个transaction,其定时器是有顺序的,ICT流程中TIMEOUT_B的优先级最高,TIMEOUT_B定时器触发后,会触发ki
12、ll transaction的操作。当transactionff队列中有未处理的事件时,不处理定时器,直接返回,所以在transactionff队列中总的事件的数量是不多的。所有的定时器函数调用底层同一个定时器检查函数_osip_transaction_need_timer_x_event。该函数会先检查该定时器是否启动,判断条件为(timer-tv_sec = -1),如果启动,检查当前时间是否超过定时器中设定的时间,如果是,则产生新的定时器事件。因为定时器没有一个单独的任务,所以是采样轮训的方式检查是否有新的定时器事件产生,而不是根据系统时钟中断进行检测,因此会比较占用系统资源。定时器的启
13、动和修改使用接口osip_gettimeofday和add_gettimeofday。只需要设定定时器的超时时间,即设定了一个新的定时器。取消一个定时器,只需要修改定时器的timer-tv_sev为-1。3.1.2 报文触发的事件包括一个新的invite、response、ack的发送或接收,除了对非2xx的应答ack外,其他的请求和应答都会产生一个新的transaction,并且产生一个新的sipevent事件。3.2 osip 的transaction的event处理流程在sip协议栈中为了更快更好的处理transaction,根据协议栈的描述,划分为四种不同的transaction,分别
14、为ICT、IST、NICT和NIST。四种不同的transaction会有不同的处理流程和状态转换表,以及使用到不同的定时器。ICT、IST、NICT和NIST的状态转换采样注册函数处理方式,为便于管理和使用注册函数,源码中使用了四个全局变量管理四种不同类型transaction的转换表:ict_fsm、ist_fsm、nist_fsm和nist_fsm。osip结构如下:struct osipvoid *application_context;/* User defined Pointer */* list of transactions for ict, ist, nict, nist *
15、/osip_list_t osip_ict_transactions;/* list of ict transactions */osip_list_t osip_ist_transactions;/* list of ist transactions */osip_list_t osip_nict_transactions;/* list of nict transactions */osip_list_t osip_nist_transactions;/*300时,client端发送ACK,当重复接收到该invite的response时,重发该ACK,确保server端在kill tran
16、ction前能接收到ACK。3.2.2 IST的处理流程同ICT的处理流程,处理osip中的osip_ist_transaction链表。IST的相关event的注册处理函数在ist_fsm.c文件和ist.c文件。IST使用了定时器TIMEOUT_G、TIMEOUT_H和TIMEOUT_I。使用方式与ICTL类似,详细见协议栈说明。3.2.3 NICT的处理流程同ICT的处理流程,处理osip中的osip_nict_transaction链表。NICT的相关event的注册处理函数在nict_fsm.c文件和nict.c文件。NICT使用了定时器TIMEOUT_E、TIMEOUT_F和TIM
17、EOUT_K。3.2.4 NIST的处理流程同ICT的处理流程,处理osip中的osip_nist_transaction链表。NIST的相关event的注册处理函数在nist_fsm.c文件和nist.c文件。NIST使用了定时器TIMEOUT_J。3.3 Osip报文的解析3.3.1 sip协议报文的解析整理流程当接收到一个message的时候,需要解析该message,生成一个代码能够处理的数据结构,该结构定义为struct osip_message,该结构定义的一个message的全部相关信息,这些信息主要是供transaction和dialog及dialog的更上一层如call,no
18、tify等的使用。对一个message的解析流程如下图所示:在接收到一个message时,调用函数osip_message_parse进行message的解析。首先调用函数osip_util_replace_all_lws替换掉message中的连续出现的 rnt、rt、nt、rn 、r 、n 为空格,message是以0为结束标志的,message的headers和body之间的分界是以rnrn为标志的,替换只替换到rnrn为止,即只替换headers部分出现的t、r、n。由于sip协议栈规定,每个headers都是起新行,而且新行的头一个字符不为空格或t,所以两个header之间的rn不会
19、被替换掉,替换的只是一个允许multi合并项的header的内部多个值之间的“rnt”或“rn ”。举例如下:有两个header,其中Subject只允许单个值出现, Route允许有多个值出现,而且允许分行,但是分行必须以空格或t开头,而Subject和Route行必需顶格开始,前面是没有空格或t的,osip_util_replace_all_lws函数将Route header value中的两行间的rnt转化为空格,即在逻辑上就成为一行了。Subject: Lunch Route: , 一个message由三部分组成,首先是message的startline部分,该行指明这是一个sip的
20、message,包括sip标志,请求或应答说明,状态值,然后以rn做为和headers的分隔符。该rn不会被osip_util_replace_all_lws替换为空格,如请求的INVITE sip:bob SIP/2.0或应答的SIP/2.0 200 OK,在三个属性之间有且仅有一个空格。起始行的解析由_osip_message_startline_parse进行解析,解析得到message的类型,message的sipversion以及message的status_code,当status_code为初始化值0时,该message为一个请求,否则为应答。请求的startline由_osip
21、_message_startline_parsereq进行解析,得到请求的request_uri;应答的startline由_osip_message_startline_parseresp进行解析。Startline部分的解析是严格安装出现的三个属性的顺序进行解析的,并将解析结果保存在osip_message的结构成员变量中。然后解析messge的headers部分,调用函数 msg_headers_parse。说明见osip的header报文头解析。如果message中在headers之后不是结束符0,则继续解析message的负载部分,调用函数msg_osip_body_parse进行解
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- osip 源代码 框架 详解
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。