osip协议栈文档格式.docx
- 文档编号:18638662
- 上传时间:2022-12-30
- 格式:DOCX
- 页数:47
- 大小:52.82KB
osip协议栈文档格式.docx
《osip协议栈文档格式.docx》由会员分享,可在线阅读,更多相关《osip协议栈文档格式.docx(47页珍藏版)》请在冰豆网上搜索。
这些途径,使得最终用户代理发起很少的请求,并能获得多种多样的服务。
许多扩展性在建议文档中定义(查询SIP相关的draft)。
我们也可以增加个性化的电话功能并和现有已存在的服务器保持交互。
第二章SIP协议概述
本章目的并不是为了细致的描述rfc(我们必须通过阅读rfc获取协议细节),其紧紧提供快速、不完整的协议语法和行为概述。
SIP语法
SIP是一个基于utf8文本编码格式的协议(这使其消息具有很好的可读性,并易于调试)。
SIP协议中描述了请求、地址(URL)、应答和个个头部字段的语法信息。
整个语法信息以扩展巴克斯范式的形式描述,可以在Columbia获得。
这些语法定义参考了Mail和HTTP的定义方式。
SIP定义了6种请求的类型。
最基础的方法有:
INVITEACKCANCELBYEINFOOPTIONS
正如我们在请求的BNF定义中看到的(参考rfc2543第三章节),SIP不限定于在规范中已定义的简短的方法列表,扩展性被充分的考虑了。
不限定于上面的列表,任何其他类型的请求都可以被oSIP处理。
当然这一切的一切,依赖于大家的通知和贡献新的可能方法的样例程序等等。
目前的开发库没有太多的努力,以便明确的支持用于提供开发SIP电话的能力。
INVITEsip:
jacK@atosc.orgSIP/2.0
Via:
SIP/2.0/UDPhome.sipworld.org
To:
sip:
jacK@atosc.org
From:
cha@sipworld.org
Call-ID:
35778645354@home.sipworld.org
CSeq:
1INVITE
Contact:
cha@home.sipworld.org
Content-type:
application/sdp
Content-length:
267
v=0
o=user1536557652353687637INIP4128.3.4.5
s=MboneAudio
i=DiscussionofMboneEngineeringIssues
e=mbone@
c=INIP4128.3.4.5
t=00
m=audio3456RTP/AVP0
a=rtpmap:
0PCMU/8000
样例2-1INVITE请求消息内容
INVITE请求被用于初始化和定制会话。
现在,cha从呼叫在atos.org的jack。
这个请求将被发送到由atosc.org管理的SIP代理服务器,其将被前转到jack的通讯设备,设备拥有真正IP地址。
SIP事务
SIP使用事物控制和管理会话。
事务(INVITE,CANCEL,BYE……)通常是当前会话进展的记忆体。
一些其它的事物(SUBSCRIBE,NOTIFY……)对会话来讲并不必要。
一个事物是由请求和应答(一些的中间应答和最终应答)构成。
以下头部字段:
TO、From、Call-ID和Cseq被用于在一个事务中识别相关联的消息。
因为SIP可以使用不可靠的传输层协议(在IP网络中推荐使用UDP),SIP也定义了在一个事务中消息重传的规则。
UAC1UAS2
jacks|INVITE|
initiatea|----------------->
|Bob'
s
call||Phonestarts
|180Ringing|ringing
|<
-----------------|
|180Ringing|
|200OK|
|ACK|
|----------------->
|
样例2-2INVITE事务
这是一个最基本的点对点的信令呼叫流程的展示。
仅有两个SIP用户代理(UAC/UAS)之间进行的呼叫过程。
(重传的情况没有被展示)
SIP会话
事务(Transactions)被用户代理用于控制会话。
一个会话总是有INVITE消息发起的。
SIP定义了一系列的应答状态码。
一个代理服务器可以应答你一个非常知名的”404UserNotFound”(我们在使用HTTP的时候,也经常遇到“HTTP404-未找到文件”)。
错误也分不同的等级。
一个事物呼叫失败了,但可能仍在尝试新的定位,进行新的事务呼叫。
应答3XX用于重定向机制;
4XX、5XX、6XX应答各自用于标识终端错误、服务器错误和全局错误。
BOBJack(atosc.org)
UA1RedirectUA2
|REGISTER|.
|-------------->
|.
|200OK|.
|<
--------------|.
...
later......
.|REGISTER|
.|<
--------------|
.|200OK|
.|-------------->
|INVITEjack@.
|302Movedtemporarily.
|ACK|.
|INVITEjack@office.atosc.org|
|audio|
|------------------------------>
|180Ringing|
------------------------------|
|200OK|
|ACKjack@office.atosc.org|
..
later..
|INVITEbob@|
|audio+video|
|ACKbob@bob.home.org|
|BYEjack@office.atosc.org|
||
样例2-3一个完整的会话
首先,所有的用户代理向注册服务器(在这个样例中,重定向服务器具有注册服务功能。
注册服务器也就是定位服务器)。
会话由INVITE事务发起,联系在jack@。
一个重定向服务器使用重定向功能将找到的jack办公室的地址信息反馈给发起呼叫端UA1。
UA1获取了新的目标地址的信息,发起对jack@atosc.org的呼叫。
UA2首先振铃,jack接起电话发回200OK成功应答。
过了几分钟,jack和bob向使用他们的摄像头,以便能看到对方的视频信息。
新的会话媒体参数修改由jack发起INVITE而进行交互协商,最终结束由bob发起。
Server行为
SIP为代理、重定向和注册服务器定义了行为描述(我将其理解为有限状态机),具体还要阅读rfc……
通常,一个用户代理向本域管理的代理服务器发起请求。
例如我们并不知其将要互相之间的通讯者的具体位置,我们以用户@域名格式的SIP地址呼叫对方。
本域代理服务器(出于安全的考虑,其中可以加入防火墙功能)使用DNS查询,从而定位对方在哪个域里面。
一旦对方的域服务器被找寻到,并是安全的(出于安全考虑,可能使用Ipsec认证),请求被前转。
对方域代理服务器进行具体定位。
如果对方可用(也就是说对方已经在他的域注册服务器注册),所以对方域服务器前转请求到真正的用户。
在本地网络中,其他协议标准被用于找寻最终被叫用户(例如finger……)
第三章oSIP开发库
在本节中,希望你已经具备SIP系统很好的知识基础,单纯的指就是SIPrfc文档。
如果你打算使用SIP,你一个要仔细阅读rfc2543。
目标
oSIP项目启动于2000年7月,第一个发布的版本是在2001年5月(0.5.0)。
oSIP开发库是第一个自由软件项目。
在第三代网络体系中,越来越多的电信运营商将要使用IP电话(Linux也成为支撑平台的幸运儿)。
发展的一个侧面是在不久的将来,Linux将更多支持多媒体工具。
oSIP,作为SIP开发库,将允许建造互操作的注册服务器、用户代理(软件电话)和代理服务器。
所有的这些都平添了Linux将作为下一代电话产品的机会。
但oSIP的目标并非仅仅在PC应用。
OSIP具有足够的灵活和微小,以便在小的操作系统(例如手持设备)满足其特定要求。
从0.7.0版本发布,线程的支持作为可选项。
作为开发者的我们,可以在应用程序设计时进行选择。
OSIP在将来会完美的适用于蜂窝设备和嵌入式系统当中。
oSIP被众所周知应用于实时操作系统VxWorks当中,并且其他支持将是简单的事情。
开发的层次
语法分析器
oSIP现在支持utf8和完整的SIP语法。
0.7.0版本包含一个有很小例外、很好适应性的SIP语法分析器。
并且,新的语法分析器在2001年7月25日被公布,可能还有一些bug。
如果发现了,请务必报告到osip@atosc.org,我将修正他们。
OSIP中包含一个语法分析器,其能够读写任何在rfc中描述的SIP消息。
目前oSIP能够分析很小一部分头部,例如Via、Call-ID、To、From、Contact、Cseq、Route、Record-Route、mime-version、Content-Type和Content-length。
所有其他头部以字符串的格式存储。
更多的头部将会被增加进来。
现在,SIP语法分析器以MIME格式支持多种属性(这一部分还未被测试)。
有时不希望的行为可能发生。
oSIP分析之后的消息可能有一些变化。
oSIP不能维持如下可靠性:
(不过,oSIP保持完整的适应性)
头部字段的顺序
一行中出现多个头部
字段中出现额外的空格
出现LWS(内部的CRLF)
在to,from,contact…字段中出现引号
有限状态机
4个有限状态机已经被测试过。
并且在第八次加的夫SIPit中,与大约30个设备进行互通测试,表现得很稳定。
事务管理
oSIP公布了一个易于使用的用户界面。
事务是通过使用4个有限状态机定型的,这些都是oSIP库的核心。
每一个事物使用独立的FIFO,这些队列被外部模块填充。
事件(events)一经用户请求便被列入队列。
一系列的动态回叫注册,用于应用程序得知每一个事物的进展情况。
在oSIP上建造一个应用程序需要许多的模块。
首先,我们建造一个管理传输层特性的模块。
这样使得oSIP独立于传输层。
之后,我们将需要建造时钟管理的模块(一个简单的,远没有达到优秀得一个样例已经被提供)。
这个模块将负责重传和决定何时删除事务上下文是安全的。
最后,我们需要建造多媒体应用部分。
这一部分将不得不维持和更新会话(会话是依赖于事务的)的状态。
事务管理已经被测试,表现的很稳定。
并且oSIP不需要太多的内存便运行得很快。
自从0.7.0,开发库能够被用于多线程模式或者不使用,这完全由开发者决定。
谁将受益于oSIP
oSIP提供一个简单的界面,用于为SIP增加多媒体应用。
并且,oSIP并不和任何SIP开发商和操作系统紧密结合。
我们可以建造最终用户代理、无状态的代理服务器、重定向服务器和网关。
如果你像开发statefulproxy,应阅读最后的“Proxy开发的注意点”和前面的事务管理。
允许的平台
开发库建造初便考虑了可移植性,其可以被很快应用于支持POSIX的任何系统当中。
它已经在Solaris,HPunix,RTOSVxWorks和Windows。
GNU/Linux(2.2.16和2.4.7)被用于最初的开发。
第四章oSIP语法分析器
文件
./libosip-x.x.x/parser是SIP语法分析器的源代码目录。
./libosip-x.x.x是开发库的目录。
#inlcude<
osip/smsg.h>
是一个包含SIP语法分析API的库文件。
SIP-URL(SIP地址)
URL定义的语法结构和设计目标
URL被用于描述分布在SIP网络中的每一个实体:
SIP用户代理、定位服务器、SIP代理服务器、SIP重定向服务器等等。
这些实体都要有他们完整的SIPURL进行标识。
在开发库中用url_t格式去定义如下字段:
”To”、”From”、”Contact”、”Route”和”Record-Route”;
list_t扩展定义了url中包含的固定参数和不固定的头部值。
SIPURL的结构定义:
typedefstruct_sipurl_t{
char*scheme;
char*username;
char*password;
char*host;
char*port;
list_t*url_params;
list_t*url_headers;
}url_t
url_t结构体操作的API
url_init
[功能描述]
分配内存,并对结构体作初始化。
(在下面的API中将会有很多的初始化函数。
一般而言,分配内存调用malloc,释放内存调用free,由于作者做了改写使的调用的函数分别为smalloc和sfree,初赋值做的就是将一些变量赋值为0或NULL)。
[参数描述]
inturl_init(url_t**url);
成功返回0,失败会使程序自动退出。
url_free
释放操作完成的url_t结构,并对url_t结构中的变量赋值为空。
voidurl_free(url_t*url);
url_parse
分解输入的串信息,并赋值到已定义的url_t结构变量当中。
inturl_parse(url_t*url,char*filed_value);
成功返回0,失败返回-1,后面函数返回值大体如此定义。
url_2char
将一个url_t中的结构化信息转化并组合赋值给一个字符串。
inturl_2char(url_t*url,char**field_value);
成功返回0。
char**field_value会在url_2char中做初始化。
url_clone
进行两个url_t结构实例的复制(使用标准函数memcpy也可以完成,但对于链表不一定可以,未曾测试)。
inturl_clone(url_t*url,url_t**dest);
成功返回0,失败返回-1。
url_setscheme
url_setusername
url_setpassword
url_sethost
url_setport
设定url当中的摘要部分、用户名、密码、主机和端口
voidurl_setscheme(url_t*url,char*scheme);
voidurl_setusername(url_t*url,char*username);
voidurl_setpassword(url_t*url,char*password);
voidurl_sethost(url_t*url,char*host);
voidurl_setport(url_t*url,char*port);
url_getscheme
url_getusername
url_getpassword
url_gethost
url_getport
获取url当中的一些特定部分的值,并返回。
char*url_getscheme(url_t*url);
char*url_getusername(url_t*url);
char*url_getpassword(url_t*url);
char*url_gethost(url_t*url);
char*url_getport(url_t*url);
其它相关有用的函数API
#defineurl_set_transport_udp(U)url_param_add(U->
url_params,"
transport"
"
udp"
)
#defineurl_set_transport_tcp(U)url_param_add(U->
tcp"
#defineurl_set_transport_sctp(U)url_param_add(U->
sctp"
#defineurl_set_transport_tls(U)url_param_add(U->
tls"
#defineurl_set_transport(U,T)url_param_add(U->
T)
#defineurl_set_user_phone(U)url_param_add(U->
user"
phone"
#defineurl_set_user_ip(U)url_param_add(U->
ip"
#defineurl_set_user(U,USER)url_param_add(U->
USER)
#defineurl_set_method_invite(U)url_param_add(U->
method"
INVITE"
#defineurl_set_method_ack(U)url_param_add(U->
ACK"
#defineurl_set_method_options(U)url_param_add(U->
OPTIONS"
#defineurl_set_method_bye(U)url_param_add(U->
BYE"
#defineurl_set_method_cancel(U)url_param_add(U->
CANCEL"
#defineurl_set_method_register(U)url_param_add(U->
url_params,"
REGISTER"
#defineurl_set_method(U,M)url_param_add(U->
M)
#defineurl_set_ttl(U,T)url_param_add(U->
ttl"
#defineurl_set_maddr(U,M)url_param_add(U->
maddr"
这些函数都是必要理解的(参照osip/urls.h)
url_param_t和url_header_t操作的API
你可以参考前面细述的关于参数和头部值之间的区别。
在下面的描述的param的函数中,你只要将param换为header,即可完成对url_header_t的操作。
这些函数完成了对结构的初始化、分解、设定和克隆等操作。
param参数的结构定义如下:
typedefstruct_url_parm_t{
char*gname;
char*gvalue;
}url_param_t;
header参数的结构定义如下:
}url_header_t
url_param_init
初始化url_param_t结构。
inturl_param_init(url_param_t**url_param);
url_param_free
释放url_param所对应url_param_t结构实例。
inturl_param_free(url_param_t*url_param);
成
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- osip 协议
![提示](https://static.bdocx.com/images/bang_tan.gif)