77范文网 - 专业文章范例文档资料分享平台

osip2协议栈原理分析以及总结

来源:网络收集 时间:2019-03-22 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

OSIP2协议栈学习总结

1、Osip2协议栈介绍

Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点。它的核心特性为sip协议数据的解析和事务的管理。数据包的收发、RTP 流的处理等,并不在Osip2中完成。应用程序使用Osip 时需要单独去实现这些模块。Osip2的缺点是没有很好的上层api封装,使得上层应用在调用协议栈时很破碎;只做到了transaction层次的协议过程解析,缺少call、session、dialog等过程的解析,这也增加了使用的难度。

2、Osip2协议栈体系结构

OSIP主要由解析模块、工具模块和状态机模块构成,其核心是状态机模块.OSIP结构如图所示.

应用程序 SIP解析 SRL解析 SDP解析 状态机模块 有限状态

2.1 语法解析器

libosip库源码src/osipparser2为解析器源码,OSIP解析模块主要用于对SIP请求与响应进行封装与解析处理,分为SIP解析、URL解析与SDP解析完成对sip协议相关字段的构造和解析。比如,将紧凑的存储于内存buffer中的sip 数据解析到清晰定义的数据结构体中,每一个字段代表sip协议中有意义的一个头域。。SIP解析主要负责SIP标题头的解析与封装。SDP解析除了对数据包中SDP会话各类型进行解析外还包含对各类型的初始化和释放操作以及对整个SDP包的一些基本操作。URL解析主要负责对SIP URI中包含的host,port,username, password等信息进行解析与设置。

2.2 有限状态机

SIP状态机模块负责完成对某个事务状态的维持及处理。并且在特定的状态下触发相应的事件或者回调函数。OSIP协议栈的状态机主要分为4类:INVITE客户端事务ICT,非INVITE客户端事务NICT,INVITE服务器端事务IST,非INVITE服务器端事务NIST。

2.3 工具模块

OSIP工具模块分为对话管理工具和SDP协商工具。对话管理工具使用户能够根据RFC3261对dialog进行操作,建立相应dialog结构体。并通过对dialog结构体的添加、删除、查询实现对话管理。SDP协商工具负责向SIP终端用户提供协商codec等功能。

2.4 协议栈框架

框架并不是指代码的某一部分,而是指它的构成形式。主要有三部分:底层套接字接收/发送,模块间通信管道,上层调用api接口。

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

1

DIALOG工具 SDP协商工具 模块间的通信管道包括:transaction的消息管道、jevent的消息管道。Transaction的消息管道是驱动其状态机的部件,通过不断的接收来自底层套接字的远端信令,或者来自上层调用的指令,根据上述的状态机制来驱动这个transaction的运转。Jevent的消息管道是eXosip实现的,用于汇报底层事件,使得调用程序能处理感兴趣的事件。

上层调用的api接口大致有两类:sip协议的调用接口和sdp协议的调用接口。EXosip封装了大部分的sip协议调用接口,一般来说都不需要直接调用osip2的接口函数。接口函数很多,在这里就不详述了,函数定义请参照源代码部分的注释。

2.5 osip2与sip协议层次的关系

LIBOSIP2开发库层次关系

2

3、OSIP关键数据结构及其说明

3.1 osip结构体定义

从该结构体的定义可以看出,osip主要有两部分构成,其一是事务链表,各个状态的事务的事件都挂载在该链表上;其二是回调函数,回调函数中前三个是内部使用,也就是osip 库在处理消息的过程中,如果匹配某个状态,就执行对应的回调函数。用户可以使用这些回调函数显示一些状态,处理一些错误等。最后一个是消息发送回调函数,也就是osip需要发送sip数据包时,就是通过该回调函数完成的。

3.2 transition_t:transition_t结构体定义了事务

state 为事务的状态,type 是事务对应事件的类型,method 为函数指针,定义了当前状态收到type 类型事件后应该执行的动作。next 和parent 为构成链表和队列时的前向和后向指针。这是一个通用的结构体,也就是说,ict、ist、nict,nist 都是用该结构体表示事务的。

3.3 osip_message_config_t:该结构体主要用于sip消息的解析

hname 为sip消息头的某一个域的名称,比如cseq、from、to 或者via 等。setheader 是处理该部分的函数。最后一项是一个标识,当被设置为1时,表明当前头域数据如果无效的话,可以忽略,不影响整个消息头的处理。

3

3.4 osip_transaction

这也是一个事务的定义,与之前的transaction_t 的区别在于:之前定义的事务主要用在状态机处理中,主要包括了事务的状态,事件的类型以及要调用的处理函数;而这里定义的

osip_transaction,则包含了事务相关的所有信息,存放在osip 的事务队列上。该结构体包含了与事务处理相关的信息,包括事务ID,事务队列(其上是事务的事件),事务关联的sip 信息(via、from、to、callid 以及cseq 五元素),关联的sip message(orig_request、last_response、ack),以及该事务在状态机中的上下文信息(ict_context、ist_context、nict_context、nist_context)。osip_transaction_t 是RFC 中的事务的定义,它表示的是一个会话的某个Dialog 之间的某一次消息发送及其

完整的响应,例如invite-100-180-200-ack 这是一个完整的事

务,bye-200这也是一个完整的事务,体现在SIP消息中,就是Via 中的branch 的值相同表示属于一个事务的消息(当然,事务是在Dialog 中的,所以From、To 的tag,Call-id 值也是相同的)。事务对于UAC,UAS 的终端类型不同及消息的不同,分为四类,前面说的invite 的事务,主叫uac中会关联一个ict事务,被叫uas 会关联一个ist事务,而除了invite之外,都归类定义主叫nict,被叫nist。在osip 中,它是靠有限状态机来实现的上述四种事务(osip_fsm_type_tctx_type 中定义)的,它的主要属性值有callid,transactionid,分别来标识dialog和transaction,其中还有一个时间戳birth _time 标识事务创建时间,可由超时处理函数用来判断和决定超时情况下的事务的进行和销毁。它的state 属性也是非常重要的,根据上述的事务类型不同,其值也不同,它是前面提到的状态机的“状态”,在实际状态机的逻辑执行中是一个关键值。

3.5 osip_dialog

osip_dialog 中包含的主要都是与对话相关的sip头中的信息,这些信息可以区分不同的对话,比如call_id,local_tag,remote_tag 等。另外,还指出了对话的类型,是caller 还是callee。osip_dialog_t 是SIP RFC 中的dialog或叫call leg的定义,它标识了uac和uas的一对关系,并一直保持到会话(session) 结束。一个完整的dialog主要包括from,to,callid,fromtag,totag,state,其中fromtag,totag,callid在一个dialog 成功建立后才完整,体现在SIP 消息中,就是From、To 的tag,Call-id 字段的值相同时,这些消息是属于它们对应的一个Dialog 的。例如将要发起invite 时,只有fromtag,callid 填充有值,在收到to远端的响应时,收到

totag 填充到dialog 中,建立成功一个dialog,后继的逻辑均是使用这个dialog 进行处理(如transaction 事务处理)。state表示本dialog的状态,与transaction的state有很大的关联,共同由enum 结构state_t 定义。

4

3.6 osip_message_t

可以看到这是一个非常大的结构体。该结构体用来保存与sip 消息相关的大部分信息。一般都是一个消息头对应其中的一项。比如,像sip 头数据中的call_id、from、to、via、等等,都能在该结构体中找到。在程序中,接收到的sip消息都是以紧凑的方式放在buffer中的,解析器模块的功能就是将其进行解析分类,放到这个结构体的具体对应项上,这样便于在程序中使用。同时,如果需要发送数据时,解析器会根据该结构体中的信息重新将sip信息以紧凑方式放到buffer中供发送模块使用。简单来说,sip协议中定义的各个头,在接收发送处理中都是一个接一个在内存中存放的,而在osip中对其的使用是按照上面的结构体来的,我们在程序中不再需要移动指针从buffer中来找各个sip头数据。

3.7 osip_event

这个结构体用来表示事务上的事件。Type 指出事件的类型,transactionid 指出事务的id,sip 指向上面介绍的osip_message 结构体,也就是事件对应的sip 消息。

4、osip协议栈工作原理

4.1 系统初始化过程

在OSIP工作之前,必须先初始化,主要有以下几个部分: (1)系统资源申请,包括资源和链表的处理 函数:osip_init()

(2)设置系统CALLBACK函数

Callback 函数有很多,但是主要可以分为以下四类: ? ? ? ?

用于发送sip 消息的网络接口。这通过osip 结构体的cb_send_message 函数指针指向。

当一个sip 事务被terminate 的时候调用的回调函数。这由osip 结构体的kill_callbacks 数组保存

当消息通过网络接口发送失败的时候调用的回调函数。这由osip 结构体的 tp_error_callbacks 数组保存。

sip 事务处理过程中需要通知用户的回调函数。这部分由osip 结构体的

msg_callbacks 数组保存。

上面的回调函数中,有一些是必须设置的,比如第一项,有些则是可选的,比如第四项中的部分回调函数。对于可选的回调函数,简单的处理可以是不做任何处理,或者仅仅打印通知信息。

osip_set_cb_send_message ();

//系统的信令发送函数,在这个函数中,要完成信令包的向外发送功能。 osip_set_kill_transaction_callback ();

5

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库osip2协议栈原理分析以及总结在线全文阅读。

osip2协议栈原理分析以及总结.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/536114.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: