EXOSIP2协议栈原理分析以及总结
libexosip tls用法

libexosip是一个开源的SIP协议栈,用于构建基于SIP协议的通信应用程序。
其中,libexosip提供了对TLS(Transport Layer Security)安全传输协议的支持,可以保障SIP信令的安全传输。
本文将介绍libexosip中TLS的使用方法,包括TLS的配置和使用步骤。
一、TLS的配置1.1、安装OpenSSL在使用libexosip进行TLS通信之前,首先需要安装OpenSSL库。
OpenSSL是一个强大的安全套接字层密码库,提供了数据加密、数据完整性验证和身份验证等功能。
在Linux系统上,可以通过包管理工具直接安装OpenSSL库:```shell$ sudo apt-get install libssl-dev```在Windows系统上,可以通过从OpenSSL全球信息湾下载相应的安装包,并按照提示进行安装。
1.2、配置libexosip在使用libexosip进行TLS通信之前,需要在编译libexosip时启用TLS支持。
可以通过在configure脚本中添加--enable-tls选项来启用TLS支持:```shell$ ./configure --enable-tls$ make$ make install```通过以上操作,就可以在libexosip中启用TLS支持了。
二、TLS的使用步骤2.1、加载证书在使用libexosip进行TLS通信时,需要加载服务器端的证书和私钥。
证书用于验证服务器的身份,私钥则用于对通信进行加密。
在libexosip中,可以通过以下代码加载证书和私钥:```cosip_tls_ctx_t *tls_ctx;tls_ctx = osip_tls_ctx_new (osip, "path_to_certificate","path_to_private_key");```其中,osip是osip库的句柄,"path_to_certificate"是服务器端证书的路径,"path_to_private_key"是服务器端私钥的路径。
SIP 协议学习总结

SIP 协议学习1初识SIP1.1 SIP定义Session Initiation Protocol会话初始协议是基于文本的信令协议。
是一个在IP网络上进行多媒体通信的应用层控制协议。
用来创建、修改和终结一个或多个参与者参加的会话进程。
SIP协议可用于发起会话,也可用于邀请成员加入已经用其他方式建立的会话。
SIP基于文本编解码。
采用事务机制,每一个请求出发Server的操作方法,请求和响应构成一个事务。
事务间彼此独立。
SIP独立于底层传输协议。
SIP协议承载在IP网,传输层协议可用TCP或UDP,推荐首选UDP。
SIP支持5方面功能:1.用户定位:确定通信所用的端系统位置2.用户能力交换:确定所用的媒体类型和媒体参数3.用户可用性判定:确定被叫方是否空闲和是否愿意加入通信4.呼叫建立:邀请和提示被叫,在主被叫之间传递呼叫参数5.呼叫处理:包括呼叫终结和呼叫转移等1.2 SIP特点1.一个正在发展和不断研究中的协议。
2.简练、开放、兼容和可扩展等原则。
3.充分注意到因特网开放而复杂的网络环境下的安全问题。
4.充分考虑了对PSTN的各种业务,包括IN(Intelligent Network智能网)业务和ISDN业务(Integrated Services Digital Network综合业务数字网)的支持。
2SIP协议2.1 SIP协议结构1.最底层的是它的语法和编码层。
编码方式是采用扩展的Backus-Naur Form grammar(BNF范式)。
2.第二层是传输层。
定义了一个客户端如何发送请求和接收应答,以及一个服务器如何接收请求和发送应答。
所有的SIP要素都包含一个通讯层。
3.第三层是事务层。
事务层处理应用服务层的重发,匹配请求的应答,以及应用服务层的超时。
任何一个用户代理客户端(user agent client UAC)完成的事情都是由一组事务构成的。
有状态的代理服务器包含一个事务层;无状态的代理服务器不包含事务层。
SIP协议相关资料(doc 9页)

SIP协议相关资料(doc 9页)Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点,专注于sip底层解析使得它的效率比较高。
eXosip是Osip2的一个扩展协议集,它部分封装了Osip2协议栈,使得它更容易被使用。
一、介绍Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点,专注于sip底层解析使得它的效率比较高。
但缺点也很明显,首先就是可用性差,没有很好的api封装,使得上层应用在调用协议栈时很破碎;其次,只做到了transaction 层次的协议过程解析,缺少call、session、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由一个请求和一个或多个响应型应答、一个确认型应答组成。
基于eXosip协议栈的SIP电话的研究与实现

控 制 系统 在 V OI P系 统 实 现 、 多媒体通 信系统 、 无 线 语 音 通 信 领 域 应 用 更 加 广 泛 ,且 大 多 数 系 统 均 采 用 S I P协 议 作 为 其 信 令 控 制协议 , 因此 , S I P协 议 栈 的 选 择 和 应 用 就 显 得 尤 为 重 要 。 e X o s i p 2是一 个 源 码公 开 的 、使 用 标 准 C 编 写 的 免 费 协 议
e xp er i me n t i s d on e, an d go t t h e des i r ed r e su l t s
Ke y wor ds : Sl P, oSI P, eX os i p Pr o t o co l S t a ck , Sl P ph on e
1 4
基于 e X o s i p协 议 栈 的 S I P电 话 的 研 究 与 实 现
基于 e X o s i p协议栈的 S I P电话的研究与实现
Re s e a r c h a n d I mp l e me n t a t i o n o f SI P P h o n e Ba s e d o n e X o s i p P r o t o c o l S t a c k
S I P终 端 的 大 部 分 功 能 , 且 结构 简 单 小巧 、 灵活性强 、 可 扩展 性 强 , 更加 的 智 能化 。 简单 介 绍 了 o S I P协 议 栈 及 e X o s i p协议 栈
的基 本 内容 , 并 在 此 基 础 上 详 细 介 绍 了嵌 入 式 S I P 电话 的 硬 件 及 软 件 设 计 过 程 , 并 进 行 试 验 得 到 了预 期 的 效 果 。
SIP协议原理及应用

Sip:alice@10.1.2.3
Sip:alice@;method=REGISTER
一.4
描述会话信息的协议,包括会话的地址、时间、媒体和建立等信息
一.4.1
会话名和目的
会话激活的时间段
构成会话的媒体
接收这些媒体所需的信息(地址、端口、格式)
会话所用的带宽信息(任选)
会话负责人的联系信息(任选)
二.1.1
SIP协议是一个Client/Sever协议。SIP端系统包括用户代理客户机(UAC)和用户代理服务器(UAS),其中UAC的功能是向UAS发起SIP请求消息,UAS的功能是对UAC发来的SIP请求返回相应的应答。在SS(SoftSwitch)中,可以把控制中心SoftSwitch看成一个SIP端系统。
Application Server:运行和管理增值业务的平台,与SoftSwitch用SIP进行通信。
Media Server:提供媒体和语音资源的平台,同时与Media Gateway进行RTP流的传输。
使用SIP作为SoftSwitch和Application Server之间的接口,可以实现呼叫控制的所有功能。同时SIP已被SoftSwitch接受为通用的接口标准,从而可以实现SoftSwitch之间的互连。
libexosip tls用法 -回复

libexosip tls用法-回复如何使用libexosip进行TLS连接?libexosip是一个开源的SIP协议栈,用于构建基于SIP的通信应用程序。
在实际的通信过程中,有时候需要通过TLS(Transport Layer Security)进行加密和认证,以确保通信的安全性。
本文将详细介绍如何使用libexosip实现TLS连接。
# 步骤1:准备工作首先,我们需要安装libosip2和libexosip2这两个库。
这两个库是libexosip的依赖库,我们可以从官方网站上下载并按照指导进行安装。
# 步骤2:生成证书为了使用TLS进行通信,我们需要为服务器和客户端生成证书。
可以使用openssl命令来生成证书,以下是生成证书的示例命令:openssl req -x509 -nodes -newkey rsa:2048 -keyout server.key -out server.crt -days 365这个命令将生成一个自签名的证书,有效期为365天。
生成的密钥和证书文件用于配置服务器。
# 步骤3:配置服务器在服务器端,我们需要进行一些配置,以便支持TLS连接。
例如,我们需要指定服务器使用的端口号、证书和密钥文件等。
以下是一个简单的配置示例:cpp#include <eXosip2/eXosip.h>int main() {exosip_init();osip_init();创建一个eXosip contextosip_exosip_t *ctx = eXosip_malloc();设置协议栈使用的IP地址和端口号eXosip_listen_addr(ctx, IPPROTO_TCP, NULL, 5061, AF_INET, 0);eXosip_listen_addr(ctx, IPPROTO_UDP, NULL, 5060, AF_INET, 0);加载证书和密钥eXosip_set_option(ctx, EXOSIP_TLS_SERVER_CERT_FILE, "server.crt");eXosip_set_option(ctx, EXOSIP_TLS_SERVER_PRIV_FILE, "server.key");启用TLS连接eXosip_set_option(ctx, EXOSIP_TLS_ENABLE, 1);主循环while (1) {eXosip_event_t *je = NULL;int ret = eXosip_event_wait(ctx, 0, 100);if (ret < 0) {break;}eXosip_lock(ctx);do {je = eXosip_event_get(ctx);处理事件} while (je != NULL);eXosip_unlock(ctx);}eXosip_quit(ctx);return 0;}在上面的示例中,我们使用了eXosip_listen_addr()函数来指定协议栈监听的地址和端口号,并使用eXosip_set_option()函数加载证书和密钥文件。
sip协议原理分析及总结

sip协议原理分析及总结SIP协议学习总结1、SIP协议定义SIP(Session Initiation Protocol,即初始会话协议)是IETF提出的基于⽂本编码的IP电话/多媒体会议协议。
⽤于建⽴、修改并终⽌多媒体会话。
SIP 协议可⽤于发起会话,也可以⽤于邀请成员加⼊已经⽤其它⽅式建⽴的会话。
多媒体会话可以是点到点的话⾳通信或视频通信,也可以是多点参与的话⾳或视频会议等。
SIP协议透明地⽀持名字映射和重定向服务,便于实现ISDN,智能⽹以及个⼈移动业务。
SIP协议可以⽤多点控制单元(MCU)或全互连的⽅式代替组播发起多⽅呼叫。
与PSTN 相连的IP电话⽹关也可以⽤SIP协议来建⽴普通电话⽤户之间的呼叫。
SIP协议在IETF多媒体数据及控制体系协议栈结构的位置H.323SIP RTSP RSVP RTCPH.263 etc.RTP TCP UDPIPPPP Sonet AAL3/4AAL5ATM EthernetPPPV.34SIP协议⽀持多媒体通信的五个⽅⾯:◆⽤户定位:确定⽤于通信的终端系统;◆⽤户能⼒:确定通信媒体和媒体的使⽤参数;◆⽤户有效性:确定被叫加⼊通信的意愿;◆会话建⽴:建⽴主叫和被叫的呼叫参数;◆会话管理:包括呼叫转移和呼叫终⽌;SIP协议的结构SIP是⼀个分层的协议,也就是说SIP协议由⼀组相当⽆关的处理层次组成,这些层次之间只有松散的关系。
SIP最底层的是它的语法和编码层。
编码⽅式是采⽤扩展的Backus-Naur Form grammar (BNF范式)。
第⼆层是传输层。
它定义了⼀个客户端发送请求和接收应答的⽅式,以及⼀个服务器接收请求和发送应答的⽅式。
所有的SIP要素都包含⼀个通讯层。
第三层是事务层。
事务是SIP的基本组成部分。
⼀个事务是UAC向UAS发送的⼀个请求以及UAS向UAC发送的⼀系列应答。
事务层处理应⽤服务层的重发,匹配请求的应答,以及应⽤服务层的超时。
exosip2 交叉编译

exosip2 交叉编译
exosip2 是一个基于SIP 协议的开源库,用于实现SIP 客户端和服务器端应用程序的开发。
交叉编译(Cross-compilation)是指在一种平台上生成另一种平台的可执行代码,比如在一台操作系统上生成另一种操作系统的可执行文件。
针对exosip2 进行交叉编译的步骤可能会因为环境和目标平台而有所不同,以下是一般情况下的基本步骤:
步骤概述:
准备交叉编译工具链:首先要获取针对目标平台的交叉编译工具链,这包括交叉编译器、交叉编译时所需的库和头文件等。
配置exosip2:在交叉编译环境中,使用配置工具或手动配置,设置exosip2 库的构建选项和参数,指定交叉编译工具链。
生成Makefile 或构建脚本:针对所配置的交叉编译环境,生成适用于交叉编译的Makefile 或构建脚本。
执行编译:运行Makefile 或构建脚本,执行编译过程。
这将使用交叉编译工具链生成适用于目标平台的可执行文件或库。
注意事项:
交叉编译工具链:确保选择正确的交叉编译工具链,与目标平台的架构和操作系统间相匹配。
配置选项:在配置exosip2 时,需要确保设置了正确的交叉编译工具链路径和其他必要的选项。
环境依赖:确保交叉编译环境中已经安装了目标平台所需的库和依赖项。
这些步骤只是一个大致的指导,具体的步骤和命令可能会因为具体环境和目标平台而有所不同。
在进行交叉编译前,最好查阅exosip2的官方文档或相关的交叉编译指南,以获得更详细和准确的步骤。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
exosip_t 是exosip 中最重要的结构体之一。从图可以看出, 这个结构体比较大,其中包含了exosip 中用到的各个子模块 的结构。比如call、reg、pub 等等。代码中定义了一个该 结构类型的全局变量,通过该全局变量,就可以对exosip 前 的状态进行掌控(许多相关的信息要么包含在该结构上,要么 可以通过该结构找到)。 Extl 是eXtl_protocol 类型的指针,保存了网络接口类。 J_osip 保存了osip 初始化时返回的osip 结构体。 J_transactions 一般是等待释放的事务。在事务经过osip 处 理完后,不再需要时,exosip会将其放在j_transactions 上, 等待释放。
用来管理notify模块 3.8 jinfo_t
这个结构体关联了dialog、call、subscribe以及notify几个结构体
3
3.9 eXosip_event_t
与 event 有关的结构体。这个结构体主要用来在应用 层和exosip 之间通信。Exosip 在处理事务的过程中,如果 需要将结果反馈给上层应用,则会生成如上结构类型的事 件,并将其放到exosip 的事件队列中。应用层会不断循环 从事件队列中读取事件,然后进行应用层的处理。
2、exosip 的模块构成
2.1 底层连接管理 extl.c、extl_udp.c、extl_tcp.c、extl_dtls.c、extl_tls.c 是与网络连接有关的文件。 实现了连接的建立,数据的接收以及发送等相关的接口。其中,extl_udp.c 为使用UDP 连 接的实现,extl_tcp.c 为使用TCP 连接的实现。Extl_dtls.c 以及extl_tls.c 都是使用安 全socket 连接的实现。 2.2 内部功能模块实现 Jauth.c、jcall.c、jdialog.c、jevents.c、jnotify.c、jpublish.c、jreg.c、jrequest.c、 jresponse.c、jsubscribe.c 等文件实现了内部对一些模块的管理,这些模块正如其文件名 所表示的,jauth.c 主要是认证,jcall.c 则是通话等等。 2.3 上层API 封装实现 Excall_api.c、exinsubsription_api.c、exmessag_api.c、exoptions_api.c、 expublish_api.c、exrefer_api.c、exregister_api.c、exsubsribtion_api.c 这几个以api 为后缀的文件,实现各个子模块的管理。应用程序可以调用这里提供的接口,方便的构造或 者发送sip 消息。 2.4 其他 Inet_ntop.c 实现ip 地址的点分十进制与十六进制表示之间的转换。 Jcallback.c 实现一堆回调函数,这些回调函数就是用来注册到osip 库的。我们使用exosip 库,就是避免直接使用osip 库,因为一些工作exosip 已经帮我们做了,所以这样一来,可 以简化上层的实现。 Udp.c 文件主要用来对通过UDP 连接接收到的消息进行分类处理。 Exutilis.c 文件实现一些杂项的函数。有ip 地址到字符串之间的转换,域名的解析等一些 辅助的功能函数。 Exconf.c 文件实现了exosip 的初始化相关的接口,包括后台任务的实现。实际上是 “configuration api”的实现。 Exosip.c 文件实现了与exconf.c 文件相似的功能。比如管道的使用,exosip 上事务的创 建和查找,register 和subscribe 的更新,认证信息的处理等。
4
application_contexgt 指针指向exosip,也就是二者相互指向。 4.1.3 调用eXosip_set_callbacks 设置osip 的回调函数,所以回调函数都是exosip 自己实
现。 4.1.4 调用jpipe 创建通信用的pipe,之前已经说了,对于windows 平台,是通过socket 接
3.2 eXosip_call_t
Exosip_call_t 定义了call 相关的信息,包括call 的id,call 的dialogs,call 上incoming的事务和outgoing 的事务。另外, 还包括了前向和后向指针,所以,所有的call 可以通过该结构 体串接起来。
3.3 eXosip_dialog_t
5
找出其中的最小值,然后将其与当前时间做差,结果就是最小的超时间隔了。这步是通 过调用接口osip_timers_gettimeout 完成的。主要检查osip 全局结构体上的ict、ist、nict、 nist 以及ixt 上所有事务的事件的超时时间。如果 ict 事务队列上没有事件,则说明没 有有效的数据交互存在,返回值为默认的一年,实际上就是让后面的接收接口死等。如 果有事务队列上的事件的超时时间小于当前值,则说明已经超时了,需要马上处理,此 时将超时时间清为零,并返回。
3、exosip 关键数据结构及其说明
1
3.1 eXtl_protocol
eXtl_protocol 是为实现网络通信专门定义的一个 数据结构,包括了变量和方法两部分。其中,变量包 括了建立网络连接过程中使用的ip 地址、端口等; 方法部分封装了网络socket编程常用的系统调用接 口。 代码中定义了四个该数据结构体的全局变量: eXtl_udp、eXtl_tcp、eXtl_tls 以及eXtl_dtls。 分别针对使用UDP、TCP 以及安全加密连接进行了实 现。
下面展示了初始化的示例代码: include <eXosip2/eXosip.h> int i; TRACE_INITIALIZE (6, stdout); i=eXosip_init(); if (i!=0) return -1; i = eXosip_listen_addr (IPPROTO_UDP, NULL, port, AF_INET, 0); if (i!=0) { eXosip_quit(); fprintf (stderr, "could not initialize transport layer\n"); return -1; } ... then you have to send messages and wait for eXosip events... 这样,在初始化完成后,我们基本上完成了对内存中所用数据结构的配置,同时启动了 一个后台任务负责osip 状态机的驱动。
口模拟实现的。 4.1.5 初始化其上的事务和事件队列。主要,这不同于osip 的事务和事件队列。 4.1.6 调用extl 指向的结构体的init 函数指针,初始化网络接口。
4.2在socket 接口上进行监听 这步通过调用eXosip_listen_addr 接口完成。 主要完成工作如下: 4.2.1 将eXosip 全局变量的eXtl 指针指向eXtl_udp 全局变量。 4.2.2 根据参数,配置extl_protocol 和exosip 上有关ip 端口地址等信息。另外,调用 extl_udp的tl_open 函数指针,完成在本机指定的端口上监听连接的工作。需要注意的是,虽 然是监听,但是使用的UDP 来建立连接的,所以消息的recv 和发送在同一个socket 上完成。 在osip中设置的out_socket 并不会起作用。 4.2.3 调用osip_thread_create 创建exosip 后台任务,用于驱动osip 的状态机。(在osip 中, 在发送sip 消息部分,提到将9 个函数放到一个线程中执行,exosip 就是这样做的)
b. 调用 eXosip_read_message 接口从底层接收消息并处理。如果返回-2,则任务退出。 c. 执行 osip 的状态机。具体为执行osip_timers_ict(ist|nict|nist)_execute 和osip_ict (ist|nict|nist)_execute 这几个函数。最后还检查释放已经终结的call、registrations 以及 publications。 d. 如果 keep_alive 设置了,则调用_eXosip_keep_alive 检查发送keep_alive 消息。 这样,当远端的终端代理发送sip 消息过来时,会被之前创建的监听端口捕获(sip 协议 默认的端口为5060)。在调用eXosip_read_message 接口时会将其接收上来。接收上来的数 据存放在buffer 中交给接口_eXosip_handle_incoming_message 来处理。在其中首先调用 osip_parse 进行消息的解析,这是osip 的核心功能之一。数据解析后,会生成一个osip_event 类型的事件。接着调用osip_message_fix_last_via_header 将接收到该消息的ip 地址和端口根 据需要设置到数据头的via 域中。这在消息返回时有可能发挥作用。为了能够让消息正确的 被处理,调用osip_find_transaction_and_add_event 接口将其添加到osip 的事务队列上。处理 在这之后发生了分叉,如果osip 接纳了该事件,接口直接返回,因为这说明该事件在osip 上 已经有匹配的事务了,或者说该事件是某一个事务过程的一部分。这样在后面执行状态机的 接口时,该事件会被正确的处理。如果osip 没有拿走该事件,则说明针对该事件还没有事 务与之对应。此时,我们首先检查其类型,如果是request,则说明很可能是一个新的事件到 来( 这将触发服务端的状态机的建立), 调用eXosip_process_newrequest 接口进行处理。 如果是response , 则调用接口eXosip_process_response_out_of_transaction 处理。在 eXosip_process_newrequest 接口中,如果是合法的事件,则会为其创建一个新的事务。 也就是说这是新事务的第一个事件。经过一大堆的处理后,该事件可能就被osip 消化了, 或者被exosip 消化了。如果需要上报给应用,由应用拿来对一些信息进行存储或者进行图 形显示之类,则会将该事件添加到exosip 的事件队列上。如下图所示: