osip源代码框架详解上课讲义.doc
《osip源代码框架详解上课讲义.doc》由会员分享,可在线阅读,更多相关《osip源代码框架详解上课讲义.doc(70页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Good is good, but better carries it.精益求精,善益求善。osip源代码框架详解-Osip协议源代码框架详解PreparedbyMaominghuaDate2009.09.25ReviewedbyDateApprovedbyDateRevisionHistoryVersionAuthorReviewedByCommentsIssuedDate0.1Maominghua描述osip协议栈的源代码框架目录1符号及缩写42整体描述43OSIP包的源代码框架解析53.1osip的transaction的event的产生53.1.1定时器事件的产生过程63.1.2报文触
2、发的事件73.2osip的transaction的event处理流程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.2Exo
3、sip_execute执行流程244.2.2.1Exosip_read_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调整一个注册的注册超时时间
4、354.4.3发送一个register注册35Osip源代码框架详解符号及缩写缩写英文全称中文名称ICTInviteClientTransactionInvite类型的客户端事务ISTInviteServerTransactionInvite类型的服务端事务NICTNotInviteClientTransaction非Invite类型的客户端事务NISTNotInviteServerTransaction非Invite类型的服务端事务IMSIPMultimediaSubsystemIP多媒体子系统PSVTPacketservicevideotelephony分组域可视电话SIPSessionI
5、nitiationProtocol会话初始协议UDPUserDatagramProtocol用户数据报协议URLUniformResourceLocator统一资源定位器1 整体描述开源代码的osip协议栈分为两个源代码包,整个协议栈采用lib库的形式,在内部没有使用到任务,采取与TCP/IP协议栈一样的策略,所以在使用上需要上层管理任务直接调用lib库提供的接口。因为在Lib库内部没有使用到像定时器、发送队列等的任务,而同时需要使用到定时器,所以在lib库的内部采用轮训遍历的方式不停的检查是否有定时器超时,这在某种程度上会浪费CPU的允许时间。同时整个lib库实现了对call,notify等
6、的管理,为了实现重入,在应用启用多线程的条件下,内部启用的信号量和锁的使用,在下面的分析中不涉及到信号量和锁机制。Lib库按照sip协议栈的层次关系分为两个lib包,底层的osiplib包实现对单个请求、应答、ACK的处理,包括message的解析、拼装、内容set和get,单个请求形成的transaction相关操作以及通信两端形成的一个dialog的操作。Lib库上层的exosiplib在底层osiplib库的实现基础上,实现对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文件中。2 整个lib库的初始化在exOsip中介绍。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的匹配及删除等操作。其它方面,包括多线程中使用到的锁和信号量及信号,内部使用到的链表,用于事件的队列(需要先进先出策略),一些平台无关的封装,定时器以及常量等的定义。这部分比较简单,而且都是最底层函数,直接封装了系统调用层。2.1 osip的transaction的event的产生transa
11、ction的状态变化是由事件来驱动的,当transaction上有事件产生时,根据事件的类型和当前transaction的状态来处理该event。2.1.1 Transaction上的事件分为两类:一为定时器事件,在设定的定时器超时时会产生相应的定时器事件;另一类为事件驱动事件,如发送一个请求、应答或接收到一个请求、应答,发送一个ACK和接收到一个ACK,即是由报文产生的事件。定时器事件的产生过程ICT、IST、NICT和NIST的定时器的事件产生流程都一样,对于每一个transaction,其定时器是有顺序的,ICT流程中TIMEOUT_B的优先级最高,TIMEOUT_B定时器触发后,会触发
12、killtransaction的操作。当transactionff队列中有未处理的事件时,不处理定时器,直接返回,所以在transactionff队列中总的事件的数量是不多的。所有的定时器函数调用底层同一个定时器检查函数_osip_transaction_need_timer_x_event。该函数会先检查该定时器是否启动,判断条件为(timer-tv_sec=-1),如果启动,检查当前时间是否超过定时器中设定的时间,如果是,则产生新的定时器事件。因为定时器没有一个单独的任务,所以是采样轮训的方式检查是否有新的定时器事件产生,而不是根据系统时钟中断进行检测,因此会比较占用系统资源。定时器的启动
13、和修改使用接口osip_gettimeofday和add_gettimeofday。只需要设定定时器的超时时间,即设定了一个新的定时器。取消一个定时器,只需要修改定时器的timer-tv_sev为-1。2.2 报文触发的事件包括一个新的invite、response、ack的发送或接收,除了对非2xx的应答ack外,其他的请求和应答都会产生一个新的transaction,并且产生一个新的sipevent事件。osip的transaction的event处理流程在sip协议栈中为了更快更好的处理transaction,根据协议栈的描述,划分为四种不同的transaction,分别为ICT、IST
14、、NICT和NIST。四种不同的transaction会有不同的处理流程和状态转换表,以及使用到不同的定时器。ICT、IST、NICT和NIST的状态转换采样注册函数处理方式,为便于管理和使用注册函数,源码中使用了四个全局变量管理四种不同类型transaction的转换表:ict_fsm、ist_fsm、nist_fsm和nist_fsm。osip结构如下:structosipvoid*application_context;/*UserdefinedPointer*/*listoftransactionsforict,ist,nict,nist*/osip_list_tosip_ict_tr
15、ansactions;/*listoficttransactions*/osip_list_tosip_ist_transactions;/*listofisttransactions*/osip_list_tosip_nict_transactions;/*listofnicttransactions*/osip_list_tosip_nist_transactions;/*300时,client端发送ACK,当重复接收到该invite的response时,重发该ACK,确保server端在killtranction前能接收到ACK。2.2.2 IST的处理流程同ICT的处理流程,处理osi
16、p中的osip_ist_transaction链表。IST的相关event的注册处理函数在ist_fsm.c文件和ist.c文件。IST使用了定时器TIMEOUT_G、TIMEOUT_H和TIMEOUT_I。使用方式与ICTL类似,详细见协议栈说明。2.2.3 NICT的处理流程同ICT的处理流程,处理osip中的osip_nict_transaction链表。NICT的相关event的注册处理函数在nict_fsm.c文件和nict.c文件。NICT使用了定时器TIMEOUT_E、TIMEOUT_F和TIMEOUT_K。2.2.4 NIST的处理流程同ICT的处理流程,处理osip中的osi
17、p_nist_transaction链表。NIST的相关event的注册处理函数在nist_fsm.c文件和nist.c文件。NIST使用了定时器TIMEOUT_J。2.3 Osip报文的解析2.3.1 sip协议报文的解析整理流程当接收到一个message的时候,需要解析该message,生成一个代码能够处理的数据结构,该结构定义为structosip_message,该结构定义的一个message的全部相关信息,这些信息主要是供transaction和dialog及dialog的更上一层如call,notify等的使用。对一个message的解析流程如下图所示:在接收到一个message时
18、,调用函数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不会被替换掉,替换的只是一个允许multi合并项的header的内部多个值之间的“rnt”或“rn”
19、。举例如下:有两个header,其中Subject只允许单个值出现,Route允许有多个值出现,而且允许分行,但是分行必须以空格或t开头,而Subject和Route行必需顶格开始,前面是没有空格或t的,osip_util_replace_all_lws函数将Routeheadervalue中的两行间的rnt转化为空格,即在逻辑上就成为一行了。Subject:LunchRoute:,一个message由三部分组成,首先是message的startline部分,该行指明这是一个sip的message,包括sip标志,请求或应答说明,状态值,然后以rn做为和headers的分隔符。该rn不会被os
20、ip_util_replace_all_lws替换为空格,如请求的INVITEsip:bobSIP/2.0或应答的SIP/2.0200OK,在三个属性之间有且仅有一个空格。起始行的解析由_osip_message_startline_parse进行解析,解析得到message的类型,message的sipversion以及message的status_code,当status_code为初始化值0时,该message为一个请求,否则为应答。请求的startline由_osip_message_startline_parsereq进行解析,得到请求的request_uri;应答的startlin
21、e由_osip_message_startline_parseresp进行解析。Startline部分的解析是严格安装出现的三个属性的顺序进行解析的,并将解析结果保存在osip_message的结构成员变量中。然后解析messge的headers部分,调用函数msg_headers_parse。说明见osip的header报文头解析。如果message中在headers之后不是结束符0,则继续解析message的负载部分,调用函数msg_osip_body_parse进行解析。Message的body解析首先查询headers头解析中保存的content即body的属性:content_typ
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- osip 源代码 框架 详解 上课 讲义
限制150内