oSIP协议栈(及eXoSIP,Ortp等)使用入门[1]
eXosip简例
![eXosip简例](https://img.taocdn.com/s3/m/424c3cbb48d7c1c709a14500.png)
eXosip简例1. 从利用eXosip的注册开始int i;char identity[50]; char registerer[50]; char localip[128]; static int flag = 0; int id;eXosip_guess_localip (AF_INET, localip, 128);sprintf(identity,\ sprintf(registerer,\//初始化 if( flag == 0) {i = eXosip_init(); if (i != 0) {return -1; }TRACE(\ flag ++;i = eXosip_listen_addr(IPPROTO_UDP, NULL, 5060, AF_INET, 0); if (i != 0) {eXosip_quit();fprintf(stderr, \ return -1; }TRACE(\ }osip_message_t *reg = NULL;eXosip_lock();id = eXosip_register_build_initial_register (identity,registerer, NULL, 1800, ®); printf(\if (id < 0) {eXosip_unlock();fprintf (stderr, \ return 0; }eXosip_lock();i = eXosip_register_send_register(id, reg); if (i != 0) {fprintf (stderr, \ return 0; } eXosip_unlock ();TRACE(\eXosip_event_t *je; for (;;) {je = eXosip_event_wait (0, 50);eXosip_lock();eXosip_automatic_action (); eXosip_unlock();if (je == NULL) {continue; }if (je->type == EXOSIP_REGISTRATION_SUCCESS) {TRACE(\ return 1; break; }if(je->type == EXOSIP_REGISTRATION_FAILURE) {//注册失败之后,再次提交授权信息,也可放在上面eXosip_add_authentication_info(username, username,password, NULL,NULL); }if(je->type == EXOSIP_REGISTRATION_REFRESHED) {TRACE(\ return 0; } }eXosip_quit();eXosip_guess_localip (AF_INET, localip, 128);这句在eXosip中的实现为eXosip_guess_localip (int family, char *address, int size)address在函数体外首先进行定义为一数组,分配好空间,再给形式参数传指针过去,在函数体内对实际参数address赋值。
osip exosip 框架
![osip exosip 框架](https://img.taocdn.com/s3/m/7f3adf2ecfc789eb172dc83a.png)
Osip协议源代码框架详解Revision History目录1符号及缩写 (4)2整体描述 (4)3OSIP包的源代码框架解析 (5)3.1 OSIP的TRANSACTION的EVENT的产生 (5)3.1.1 定时器事件的产生过程 (6)3.1.2 报文触发的事件 (6)3.2 OSIP 的TRANSACTION的EVENT处理流程 (7)3.2.1 ICT的处理流程 (7)3.2.2 IST的处理流程 (9)3.2.3 NICT的处理流程 (9)3.2.4 NIST的处理流程 (9)3.3 O SIP报文的解析 (9)3.3.1 sip协议报文的解析整理流程 (9)3.3.2 Osip报文头的解析 (12)3.3.3 uri的解析 (13)3.3.4 添加一个新的协议header字段 (14)3.4 OSIP的TRANSACTION的管理 (15)3.5 OSIP中DIALOG的管理 (18)4EXOSIP包的源代码框架解析 (19)4.1 L IB库的初始化和销毁 (19)4.2 L IB库的主处理线程 (23)4.2.1 2xx应答的重发处理机制 (23)4.2.2 Exosip_execute执行流程 (23)4.2.2.1 Exosip_read_message的处理 (25)4.2.2.2 eXosip_process_response_out_of_transaction的处理流程: (28)4.2.3 eXosip_automatic_action处理流程 (28)4.3 C ALL的处理 (29)4.3.1 创建Call的第一个INVITE (29)4.3.2 INVITE的ACK应答的创建和发送 (31)4.3.3 dialog内的请求的创建和发送 (31)4.3.4 Dialog内answer的创建和发送 (32)4.4 R EGISTER的处理 (33)4.4.1 向一个服务器第一次注册 (33)4.4.2 调整一个注册的注册超时时间 (33)4.4.3 发送一个register注册 (33)Osip源代码框架详解1符号及缩写2整体描述开源代码的osip协议栈分为两个源代码包,整个协议栈采用lib库的形式,在内部没有使用到任务,采取与TCP/IP协议栈一样的策略,所以在使用上需要上层管理任务直接调用lib库提供的接口。
libexosip tls用法
![libexosip tls用法](https://img.taocdn.com/s3/m/53ab0988db38376baf1ffc4ffe4733687f21fc41.png)
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"是服务器端私钥的路径。
SIPP 简单说明
![SIPP 简单说明](https://img.taocdn.com/s3/m/27adb4f4f61fb7360b4c6569.png)
SIPp的安装与使用第一章SIPp介绍SIPp是一个测试SIP协议性能的工具软件。
这是一个GPL的开放源码软件。
它包含了一些基本的SipStone用户代理工作流程(UAC和UAS),并可使用INVITE和B YE建立和释放多个呼叫。
它也可以读XML的场景文件,即描述任何性能测试的配置文件。
它能动态显示测试运行的统计数据(呼叫速率、信号来回的延迟,以及消息统计)。
周期性地把CSV统计数据转储,在多个套接字上的TCP和UDP,利用重新传输管理的多路复用。
在场景定义文件中可以使用正规表达式,动态调整呼叫速率。
SIPp可以用来测试许多真实的SIP设备,如SIP代理,B2BUAs,SIP媒体服务器,SIP/x 网关,SIP PBX,等等,它也可以模仿上千个SIP代理呼叫你的SIP系统。
关于SIPp从google上搜索到很多,可是关于SIPp的中文说明资料较少,或者很多都是不齐全的安装使用说明。
SIPp的网址:/SIPp的下载地址:/project/showfiles.php?group_id=104305&package_id=119322(当我已经在使用rc6的时候,rc8已经出来了,|||-.-)SIPp的四种安装方法:1) 没有TLS支持与密码验证支持:a) # tar -xvf sipp-1.1rc6.tar.gzb) # cd sipp-1.1.rc6c) # makeMake出来的sipp文件就是一个可执行的文件,只需要搭配场景xml文件与csv文件即可进行SIP测试2) 拥有TLS支持与密码验证支持,但是不支PCAP语音播放:a) # tar -xvf sipp-1.1rc6.tar.gzb) # cd sipp-1.1.rc6c) # make ossl这样编译出来的文件就加入了TLS至于与密码验证支持功能sipp软件了。
3) 支持PCAP Play,但是没有密码验证支持:(PCAP Play即为可以进行RTP语音,但是没有407 AUTH验证)a) # tar -xvf sipp-1.1rc6.tar.gzb) # cd sipp-1.1.rc6c) # make pcapplay4) 支持PCAP 声音文件播放,而且支持密码验证支持:(支持407 auth验证支持)a) # tar -xvf sipp-1.1rc6.tarb) # cd sipp-1.1.rc6c) # make pcapplay_ossl最新消息:使用sipp-1.1rc6后,如果采用pcap方式发包播放后,通过抓包抓不到session 的消息体。
osip协议栈
![osip协议栈](https://img.taocdn.com/s3/m/a347e3d376a20029bd642dcd.png)
正文第一章SIP协议SIP协议是用于发起、控制和终结多媒体会话的信令协议。
它被IETF( )以rfc2543发表。
SIP是IETF致力于将电话服务带入IP网络众多协议的一个组成部分(它与SDP、RTP、RTCP、RTSP、RSVP、TRIP等众多协议构成SIP系统协议栈)。
其将要变成正在发展的IP电话——这个朝气蓬勃的电信工业——的标准之一。
正如同电子邮件协议一样,SIP将会变得越来越普及和大众化… …SIP独立与媒体传统电话使用一种媒体编码个师通讯(正如被我所熟知的时隙和PCM概念)。
现在,这种方式将被终结。
我们的电话可以以不同的质量保证和不同的编码方法连接电视、连接摄像机、连接其他电话进行通信。
SIP具有媒体协商等功能。
任何多媒体应用(例如:游戏、远程教学)都可以使用SIP来建立会话。
SIP独立于传输层SIP并不和任何的传输层紧密结合。
这一构思将使得SIP在第三代网络中受到最小的互操作影响。
无线电话的要求(例如漫游功能)同样被关心。
SIP完美的构思,使得其适合作为新蜂窝电话时代的信令协议。
SIP有很好的扩展性在rfc2543中定义了6种类型的事务(INVITE,BYE,CANCEL… …)。
这些事务被用于媒体协商、创建、修改和终结呼叫。
许多其它的服务已经提供这些方式(例如H.323系统),但SIP以其为扩展性为目的设计和事务模型重用(对于服务器是透明的,被用于使用新类型事务创建辅助服务)。
下面是可能的服务列表,其中的一些已经被实现。
短信,用于实时信息预定或通告,用于会议管理委托,用于呼叫转移等管理SIP和最终用户服务“SIP透明支持名字映射和重定向服务,提供ISDN和智能网络电话服务同样的一些功能。
这些特性也使得个人移动成为可能。
”参考阅读:rfc2543.txt(章节1.1)SIP服务器被用于定位用户和分发请求的用户定位信息。
这些途径,使得最终用户代理发起很少的请求,并能获得多种多样的服务。
TCPIP网络协议族简单的入门自学手册(内有详细实验结果).
![TCPIP网络协议族简单的入门自学手册(内有详细实验结果).](https://img.taocdn.com/s3/m/9e211d8add88d0d233d46aed.png)
By 韩大卫 @ 吉林师范大学主要学习TCP/IP协议族中传输层,网络层,链路层的协议。
总体思想:网络间的数据传输是在链路层间实现的, 用户层的数据如果想进入链路层, 要经过逐层封装, 最后封装成以太网帧格式进行发送,这样将不同的数据都包装成以太网帧,实现了在不同网络的数据互联和通信。
例如:一个用户层数据 data经过传输层TCP协议 data经过网络层IP协议TCP协议 data链路层以太网祯首部IP协议TCP协议 data CRC以太网帧格式: 目的MAC地址(6字节源MAC地址(6字节帧类型(2字节data(46——1500CRC(4字节常见帧类型:0800: IP协议0806: ARP协议IP报文格式:4bit协议格式 4bit首部长度8bit TOS16bitIP报文总长度16bitIP报文标志16bit分片信息8bitTTL8bit上层协议16bit检验和32bit源IP地址32bit目的IP地址data上层协议:06: TCP协议01: ICMP协议17:UDP协议TCP段格式:16bit源端口号16bit目的端口号32bit序列号32bit确认序号4bitTCP首部长度 6bit保留 6bit标志位。
ACK 。
SYN FIN16bit窗口大小16bit检验和16bit紧急指针可选项dataUDP段格式:16bit源端口号16bit目的端口号16bitUDP长度16bit检验和dataTCP是面向连接的协议,UDP是面向不连接的协议。
TCP: 提供可靠的,有连接的传输UDP:提供不可靠的,无连接的传输TCP是面向连接的协议, 所以在双方通信前要建立连接, 建立连接的过程分为三部,简称三次握手: 第一次: A 发送 SYN,1000(0,mss<1460>第二次: B 发送 SYN, 8000(0,ACK 1001, mss<1024>第三此:A发送 ACK 8001从TCP状态迁移图中得知, 这个过程中客户端的状态变化是:CLOSED----SYS_SENT----ESTABLISHED服务器端:CLOSED----LISTEN----SYS_RCVD----ESTABLISHED实例:IP 192.168.10.50.50258 > 123.125.115.43.80: Flags [S], seq 2916403917, win 14600, options [mss 1460,sackOK,TS val 1163706 ecr 0,nop,wscale 4], length 0 0x0000: 0022 3f11 74b2 ac81 1250 b016 0800 4500 ."?.t....P....E.0x0010: 003c 0b77 4000 4006 75c2 c0a8 0a32 7b7d .<.w@.@.u....2{}0x0020: 732b c452 0050 add4 cacd 0000 0000 a002 s+.R.P..........//a012 得知, SYN置位0x0030: 3908 b9b1 0000 0204 05b4 0402 080a 0011 9...............0x0040: c1ba 0000 0000 0103 0304 ..........本机向目的IP发送SYN(注: 如看不懂tcpdump 的输出结果,请看文档尾部的解释。
网络协议知识:SIP协议的基本工作流程和通信过程
![网络协议知识:SIP协议的基本工作流程和通信过程](https://img.taocdn.com/s3/m/46fe79ec250c844769eae009581b6bd97f19bc8a.png)
网络协议知识:SIP协议的基本工作流程和通信过程SIP协议的基本工作流程和通信过程SIP协议(Session Initiation Protocol)是一种用于建立、修改和终止多媒体传输会话的信令协议。
它被广泛地应用于互联网电话(VoIP)、视频会议、实时文本等领域。
在本文中,我们将介绍SIP协议的基本工作流程和通信过程。
一、SIP协议的基本工作流程SIP协议的基本工作流程包括会话描述、会话建立、呼叫传送和会话终止四个部分。
1.会话描述在建立会话之前,需要先进行会话描述,包括会话类型、参与者、所需资源和传输协议等信息。
这些信息被包含在SIP消息中,由发送者向接收者发送。
2.会话建立会话建立是SIP协议的核心部分,它分为两个阶段:呼叫请求和呼叫响应。
(1)呼叫请求:呼叫请求由客户端发起,它包含了所需资源和参与者的信息。
首先,客户端需要向第三方服务器发送INVITE消息,请求建立一次会话。
在INVITE消息中,需要包含被叫方的地址信息、消息头部信息和描述被呼叫方资源的SDP(Session Description Protocol)。
(2)呼叫响应:被呼叫方在收到INVITE消息之后,会返回一个响应。
响应分为三种:1xx、2xx和3xx+。
其中,1xx表示正在进行中,2xx表示成功建立,3xx+表示需要重定向。
“成功建立”的响应会包含会话描述信息,即SDP。
在响应中,还可以通过Location字段告知客户端新的地址信息。
3.呼叫传送呼叫传送是会话建立之后,实际传输媒体数据的阶段。
SIP协议支持多种传输协议,包括UDP、TCP和TLS等。
在呼叫传送消息过程中,需要用到RTCP(Real-time Transport Control Protocol)和RTP (Real-time Transport Protocol)协议进行音视频流传输控制。
4.会话终止当一次会话结束时,需要发送一个BYE消息。
BYE消息用于释放会话资源,并告知接收方会话已经结束。
自己动手写SIP协议栈
![自己动手写SIP协议栈](https://img.taocdn.com/s3/m/b6eb4430f342336c1eb91a37f111f18582d00c57.png)
自己动手写SIP协议栈首先,SIP协议栈需要实现SIP协议的各个功能,包括请求和响应的解析与生成、消息的路由和转发、状态维护、媒体的协商与传输等。
以下是一个简单的SIP协议栈的实现步骤:1.理解SIP协议:阅读SIP协议的官方文档和RFC标准,了解SIP协议的语法、语义以及各个消息的格式和含义。
2. 实现SIP消息的解析与生成:根据SIP协议的规范,实现对SIP请求和响应消息的解析和生成功能,包括解析消息头、解析和生成SIP URI、解析和生成SDP(Session Description Protocol)等。
3.实现SIP消息的路由与转发:根据SIP消息的目的地址,实现对SIP消息的路由功能,将消息转发到正确的目的地。
4.实现SIP会话的状态维护:根据SIP协议定义的各个状态和状态转换规则,实现SIP会话的状态维护功能,包括会话的建立、修改和终止。
5.实现媒体协商与传输:SIP协议通常用于建立多媒体会话,如音频或视频通话。
实现SIP协议栈的媒体协商与传输功能,包括与对方进行媒体协商、建立媒体通道、传输媒体数据等。
6.实现网络通信功能:SIP协议栈需要与网络进行通信,接收和发送SIP消息。
实现底层的网络通信功能,包括建立和维护TCP或UDP连接、接收和发送SIP消息等。
7.调试和测试:在实现完SIP协议栈的各个功能后,进行调试和测试,确保SIP协议栈的正确性和稳定性。
以上只是一个简单的实现步骤,实际的SIP协议栈实现可能更加复杂。
在实现过程中,还需要考虑对SIP协议的各种拓展和扩展,如支持SIP中的各种扩展头、支持SIP的安全性等。
总结起来,实现一个SIP协议栈是一个非常复杂的任务,需要对SIP协议有深入的理解,并具备底层网络通信的知识。
在实现过程中,需要遵循SIP协议的规范,并进行充分的调试和测试,以确保SIP协议栈的正确性和稳定性。
exosip osip 交叉编译
![exosip osip 交叉编译](https://img.taocdn.com/s3/m/3374a5b27d1cfad6195f312b3169a4517723e5b1.png)
exosip和osip是两种常用于SIP(会话初始协议)协议栈实现的开源软件库,它们可以帮助开发人员在其应用程序中实现基于SIP协议的通信功能。
在某些情况下,由于开发环境的限制,我们可能需要进行交叉编译来将这些库移植到不同的评台上,本文将重点介绍如何使用交叉编译工具来将exosip和osip库移植到目标评台上。
1. 了解交叉编译的基本概念在开始介绍如何进行exosip和osip库的交叉编译之前,我们首先需要了解一些基本的概念。
交叉编译是指在一种评台上开发、编译出在另一种不同的评台上运行的应用程序的过程。
在实际应用中,我们可能需要在PC机上编译出在嵌入式评台上运行的程序,这就需要用到交叉编译工具链。
2. 准备交叉编译工具链在进行交叉编译之前,我们需要先准备好交叉编译工具链。
交叉编译工具链包括交叉编译器、交叉连接器、交叉汇编器等,它们用于将源代码编译成目标评台上可执行的程序。
可以从官方全球信息湾或者第三方渠道下载已经编译好的交叉编译工具链,也可以自行编译搭建交叉编译环境。
3. 配置编译环境在准备好交叉编译工具链之后,我们需要配置编译环境,以便将exosip和osip库移植到目标评台上。
配置编译环境包括设置交叉编译器的路径、指定目标评台的系统类型、设置编译选项等。
具体的配置步骤和方法可以参考官方文档或者相关的教程。
4. 下载源代码在配置好编译环境之后,我们需要下载exosip和osip库的源代码,这些源代码通常是以压缩包的形式发布在官方全球信息湾上,也可以从版本控制系统如Git、SVN等获取最新的源代码。
下载源代码后,我们需要解压缩并进行一些基本的配置。
5. 编译和安装在下载和配置完源代码之后,我们可以使用交叉编译工具链来编译和安装exosip和osip库。
编译和安装过程通常包括配置编译选项、执行编译命令、进行单元测试、安装到目标系统等步骤。
在编译和安装过程中可能会遇到一些依赖库缺失、编译错误等问题,这就需要我们根据具体情况进行调试和解决。
exosip2 原理
![exosip2 原理](https://img.taocdn.com/s3/m/af752098ac51f01dc281e53a580216fc700a5305.png)
exosip2 原理exosip2是一种用于实现SIP(会话初始协议)的开源库,它提供了一系列的API函数,使开发者能够轻松地构建基于SIP的应用程序。
本文将详细介绍exosip2的原理及其在通信领域的应用。
exosip2库是基于osip(开源SIP协议栈)库开发的,它提供了更高级别的抽象和功能,可以简化SIP应用程序的开发过程。
exosip2库的核心原理是对SIP协议进行封装和解析,以便于应用程序进行SIP消息的发送和接收。
exosip2库的主要功能包括SIP会话的建立、终止和管理,SIP消息的发送和接收,以及SIP协议的解析和处理。
它提供了一组API函数,使开发者可以方便地创建SIP会话、发送SIP消息,并处理收到的SIP消息。
exosip2库的使用流程一般分为以下几个步骤:1. 初始化:首先需要调用exosip_init函数进行库的初始化,该函数将建立与SIP服务器的连接并初始化相关资源。
2. 注册:通过调用exosip_register函数,可以向SIP服务器注册用户,以便接收来自其他用户的呼叫请求。
3. 呼叫:通过调用exosip_call函数,可以向其他用户发起呼叫请求。
在呼叫请求中需要指定被叫方的SIP地址。
4. 接听:当收到其他用户的呼叫请求时,exosip2库将自动触发一个事件,应用程序可以通过注册相应的回调函数来处理此事件。
在呼叫请求事件中,应用程序可以选择接听呼叫或拒绝呼叫。
5. 通话:一旦呼叫被接听,应用程序可以通过exosip_call_ack函数发送一个ACK消息,表示通话已建立。
在通话过程中,应用程序可以通过exosip_call_send_request函数发送音频数据,并通过exosip_call_recv_request函数接收对方发送的音频数据。
6. 结束:通话结束后,需要调用exosip_call_end函数来终止通话并释放相关资源。
exosip2库的使用可以帮助开发者快速构建基于SIP的应用程序,例如VoIP(网络电话)、实时视频通话、即时消息等。
exoSip开发手册
![exoSip开发手册](https://img.taocdn.com/s3/m/b4539a8d84868762caaed535.png)
TCPIP协议栈中的应用层协议解析
![TCPIP协议栈中的应用层协议解析](https://img.taocdn.com/s3/m/422ebc52f08583d049649b6648d7c1c708a10b0d.png)
TCPIP协议栈中的应用层协议解析在TCP/IP协议栈中,应用层协议扮演着关键的角色,它负责解析和处理网络应用程序之间的通信。
本文将深入探讨TCP/IP协议栈中的应用层协议解析,介绍其工作原理以及常见的应用层协议。
一、应用层协议解析的背景在计算机网络中,通信双方之间的数据传输需要通过多个层次的协议进行处理。
TCP/IP协议栈是互联网中最常用的网络协议栈,它由四个层次构成,分别是应用层、传输层、网络层和链路层。
应用层协议处于协议栈的最顶层,负责处理应用程序之间的通信。
二、应用层协议解析的工作原理应用层协议解析的目标是将网络传输的数据解析成应用程序可以理解的格式。
在接收端,应用层协议解析器首先从传输层接收到数据,然后根据特定的协议规则进行解析。
解析过程包括以下几个步骤:1. 接收数据:应用层协议解析器从传输层接收到数据,并将其保存在缓冲区中。
2. 解析报文:应用层协议解析器根据特定协议的定义,对接收到的数据进行解析。
解析的方式多种多样,常见的方式包括基于XML、JSON或二进制的解析方法。
3. 提取数据:在解析过程中,应用层协议解析器会提取出关键的数据字段,如请求类型、请求参数等,并将其保存在变量中供应用程序使用。
4. 执行应用程序操作:解析完成后,应用层协议解析器将提取出的数据发送给相应的应用程序,应用程序根据接收到的数据执行相应的操作。
这些操作可以包括用户认证、数据处理、结果返回等。
三、常见的应用层协议1. HTTP协议:超文本传输协议(HTTP)是应用层协议中最为常见的一种协议。
它是Web应用程序的基础,用于在客户端和服务器之间传输超文本。
2. SMTP协议:简单邮件传输协议(SMTP)是传输电子邮件的应用层协议。
它定义了邮件的传输规则,负责将邮件从发送方发送到接收方的邮件服务器。
3. FTP协议:文件传输协议(FTP)是用于在客户端和服务器之间传输文件的应用层协议。
它提供了文件上传、下载和管理的功能。
SIP协议栈
![SIP协议栈](https://img.taocdn.com/s3/m/5d0f6c25a66e58fafab069dc5022aaea988f4162.png)
SIP协议栈协议名称:SIP(Session Initiation Protocol)协议栈一、引言SIP协议栈是一种用于建立、修改和终止多媒体会话的通信协议。
本协议旨在定义SIP协议栈的标准格式,以确保各种设备和应用程序之间的互操作性和兼容性。
二、范围本协议适用于所有使用SIP协议栈的设备和应用程序,包括但不限于VoIP电话、视频会议终端、软交换、SIP代理服务器等。
三、术语定义1. SIP(Session Initiation Protocol):一种用于建立、修改和终止多媒体会话的通信协议。
2. SIP协议栈:指实现SIP协议的软件或硬件。
3. 设备:指使用SIP协议栈的硬件设备,如VoIP电话、视频会议终端等。
4. 应用程序:指使用SIP协议栈的软件应用程序,如软交换、SIP代理服务器等。
四、协议规范1. SIP消息格式SIP协议栈应支持SIP消息的格式,包括请求消息和响应消息。
请求消息由请求行、消息头和消息体组成,响应消息由状态行、消息头和消息体组成。
具体格式参考RFC 3261。
SIP协议栈应支持以下常用的SIP方法:- INVITE:用于发起一个会话。
- ACK:用于确认INVITE请求。
- BYE:用于终止一个会话。
- CANCEL:用于取消一个尚未得到响应的请求。
- REGISTER:用于注册用户的位置信息。
- OPTIONS:用于查询服务器的能力。
- INFO:用于传递关于会话的中间信息。
- UPDATE:用于修改会话的特性。
- PRACK:用于对可靠传输的请求进行确认。
3. SIP响应码SIP协议栈应支持以下常用的SIP响应码:- 1xx:信息性响应,表示请求正在处理中。
- 2xx:成功响应,表示请求已成功处理。
- 3xx:重定向响应,表示请求需要进一步操作。
- 4xx:客户端错误响应,表示请求存在错误。
- 5xx:服务器错误响应,表示服务器无法处理请求。
- 6xx:全局失败响应,表示请求无法被任何服务器处理。
Osip2和eXosip协议栈的简析
![Osip2和eXosip协议栈的简析](https://img.taocdn.com/s3/m/cecbbbeee009581b6bd9eb94.png)
Osip2和eXosip协议栈的简析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。
SIP协议栈
![SIP协议栈](https://img.taocdn.com/s3/m/6967ce42a36925c52cc58bd63186bceb18e8ed46.png)
SIP协议栈SIP(Session Initiation Protocol)是一种用于建立、修改和终止多媒体会话的通信协议。
它使用文本格式进行通信,并在互联网上运行。
SIP协议栈是指用于实现SIP协议的软件组件的集合,下面将介绍SIP协议栈的组成和工作原理。
SIP协议栈由多个层次组成,包括传输层、协议层和应用层。
传输层负责将SIP消息从一个节点传输到另一个节点。
常用的传输层协议包括UDP(User Datagram Protocol)和TCP (Transmission Control Protocol)。
协议层负责解析和处理SIP消息,例如建立会话、修改会话参数等。
应用层负责与用户交互,并根据需要生成SIP消息。
SIP协议栈的工作原理如下:当一个节点想要建立会话时,它将发送一个INVITE消息到目标节点。
目标节点收到INVITE消息后,将返回一个100 Trying消息表示正在处理请求。
然后,如果目标节点可以接受会话,它将返回一个180 Ringing消息表示正在响铃,并开始为该会话分配资源。
之后,目标节点将返回一个200 OK消息表示会话建立成功。
发送节点收到200 OK消息后,将发送一个ACK消息确认会话建立成功。
如果发送节点需要修改会话参数,它可以发送一个UPDATE消息到目标节点。
目标节点收到UPDATE消息后,将根据需要修改会话参数,并返回一个200 OK消息确认修改成功。
如果发送节点想要终止会话,它可以发送一个BYE消息到目标节点。
目标节点收到BYE消息后,将返回一个200 OK消息表示会话终止成功。
SIP协议栈还支持其他功能,例如身份验证、位置服务和消息转发。
身份验证功能可以确保会话只能由合法用户建立和修改。
位置服务功能可以根据用户的位置信息将会话路由到合适的节点。
消息转发功能可以将SIP消息转发到其他网络中的节点。
总之,SIP协议栈是一种用于建立、修改和终止多媒体会话的通信协议。
exosip2协议栈原理分析以及总结-图文
![exosip2协议栈原理分析以及总结-图文](https://img.taocdn.com/s3/m/f16dc9a501f69e314232943b.png)
exosip2协议栈原理分析以及总结-图文exosip2协议栈学习总结1、exosip2协议栈介绍eXosip是Osip2的一个扩展协议集,它部分封装了Osip2协议栈,使得它更容易被使用。
使用 sip 协议建立多媒体会话是一个复杂的过程,exosip 库开发的目的在于隐藏这种复杂性。
正如它的名称所表示的,eXosip2 - the eXtended osip Library,它扩展了osip 库,实现了一个简单的高层API。
通过使用exosip,我们可以避免直接使用osip 带来的困难。
需要注意,exosip 并不是对osip 的简单封装包裹,而是扩展。
Osip 专注于sip 消息的解析,事务状态机的实现,而exosip 则基于osip 实现了call、options、register、publish 等更倾向于功能性的接口。
当然,这些实现都是依赖于底层osip 库已有的功能的。
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协议学习笔记(一)
![SIP协议学习笔记(一)](https://img.taocdn.com/s3/m/4b1590260912a2161479298f.png)
SIP协议目录1.1 概述 (2)1.1.1 基本概念 (2)1.1.2 相关术语 (3)1.1.3 协议栈结构 (5)1.1.4 SIP协议的应用 (6)1.1.5 SIP协议的承载 (7)1.2 协议消息 (7)1.2.1 消息类型 (7)1.2.2 消息结构 (10)1.3 基本消息流程 (22)1.3.1 SIP用户注册流程 (22)1.3.2 成功的SIP用户呼叫流程 (24)1.4 IMS中的SIP (29)1.4.1 IMS中的SIP协议 (29)1.4.2 IMS经典信令流程讲解 (31)1.5 VoLTE知识点总结 (35)1.5.1 VoLTE总体流程-承载 (35)1.5.2 VoLTE 注册流程-EPS attach (35)1.5.3 VoLTE基本呼叫流程(SIP) (36)1.5.4 VoLTE基本呼叫流程(SIP) (37)1.5.5 VoLTE的承载组合 (37)1.1 概述1.1.1 基本概念会话启动协议SIP(Session Initiation Protocol)是由IETF提出并主持研究的一个在IP网络上进行多媒体通信的应用层控制协议,它被用来创建、修改、和终结一个或多个参加者参加的会话进程。
这些会话包括Internet多媒体会议、Internet电话、远程教育以及远程医疗等。
即所有的因特网上交互式两方或多方多媒体通信活动,统称为多媒体会话。
参加会话的成员可以通过组播方式、单播联网方式或者两者结合的方式进行通信。
SIP协议是一个正在发展和不断研究中的协议。
一方面,它借鉴了其他Internet标准和协议的设计思想,在风格上遵循因特网一贯坚持的简练、开放、兼容和可扩展等原则,并充分注意到因特网开放而复杂的网络环境下的安全问题。
另一方面,它也充分考虑了对传统公共电话网的各种业务,包括IN业务和ISDN业务的支持。
利用带有会话描述的SIP邀请消息来创建会话,以使参加者能够通过SIP交互进行媒体类型协商。
SIP协议栈
![SIP协议栈](https://img.taocdn.com/s3/m/c0c9954e78563c1ec5da50e2524de518964bd3e7.png)
SIP协议栈协议名称:SIP(Session Initiation Protocol)协议栈协议描述:SIP协议栈是一种用于建立、修改和终止多媒体味话的通信协议。
本协议旨在为实时通信提供一种灵便、可扩展和互操作的解决方案。
SIP协议栈是基于文本的协议,使用请求-应答模型进行通信。
协议内容:1. 协议概述SIP协议栈是一种应用层协议,用于在IP网络上建立、修改和终止多媒体味话。
它提供了一种可扩展、灵便且易于实现的解决方案,支持语音、视频、即时消息和其他多媒体应用。
2. 协议架构SIP协议栈由以下几个组件构成:- SIP用户代理(User Agent,UA):用户终端设备或者应用程序,用于发起和接受SIP请求。
- SIP代理服务器(Proxy Server):用于转发、路由和处理SIP请求。
- SIP注册服务器(Registrar Server):用于管理用户的注册信息。
- SIP重定向服务器(Redirect Server):用于重定向SIP请求。
- SIP会话边界控制器(Session Border Controller,SBC):用于处理SIP请求和响应的边界设备。
3. 协议消息格式SIP协议使用文本格式的请求和应答消息进行通信。
请求消息包括请求行、消息头和消息体,应答消息包括状态行、消息头和消息体。
消息头包含各种标识和参数,用于指定请求或者应答的属性和行为。
4. 协议流程SIP协议栈的典型流程如下:- 用户代理向注册服务器发送注册请求,以注册用户的位置信息。
- 注册服务器将用户的位置信息存储在注册表中。
- 当用户代理需要建立会话时,它向代理服务器发送INVITE请求。
- 代理服务器根据路由规则将INVITE请求转发给目标用户代理。
- 目标用户代理接受INVITE请求,并发送200 OK应答。
- 用户代理之间通过交换ACK和应答消息来建立会话。
- 会话结束时,用户代理发送BYE请求,双方发送200 OK应答,会话终止。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
oSIP协议栈(及eXoSIP,Ortp等)使用入门2007年09月26日星期三 14:16一直没空仔细研究下oSIP,最近看到其版本已经到了3.x版本,看到网上的许多帮助说明手册都过于陈旧,且很多文档内容有点误人子弟的嫌疑~~Linux下oSIP的编译使用应该是很简单的,其Install说明文档里也介绍的比较清楚,本文主要就oSIP在Windows平台下VC6.0开发环境下的使用作出描述。
虽然oSIP的开发人员也说明了,oSIP只使用了标准C开发库,但许多人在Windows下使用oSIP时,第一步就被卡住了,得不到oSIP的LIB库和DLL库,也就没有办法将oSIP使用到自己的程序中去,所以第一步,我们将学习如何得到oSIP的静态和动态链接库,以便我们自己的程序能够使用它们来成功编译和执行我们的程序。
第一阶段:------------------------------------------------------先创建新工程,网上许多文档都介绍创建一个Win32动态链接库工程,我们这里也一样,创建一个空白的工程保存。
同样,将oSIP2版本3.0.1 src目录下的Osipparser2目录下的所有文件都拷到我们刚创建的工程的根目录下,在VC6上操作:Project-AddToProject-Files将所有的源程序和头文件都加入到工程内,保存工程。
这时,我们可以尝试编译一下工程,你会得到许多错误提示信息,其内容无非是找不到osipparser2/xxxxx.h头文件之类。
处理:在Linux下,我们一般是将头文件,lib库都拷到/usr/inclue;/usr/lib之类的目录下,c源程序里直接写#i nclude <xxx.h>时,能直接去找到它们,在VC里,同样的,最简单的方法就是将oSIP2源码包中的Include目录下的osipparser2目录直接拷到我们的Windows下默认包含目录即可,这个目录在VC6的Tool-Options-Directories里设置,(当然,如果你知道这一步,也可以不用拷贝文件,直接在这里把oSIP源码包所在目录加进来就可以了),默认如果装在C盘,目录则为C:\Program Files\Microsoft Visual Studio\VC98\Include。
这时,我们再次编译我们的工程,顺利编译,生成osipparser2.dll,这时,网上很多文档里可能直接就说,这一步也会生成libs目录,里面里osipparser2.lib文件,但我们这里没有生成:)最简单的方法,不用深究,直接再创建一个工程,同上述创建动态链接库方法,创建一个Win32静态链接库工程,直接编译,即可得到osipparser2.lib。
------------------------------------------------------上面,我们得到了Osip的解析器开发库,下面再编译完整的Osip协议栈开发库,同样照上述方法,分别创建动态链接库工程和静态链接库工程,只是要拷的文件换成src下的osip目录下文件和include下的osip目录,得到osip2.dll和osip2.lib。
在编译osip2.dll这一步可能会再次得到错误,内容含义是找不到链接库,所以,我们要把前面编译得到的osipparser2.lib也拷到osip工程目录下,并在VC6中操作:Project-Setting-Link中的Object/LibraryModules:kernel32.lib user32.lib ... xxx.lib之类的内容最后增加: osipparser2.lib保存工程后再次编译,即可成功编译osip2.dll。
------------------------------------------------------至此,我们得到了完整的oSIP开发库,使用时,只需在我们的程序里包含oSIP的头文件,工程的链接参数里增加osipparser2.lib和osip2.lib即可。
------------------------------------------------------下面我们验证一下我们得到的开发库,并大概了解一下OSIP的语法规范。
在VC里创建win32控制台程序工程,将libosip源码包的SRC目录下的Test 目录内的C源程序随便拷一个到工程时,直接编译(工程设置里照前文方法在link选项里增加osip2.lib,osipparser2.lib引用我们之前成功编译得到的静态库文件)就可以运行(带参数运行,参数一般为一个文本文件,同样从Test 目录的res目录里拷一个与源文件同名的纯文本文件到工程目录下即可)。
该目录下的若干文件基本上是测试了Osip的一些基本功能函数,例如URI 解析之类,可以大概了解一下oSIP的语法规范和调用方法,同时也能校验一下之前编译的OSIP开发库能否正常使用,成功完成本项工作后,可以进入下一步具体的oSIP的使用学习了。
------------------------------------------------------由于oSIP是比较底层的SIP协议栈实现,新手较难上手,而官方的示例大都是一些伪代码,需要有实际的例子程序参考学习,而最好的例子就是同样官方发布的oSIP的扩展开发库exosip2,使用exoSIP可以很方便地快速创建一个完整的SIP程序(只针对性地适用于SIP终端开发用,所以我们这里只是用它快速开发一个SIP终端,用来更方便地学习oSIP,要想真正掌握SIP的开发,需要掌握oSIP并熟读RFC文档才行,exoSIP不是我们的最终学习目的),通过成功编译运行一个自己动手开发出的程序,再由浅入深应该是初学都最好的学习方法通过对使用exosip开发库的使用创建自己的SIP程序,熟悉后再一个函数一个函数地深入学习exosip提供的接口函数,就可以深入理解osip 了,达到间接学习oSIP的目的,同时也能从eXoSIP中学习到正确使用oSIP的良好的编程风格和语法格式。
而要成功编译ExoSIP,似乎许多人被难住了,直接在XP-sp2上,用VC6,虽然你使用了eXoSIP推荐的winsock2.h,但是会得到一个sockaddr_storage结构不能识别的错误,因为vc6自带的开发库太古董了,需要升级系统的PlatformSDK,下载地址如下:/msdownl ... PSP2FULLInstall.htm (VC6的支持已经停止,这是VC6能使用的最新SDK)成功安装后编译前需加OSIP_MT宏,以启用线程库,否则在程序中使用eXoSIP库时会出错,而编译时也会得到许多函数未定义的Warning提示,编译得到exosip2.lib供我们使用,当然,在此之前需要成功编译了osip2和osipparser2,而在之后的实际使用时,发现oSIP也需要增加OSIP_MT宏,否则OSIP_MT调用oSIP的线程库时会出错,所以我们需要重新编译oSIP了:),因为eXosip是基于oSIP的(同上方式创建静态和动态链接库工程,并需在Link中手工添加oSIP和oSIPparser的lib库)。
------------------------------------------------------创建新工程,可以是任意工程,我们从最简单的Win32控制台程序开始,为了成功使用oSIP,我们需要引用相关库,调用相关头文件,经过多次试验,发现需要引用如下的库:exosip2.lib osip2.lib osipparser2.lib WSock32.LibIPHlpApi.Lib WS2_32.Lib Dnsapi.lib其中,除了我们上面编译得到的三个oSIP库外,其它库都是系统库,其中有一些是新安装的PlatformSDK所新提供的。
至此,我们有了一个简单的开发环境了,可以充分利用网上大量的以oSIP为基础的代码片段和官方说明文档开始具体函数功能的测试和使用了:)------------------------------------------------------我们先进行一个简单的纯SIP信令(不带语音连接建立)的UAC的SIP终端的程序开发的试验(即一个只能作为主叫不能作为被叫的的SIP软电话模型),我们创建一个MFC应用程序,对话框模式,照上面的说明,设置工程包含我们上面得到的oSIP的相关开发库及SDK的一些开发库,并且由于默认LIBC的冲突,需要排除MSVCRT[D]开发库(其中D代表Debug模式下,没有D表示Release模式下),直接使用eXosip的几个主要函数就可以创建一个基本的SIP软电话模型。
其主要流程为:初始化eXosip库-启动事件监听线程-向SIPProxy注册-向某SIP终端(电话号码)发起呼叫-建立连接-结束连接初始化代码:int ret = 0;ret = eXosip_init ();eXosip_set_user_agent("##YouToo0.1");if(0 != ret){AfxMessageBox("Couldn't initialize eXosip!\n");return false;}ret = eXosip_listen_addr (IPPROTO_UDP, NULL, 0, AF_INET, 0);if(0 != ret){eXosip_quit ();AfxMessageBox("Couldn't initialize transportlayer!\n");return false;}启动事件监听线程:AfxBeginThread(sip_uac,(void *)this);向SIPProxy注册:eXosip_clear_authentication_info();eXosip_add_authentication_info(uname, uname, upwd, "md5", NULL);real_send_register(30); /* 自定义函数代码请见源码 */发起呼叫(构建假的SDP描述,实际软电话使用它构建RTP媒体连接):osip_message_t *invite = NULL; /* 呼叫发起消息体 */int i = eXosip_call_build_initial_invite (&invite, dest_call, source_call, NULL, "## YouToo test demo!");if (i != 0){AfxMessageBox("Intial INVITE failed!\n");}char localip[128];eXosip_guess_localip (AF_INET, localip, 128);snprintf (tmp, 4096,"v=0\r\n""o=josua 0 0 IN IP4 %s\r\n""s=conversation\r\n""c=IN IP4 %s\r\n""t=0 0\r\n""m=audio %s RTP/AVP 0 8 101\r\n""a=rtpmap:0 PCMU/8000\r\n""a=rtpmap:8 PCMA/8000\r\n""a=rtpmap:101 telephone-event/8000\r\n""a=fmtp:101 0-11\r\n", localip, localip, "9900");osip_message_set_body (invite, tmp, strlen(tmp));osip_message_set_content_type (invite, "application/sdp"); eXosip_lock ();i = eXosip_call_send_initial_invite (invite);eXosip_unlock ();挂断或取消通话:int ret;ret = eXosip_call_terminate(call_id, dialog_id);if(0 != ret){AfxMessageBox("hangup/terminate Failed!");}可以看到非常简单,再借助于oRTP和Mediastreamer开发库,来快速为我们的SIP软电话增加RTP和与系统语音API接口交互及语音编码功能,即可以快速开发出一个可用的SIP软电话,关于oRTP和Mediastreamer的相关介绍不是本文重点,将在有空的时候考虑增加相应使用教程,后面跟贴中可以下载基本可用的完整SIP软电话的VC源码工程文件供参考使用,完全CopyLeft,欢迎转载,但请在转载时注明作者信息,谢谢!第二阶段:---------------------------------------------------得到了一个SIP软电话模型后,我们可以根据软电话的实际运行表现(结合用Ethereal抓包分析)来进行代码的分析,以达到利用eXoSIP来辅助我们学习oSIP的最终目的(如要快速开发一个可用的SIP软电话,请至前面提到的论坛去下载使用oRTP和Mediastreamer快速搭建的一个基本完整可用的SIP软电话##YouToo 0.1版本的VC源码工程文件作参考)。