Q/CT XXXX.1-2008
Osip协议源代码框架详解
Prepared by Reviewed by Approved by Mao minghua Date Date Date 2009.09.25
中国IMS网络SIP协议规范总体技术要求 - 1 -
Q/CT XXXX.1-2008
Revision History
Version 0.1 Author Mao minghua Reviewed By Comments 描述osip协议栈的源代码框架 Issued Date
中国IMS网络SIP协议规范总体技术要求 - 2 -
Q/CT XXXX.1-2008
目录
1 2 3 3.1 3.1.1 3.1.2 3.2 3.2.1 3.2.2 3.2.3 3.2.4 3.3 3.3.1 3.3.2 3.3.3 3.3.4 3.4 3.5 4 4.1 4.2 4.2.1 4.2.2 4.2.2.1 4.2.2.2 4.2.3 4.3 4.3.1 4.3.2 4.3.3 4.3.4 4.4 4.4.1 4.4.2 4.4.3
符号及缩写 ................................................................................................................... 4 整体描述 ....................................................................................................................... 4 OSIP包的源代码框架解析 ......................................................................................... 5 OSIP的TRANSACTION的EVENT的产生 ...................................................................... 5 定时器事件的产生过程 ............................................................................................... 6 报文触发的事件 ........................................................................................................... 7 OSIP 的TRANSACTION的EVENT处理流程 ................................................................. 7 ICT的处理流程 ........................................................................................................... 8 IST的处理流程 ............................................................................................................ 9 NICT的处理流程 ........................................................................................................ 9 NIST的处理流程 ......................................................................................................... 9 OSIP报文的解析 ........................................................................................................ 10 sip协议报文的解析整理流程 ................................................................................... 10 Osip报文头的解析 .................................................................................................... 12 uri的解析 ................................................................................................................... 14 添加一个新的协议header字段 ................................................................................ 15 OSIP的TRANSACTION的管理 .................................................................................... 16 OSIP中DIALOG的管理 ............................................................................................... 18 EXOSIP包的源代码框架解析 .................................................................................. 19 LIB库的初始化和销毁 .............................................................................................. 20 LIB库的主处理线程 .................................................................................................. 23 2xx应答的重发处理机制 .......................................................................................... 24 Exosip_execute执行流程 .......................................................................................... 24 Exosip_read_message的处理 .................................................................................... 26 eXosip_process_response_out_of_transaction的处理流程: ................................... 29 eXosip_automatic_action处理流程 ........................................................................... 29 CALL的处理 ............................................................................................................... 30 创建Call的第一个INVITE ...................................................................................... 30 INVITE的ACK应答的创建和发送 ........................................................................ 32 dialog内的请求的创建和发送 .................................................................................. 33 Dialog内answer的创建和发送 ................................................................................ 34 REGISTER的处理 ........................................................................................................ 35 向一个服务器第一次注册 ......................................................................................... 35 调整一个注册的注册超时时间 ................................................................................. 35 发送一个register注册 ............................................................................................... 36
中国IMS网络SIP协议规范总体技术要求 - 3 -
Q/CT XXXX.1-2008
Osip源代码框架详解
1
符号及缩写 缩写 ICT IST NICT NIST IMS PSVT SIP UDP URL 英文全称 Invite Client Transaction Invite Server Transaction Not Invite Client Transaction Not Invite Server Transaction IP Multimedia Subsystem Packet service video telephony Session Initiation Protocol User Datagram Protocol Uniform Resource Locator 中文名称 Invite类型的客户端事务 Invite类型的服务端事务 非Invite类型的客户端事务 非Invite类型的服务端事务 IP多媒体子系统 分组域可视电话 会话初始协议 用户数据报协议 统一资源定位器 2 整体描述
开源代码的osip协议栈分为两个源代码包,整个协议栈采用lib库的形式,在内部没有
使用到任务,采取与TCP/IP协议栈一样的策略,所以在使用上需要上层管理任务直接调用lib库提供的接口。因为在Lib库内部没有使用到像定时器、发送队列等的任务,而同时需要使用到定时器,所以在lib库的内部采用轮训遍历的方式不停的检查是否有定时器超时,这在某种程度上会浪费CPU的允许时间。同时整个lib库实现了对call, notify等的管理,为了实现重入,在应用启用多线程的条件下,内部启用的信号量和锁的使用,在下面的分析中不涉及到信号量和锁机制。
Lib库按照sip协议栈的层次关系分为两个lib包,底层的osip lib包实现对单个请求、应答、ACK的处理,包括message的解析、拼装、内容set和get,单个请求形成的transaction相关操作以及通信两端形成的一个dialog的操作。
Lib库上层的exosip lib在底层osip lib库的实现基础上,实现对sip协议整理逻辑上的管理。Exosip主要关注的是sip协议的业务流程,包括call的整体管理,notify的整体管理, publish的管理,register的管理,option的管理,refer的管理和subscription的管理,其中最主要的为call和register的管理,这两个为sip协议栈必须实现的部分,另几个功能为sip协议栈扩展部分。从这几个业务的管理流程出发,在业务的底层它们会使用到相似的一些功能,如注册的认证,发送message,接收message,每个请求和应答形成的transaction,多个
中国IMS网络SIP协议规范总体技术要求 - 4 -
Q/CT XXXX.1-2008
transaction组合而成的dialog。
在message的处理方面,可以分为两类,一类为发送的message,因为是主动发送,所以上层管理层知道是什么类型的message,lib库直接提供各类接口供使用。一类为接收到的message,因为不知道是哪种类型,所以需要根据解析出来的message的信息来进行处理,这部分的处理在udp.c文件中。
整个lib库的初始化在exOsip中介绍。 3
Osip包的源代码框架解析
在osip源代码包中最主要的包括了message的相关操作,其中最重要的为message的解析,即从获取到的一个message中解析生成一个能够被代码直接处理的message数据结构-——osip_message_t。与message结构相关的操作包括根据message数据结构的信息安装sip协议规范组装成一个message字符串;message结构的初始化和释放;message结构的拷贝操作;以及从message结构中获取各种已经解析的成员变量的值和设置各个成员变量的值。在message的解析部分,除了message的头之外,还包括了body的解析,涉及到sdp协议,包括对每个sdp字段的解析。
在osip源代码包中,设计了一个与同一个请求相关的所有message的集合——transaction,在发送或接收到一个新的请求的时候就会生成一个transaction,其中ACK和CANCEL请求是比较特殊的,对于非2xx应答的ACK和初始INVITE请求是属于同一个transaction的,而对于2xx的请求是属于单独的transaction的,所以其重传操作由UAC来控制,而不在INVITE的transaction内部进行控制。CANCEL的请求除了本身建立一个transaction外,根据协议它还会去匹配要CANCEL掉的请求的transaction,如果匹配成功会CANCEL掉相应的transaction。
在osip包中同样设计了dialog相关操作,包括dialog的建立,dialog信息的保存,dialog的匹配及删除等操作。
其它方面,包括多线程中使用到的锁和信号量及信号,内部使用到的链表,用于事件的队列(需要先进先出策略),一些平台无关的封装,定时器以及常量等的定义。这部分比较简单,而且都是最底层函数,直接封装了系统调用层。 3.1 osip的transaction的event的产生
transaction的状态变化是由事件来驱动的,当transaction上有事件产生时,根据事件的类型和当前transaction的状态来处理该event。
Transaction上的事件分为两类:一为定时器事件,在设定的定时器超时时会产生相应的定时器事件;另一类为事件驱动事件,如发送一个请求、应答或接收到一个请求、应答,发送一个ACK和接收到一个ACK,即是由报文产生的事件。
中国IMS网络SIP协议规范总体技术要求 - 5 -