osip源代码框架详解.doc

上传人:sk****8 文档编号:3552280 上传时间:2019-06-04 格式:DOC 页数:36 大小:1.08MB
下载 相关 举报
osip源代码框架详解.doc_第1页
第1页 / 共36页
osip源代码框架详解.doc_第2页
第2页 / 共36页
osip源代码框架详解.doc_第3页
第3页 / 共36页
osip源代码框架详解.doc_第4页
第4页 / 共36页
osip源代码框架详解.doc_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、Q/CT XXXX.1-2008中国IMS网络SIP协议规范总体技术要求 - 1 -Osip 协议源代码框架详解Prepared by Mao minghua Date 2009.09.25Reviewed by DateApproved by DateQ/CT XXXX.1-2008中国IMS网络SIP协议规范总体技术要求 - 2 -Revision HistoryVersion Author Reviewed By Comments Issued Date0.1 Mao minghua 描述 osip 协议栈的源代码框架Q/CT XXXX.1-2008中国IMS网络SIP协议规范总体技术要

2、求 - 3 -目录1 符号及缩写 .42 整体描述 .43 OSIP 包的源代码框架解析 .53.1 OSIP 的 TRANSACTION 的 EVENT 的产生 .53.1.1 定时器事件的产生过程 .63.1.2 报文触发的事件 .73.2 OSIP 的 TRANSACTION 的 EVENT 处理流程 .73.2.1 ICT 的处理流程 .83.2.2 IST 的处理流程 .93.2.3 NICT 的处理流程 .93.2.4 NIST 的处理流程 .93.3 OSIP 报文的解析 .103.3.1 sip 协议报文的解析整理流程 .103.3.2 Osip 报文头的解析 .123.3.3

3、 uri 的解析 .143.3.4 添加一个新的协议 header 字段 .153.4 OSIP 的 TRANSACTION 的管理 .163.5 OSIP 中 DIALOG 的管理 .184 EXOSIP 包的源代码框架解析 .194.1 LIB 库的初始化和销毁 .204.2 LIB 库的主处理线程 .234.2.1 2xx 应答的重发处理机制 .244.2.2 Exosip_execute 执行流程 .244.2.2.1 Exosip_read_message 的处理 .264.2.2.2 eXosip_process_response_out_of_transaction 的处理流程:

4、 .294.2.3 eXosip_automatic_action 处理流程 .294.3 CALL 的处理 .304.3.1 创建 Call 的第一个 INVITE.304.3.2 INVITE 的 ACK 应答的创建和发送 .324.3.3 dialog 内的请求的创建和发送 .334.3.4 Dialog 内 answer 的创建和发送 .334.4 REGISTER 的处理 .344.4.1 向一个服务器第一次注册 .354.4.2 调整一个注册的注册超时时间 .354.4.3 发送一个 register 注册 .35Q/CT XXXX.1-2008中国IMS网络SIP协议规范总体技术

5、要求 - 4 -Osip 源代码框架详解1 符号及缩写缩写 英文全称 中文名称ICT Invite Client Transaction Invite 类型的客户端事务IST Invite Server Transaction Invite 类型的服务端事务NICT Not Invite Client Transaction 非 Invite 类型的客户端事务NIST Not Invite Server Transaction 非 Invite 类型的服务端事务IMS IP Multimedia Subsystem IP 多媒体子系统PSVT Packet service video tele

6、phony 分组域可视电话SIP Session Initiation Protocol 会话初始协议UDP User Datagram Protocol 用户数据报协议URL Uniform Resource Locator 统一资源定位器2 整体描述开源代码的 osip 协议栈分为两个源代码包,整个协议栈采用 lib 库的形式,在内部没有使用到任务,采取与 TCP/IP 协议栈一样的策略,所以在使用上需要上层管理任务直接调用 lib 库提供的接口。因为在 Lib 库内部没有使用到像定时器、发送队列等的任务,而同时需要使用到定时器,所以在 lib 库的内部采用轮训遍历的方式不停的检查是否有定

7、时器超时,这在某种程度上会浪费 CPU 的允许时间。同时整个 lib 库实现了对 call, notify 等的管理,为了实现重入,在应用启用多线程的条件下,内部启用的信号量和锁的使用,在下面的分析中不涉及到信号量和锁机制。Lib 库按照 sip 协议栈的层次关系分为两个 lib 包,底层的 osip lib 包实现对单个请求、应答、ACK 的处理,包括 message 的解析、拼装、内容 set 和 get,单个请求形成的transaction 相关操作以及通信两端形成的一个 dialog 的操作。Lib 库上层的 exosip lib 在底层 osip lib 库的实现基础上,实现对 si

8、p 协议整理逻辑上的管理。Exosip 主要关注的是 sip 协议的业务流程,包括 call 的整体管理,notify 的整体管理,publish 的管理, register 的管理,option 的管理,refer 的管理和 subscription 的管理,其中Q/CT XXXX.1-2008中国IMS网络SIP协议规范总体技术要求 - 5 -最主要的为 call 和 register 的管理,这两个为 sip 协议栈必须实现的部分,另几个功能为 sip协议栈扩展部分。从这几个业务的管理流程出发,在业务的底层它们会使用到相似的一些功能,如注册的认证,发送 message,接收 messag

9、e,每个请求和应答形成的 transaction,多个 transaction 组合而成的 dialog。在 message 的处理方面,可以分为两类,一类为发送的 message,因为是主动发送,所以上层管理层知道是什么类型的 message,lib 库直接提供各类接口供使用。一类为接收到的 message,因为不知道是哪种类型,所以需要根据解析出来的 message 的信息来进行处理,这部分的处理在 udp.c 文件中。整个 lib 库的初始化在 exOsip 中介绍。3 Osip 包的源代码框架解析在 osip 源代码包中最主要的包括了 message 的相关操作,其中最重要的为 mes

10、sage 的解析,即从获取到的一个 message 中解析生成一个能够被代码直接处理的 message 数据结构osip_message_t。与 message 结构相关的操作包括根据 message 数据结构的信息安装 sip 协议规范组装成一个 message 字符串;message 结构的初始化和释放; message 结构的拷贝操作;以及从 message 结构中获取各种已经解析的成员变量的值和设置各个成员变量的值。在 message 的解析部分,除了 message 的头之外,还包括了 body 的解析,涉及到sdp 协议,包括对每个 sdp 字段的解析。在 osip 源代码包中,设

11、计了一个与同一个请求相关的所有 message 的集合transaction,在发送或接收到一个新的请求的时候就会生成一个 transaction,其中 ACK 和CANCEL 请求是比较特殊的,对于非 2xx 应答的 ACK 和初始 INVITE 请求是属于同一个transaction 的,而对于 2xx 的请求是属于单独的 transaction 的,所以其重传操作由 UAC 来控制,而不在 INVITE 的 transaction 内部进行控制。CANCEL 的请求除了本身建立一个transaction 外,根据协议它还会去匹配要 CANCEL 掉的请求的 transaction,如果匹

12、配成功会 CANCEL 掉相应的 transaction。在 osip 包中同样设计了 dialog 相关操作,包括 dialog 的建立, dialog 信息的保存,dialog 的匹配及删除等操作。其它方面,包括多线程中使用到的锁和信号量及信号,内部使用到的链表,用于事件的队列( 需要先进先出策略),一些平台无关的封装,定时器以及常量等的定义。这部分比较简单,而且都是最底层函数,直接封装了系统调用层。3.1 osip 的 transaction 的 event 的产生transaction 的状态变化是由事件来驱动的,当 transaction 上有事件产生时,根据事件的类型和当前 tra

13、nsaction 的状态来处理该 event。Q/CT XXXX.1-2008中国IMS网络SIP协议规范总体技术要求 - 6 -Transaction 上的事件分为两类:一为定时器事件,在设定的定时器超时时会产生相应的定时器事件;另一类为事件驱动事件,如发送一个请求、应答或接收到一个请求、应答,发送一个 ACK 和接收到一个 ACK,即是由报文产生的事件。3.1.1 定时器事件的产生过程_ _ o s i p _ i c t _ n e e d _ t i m e r _ b _ e v e n ty e so s i p _ t i m e r s _ i c t _ e x e c u

14、t e ( o s i p _ t * o s i p )_ _ o s i p _ i c t _ n e e d _ t i m e r _ b _ e v e n t_ _ o s i p _ i c t _ n e e d _ t i m e r _ a _ e v e n tH a v e t i m e r b ?n oy e sH a v e t i m e r a ?n oy e sH a v e t i m e r b ?n o退出添加 e v e n t 到 t r a n s a c t i o n 的t r a n s a c t i o n f f 队列ICT、IST

15、 、NICT 和 NIST 的定时器的事件产生流程都一样,对于每一个 transaction,其定时器是有顺序的,ICT 流程中 TIMEOUT_B 的优先级最高, TIMEOUT_B 定时器触发后,会触发 kill transaction 的操作。当 transactionff 队列中有未处理的事件时,不处理定时器,直接返回,所以在 transactionff 队列中总的事件的数量是不多的。所有的定时器函数调用底层同一个定时器检查函数_osip_transaction_need_timer_x_event。该函数会先检查该定时器是否启动,判断条件为(timer-tv_sec = -1),如果

16、启动,检查当前时间是否超过定时器中设定的时间,如果是,则产生新的定时器事件。因为定时器没有一个单独的任务,所以是采样轮训的方式检查是否有新的定时器事件产生,而不是根据系统时钟中断进行检测,因此会比较占用系统资源。定时器的启动和修改使用接口 osip_gettimeofday 和 add_gettimeofday。只需要设定定时器的超时时间,即设定了一个新的定时器。取消一个定时器,只需要修改定时器的 timer-tv_sev 为-1。Q/CT XXXX.1-2008中国IMS网络SIP协议规范总体技术要求 - 7 -3.1.2 报文触发的事件_ e X o s i p _ t r a n s a

17、 c t i o n _ i n i to s i p _ n e w _ o u t g o i n g _ s i p m e s s a ge ( i n v i t e )o s i p _ t r a n s a c t i o n _ a d d _ e v e n t ( t ra n s a c t i o n , s i p e v e n t )包括一个新的 invite、response 、ack 的发送或接收,除了对非 2xx 的应答 ack 外,其他的请求和应答都会产生一个新的 transaction,并且产生一个新的 sipevent 事件。3.2 osip 的 t

18、ransaction 的 event 处理流程在 sip 协议栈中为了更快更好的处理 transaction,根据协议栈的描述,划分为四种不同的 transaction,分别为 ICT、 IST、NICT 和 NIST。四种不同的 transaction 会有不同的处理流程和状态转换表,以及使用到不同的定时器。ICT、IST、NICT 和 NIST 的状态转换采样注册函数处理方式,为便于管理和使用注册函数,源码中使用了四个全局变量管理四种不同类型 transaction 的转换表:ict_fsm、 ist_fsm、nist_fsm 和 nist_fsm。osip 结构如下:struct osi

19、pvoid *application_context; /*300 时,client 端发送ACK,当重复接收到该 invite 的 response 时,重发该 ACK,确保 server 端在 kill tranction前能接收到 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.

20、2.3 NICT 的处理流程同 ICT 的处理流程,处理 osip 中的 osip_nict_transaction 链表。 NICT 的相关 event 的注册处理函数在 nict_fsm.c 文件和 nict.c 文件。NICT 使用了定时器 TIMEOUT_E、TIMEOUT_F 和 TIMEOUT_K。Q/CT XXXX.1-2008中国IMS网络SIP协议规范总体技术要求 - 10 -3.2.4 NIST 的处理流程同 ICT 的处理流程,处理 osip 中的 osip_nist_transaction 链表。 NIST 的相关 event 的注册处理函数在 nist_fsm.c 文

21、件和 nist.c 文件。NIST 使用了定时器 TIMEOUT_J。3.3 Osip 报文的解析3.3.1 sip 协议报文的解析整理流程当接收到一个 message 的时候,需要解析该 message,生成一个代码能够处理的数据结构,该结构定义为 struct osip_message,该结构定义的一个 message 的全部相关信息,这些信息主要是供 transaction 和 dialog 及 dialog 的更上一层如 call,notify 等的使用。对一个 message 的解析流程如下图所示:o s i p _ m e s s a g e _ p a r s e_ o s i

22、p _ m e s s a g e _ p a r s eo s i p _ u t i l _ r e p l a c e _ a l l _ l w s_ _ o s i p _ m e s s a g e _ s t a r t l i n e _ p a r s em s g _ h e a d e r s _ p a r s em s g _ o s i p _ b o d y _ p a r s e在接收到一个 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 不会被替换掉,替换的只是一个允许 multi 合

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。