当前位置:文档之家› SIP协议相关资料

SIP协议相关资料

Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点,专注于sip底层解析使得它的效率比较高。

eXosip是Osip2的一个扩展协议集,它部分封装了Osip2协议栈,使得它更容易被使用。

一、介绍
Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点,专注于sip底层解析使得它的效率比较高。

但缺点也很明显,首先就是可用性差,没有很好的api封装,使得上层应用在调用协议栈时很破碎;其次,只做到了transaction层次的协议过程解析,缺少call、session、dialog等过程的解析,这也增加了使用的难度;再次,缺少线程并发处理的机制,使得它的处理能力有限。

eXosip是Osip2的一个扩展协议集,它部分封装了Osip2协议栈,使得它更容易被使用。

eXosip 增加了call、dialog、registration、subscription等过程的解析,使得实用性更强。

但是eXosip 局限于UA的实现,使得它用于registrar、sip server等应用时极其不容易。

另外,它并没有增加线程并发处理的机制。

而且只实现了音频支持,缺少对视频和其它数据格式的支持。

综合来说,Osip2加上eXosip协议栈仍然是个实现Sip协议不错的选择。

当然需要根据不同的需求来增加更多的内容。

二、Osip2协议栈的组成
Osip2协议栈大致可以分为三部分:sip协议的语法分析、sip协议的过程分析和协议栈框架。

1、Sip协议的语法分析:
主要是osipparser2部分,目前支持RFC3261和RFC3265定义的sip协议消息,包括INVITE、ACK、OPTIONS、CANCEL、BYE、SUBSCRIBE、NOTIFY、MESSAGE、REFER和INFO。

不支持RFC3262定义的PRACK。

遵循RFC3264关于SDP的offer/answer模式。

带有SDP的语法分析。

支持MD5加解密算法。

支持Authorization、www_authenticate和proxy_authenticate。

2、Sip协议的过程分析:
主要是osip2部分,基于RFC3261、RFC3264和RFC3265的sip协议描述过程,围绕transaction 这一层来实现sip的解析。

Transaction是指一个发送方和接收方的交互过程,由请求和应答组成。

请求分为Invite类型和Non-Invite类型。

应答分为响应型的应答和确认型的应答。

响应型的应答是指这个应答仅代表对方收到请求。

请求经过处理后都必须返回确认型的应答。

响应型的应答有1xx,确认型的应答包括2xx、3xx、4xx、5xx和6xx。

一个transaction由一个请求和一个或多个响应型应答、一个确认型应答组成。

Transaction根据请求的不同和发送/接收的不同可以分为四类:ict、nict、ist和nist。

Ict是指Invite client transaction,就是会话邀请的发起方。

Nict是指Non-Invite client transaction,是指非邀请会话的发起方。

Ist是指Invite server tranaction,是指会话邀请的接收方。

Nist是指Non-Invite server transaction,是指非邀请会话的接收方。

每种类型的transaction都有自己相应的状态机,Osip2协议栈根据状态机来处理所有的sip 事件,所以这部分就是整个协议栈的核心。

但是因为Osip2只做到transaction这一层,所以它可以忽略掉call、registration等应用的复杂性,显得相当简单,这就使得需要使用它的应用必须要自己处理应用的逻辑。

必须注意的一点是,transaction的资源在Osip里是由协议栈负责释放的,但是在Osip2里改成由使用的应用负责释放。

3、协议栈框架:
框架并不是指代码的某一部分,而是指它的构成形式。

主要有三部分:底层套接字接收/发送,模块间通信管道,上层调用api接口。

Osip2并不实现底层套接字的接收/发送,由eXosip实现,现在只支持UDP的链路连接。

模块间的通信管道包括:transaction的消息管道、jevent的消息管道。

Transaction的消息管道是驱动其状态机的部件,通过不断的接收来自底层套接字的远端信令,或者来自上层调用的指令,根据上述的状态机制来驱动这个transaction的运转。

Jevent的消息管道是eXosip 实现的,用于汇报底层事件,使得调用程序能处理感兴趣的事件。

上层调用的api接口大致有两类:sip协议的调用接口和sdp协议的调用接口。

EXosip封装了大部分的sip协议调用接口,一般来说都不需要直接调用osip2的接口函数。

接口函数很多,在这里就不详述了,函数定义请参照源代码部分的注释。

三、eXosip协议栈的分析
eXosip是Osip2协议栈的封装和调用。

它实现了作为单个sip终端的大部分功能,如register、call、subscription等。

EXosip使用UDP socket套接字实现底层sip协议的接收/发送。

并且封装了sip消息的解释器。

EXosip使用定时轮循的方式调用Osip2的transaction处理函数,这部分是协议栈运转的核心。

透过添加/读取transaction消息管道的方式,驱动transaction的状态机,使得来自远端的sip 信令能汇报给调用程序,来自调用程序的反馈能通过sip信令回传给远端。

EXosip增加了对各个类型transaction的超时处理,确保所有资源都能循环使用,不会被耗用殆尽。

EXosip使用jevent消息管道来向上通知调用程序底层发生的事件,调用程序只要读取该消息管道,就能获得感兴趣的事件,进行相关的处理。

EXosip里比较重要的应用有j_calls、j_subscribes、j_notifies、j_reg、j_pub、osip_negotiation 和authinfos。

J_calls对应呼叫链表,记录所有当前活动的呼叫。

J_reg对应注册链表,记录所有当前活动的注册信息。

Osip_negotiation记录本地的能力集,用于能力交换。

Authinfos 记录需要的认证信息。

四、总结
本文是从使用的角度去阐述分析Osip2和eXosip协议栈,并不涉及很多的细节,需要进一步了解协议栈的结构和实现,可参考《osip》一文。

分析了开源SIP协议栈oSIP的运行机制。

在oSIP基础上,设计实现了一个基于S3C2410A微处理器平台,使用WinCE操作系统的嵌入式SIP 终端。

1、引言
目前,IETF的SIP协议(Session Initiate Protocol, 会话初始协议)已获得业界越来越多的关注和支持,正逐步成为下一代网络(NGN)中的核心协议
之一[1]。

SIP协议相对简单、易于实现、可扩展性强、更适合IP网络,被广泛的用于VoIP系统的组建[2]。

oSIP及其扩展eXosip作为开源的SIP协议栈,以其结构简单、功能丰富、易于移植等优点成为在嵌入式系统上构建VoIP应用的首选。

本文分析了oSIP协议栈的运行机制,设计实现了将oSIP协议栈移
植到嵌入式操作系统并以此为基础开发嵌入式SIP客户端的方案。

2、oSIP协议栈
2.1 SIP协议
SIP采用C/S模式的工作方式,包含两类元素:SIP用户代理(User Agent, UA)和SIP服务器。

根据用户代理在会话中扮演的角色不同又可分为用户代理客户机(User Agent Client, UAC)和用户代理服务器(User Agent Server, UAS),前者发起呼叫请求,后者响应呼叫请求。

2.2 oSIP协议栈
oSIP是遵循IETF标准,使用ANSI C编写,源代码开放的SIP协议栈。

oSIP主要有下列优点:
(1)结构小巧简单,只有400K左右,适合在嵌入式系统上应用;
(2)可移植性好,已被成功的应用于Solaris、HP Unix、VxWorks、Windows和GNU/Linux[3] (2.2.16和2.4.7)等系统中;
(3)工作稳定、兼容性强。

oSIP主要由解析模块、工具模块和状态机模块构成,其核心是状态机模块[4](如图1所示)。

图1 oSIP结构
解析模块完成对SIP请求和响应进行封装与解析处理。

解析模块又可分为SIP解析、SDP解析与URL解析。

工具模块主要提供一些处理工具用于对话管理和SDP协商。

状态机模块负责对某个事务(如注册过程、呼叫过程等)状态的维持及处理,并在特定的状态下触发响应的事件或回调函数。

根据RFC描述中关于SIP协议事务层的定义,oSIP协议栈有4种状态机:客户端邀请事务(ICT),客户端非邀请事务(NICT),服务器端邀请事务(IST),服务器端非邀请事务(NIST)。

前两种状态机是由客户端发起的,后两种状态机是由服务器发起的,这4种状态机涵盖了SIP的各种事务类型。

其中ICT(如图2所示)是SIP客户端中最常见的事务。

相关主题