博文
SIP的RFC中文文档(RFC3261)(9)(2005-12-30 00:17:00)
摘要:9 取消一个请求(Cancel)
前边几节讲述了对所有方法的处理请求和处理应答的UA的通用处理过程。在本节中,我们讨论一个通用的方法,CANCEL。CANCEL请求,就像名字所说的,是用来取消客户端发起的上一个请求的。特别是,它请求UAS去终止上一个请求并且对上一个请求产生一个错误的应答。CANCEL对UAS已经给出终结应答的请求无效。所以,CANCEL请求的最大用处是取消需要服务器长时间处理的请求。也就是说,CANCEL最常用来处理取消INVITE请求,因为INVITE通常需要花费很长时间来产生一个终结应答。在这种使用中,UAS接收到对一个INVITE请求的CANCEL请求,当这个INVITE还没有得到终结应答的时候,UAS会”停止振铃”,并且给INVITE请求一个错误的应答(487)。
CANCEL可以由proxy或者UAC发起。15节讲述了在何种情况下,UAC会CANCEL一个INVITE请求,在16.10节讲述了proxy对CANCEL的使用。
一个有状态的proxy需要对CANCEL进行响应,而不是简单的转发从下行流中接收到的一个应答。基于这个原因,CANCEL是一个”点对点”(hop-by-hop)的请求,也就是说,CANCEL需要每一个有状态的proxy节点进行处理和应答。
9.1 客户行为(Client Behavior)
CANCEL请求不应该取消除了INVITE之外的请求。因为除了INVITE之外的请求的响应都是立即响应的,所以,发送CANCEL来取消一个非INVITE请求总是形成一种赛跑的局面(就是说,cancel先到还是被取消的请求先到)。
下列步骤用于创建一个CANCEL请求。在CANCEL请求中的Request-URI , Call-ID , To , Cseq的数字部分,From这些头域都必须和被取消的请求头域一样,包含这些头域的tags. 客户端创建的CANCEL必须只有一个Via头域值,这个头域值和被取消的请求的最上一个Via头域值相同。这些头域的值和请求的值相同可以让CANCEL请求和被取消的请求相匹配(9.2节描述了如何匹配)。在Cseq请求头域的method部分必须是一个CANCEL方法。这个让这个CANCEL请求被当作自己的事务而被正确的鉴别和处理(参见17节)。
如果被取消的请求包含一个Route头域,CAN......
基于SIP协议的视频通讯(2005-12-21 11:31:00)
摘要:
1.sip协议及其发展
sip(session initiation protocal)称为会话发起协议,是由ietf(internet engineering task force)组织于1999年提出的一个在基于ip网络中,特别是在internet这样一种结构的网络环境中,实现实时通讯应用的一种信令协议。而所谓的会话(session),就是指用户之间的数据交换。在基于sip协议的应用中,每一个会话可以是各种不同的数据,可以是普通的文本数据,也可以是经过数字化处理的音频、视频数据,还可以是诸如游戏等应用的数据,应用具有巨大的灵活性。
作为一个ietf提出的标准,sip协议在很大程度上借鉴了其他各种广泛存在的internet协议, 如http(超文本传输协议)、smtp(简单邮件传输协议)等,和这些协议一样,sip也采用的基于文本的编码方式,这也是sip协议同视频通讯领域其他现有标准相比最大的特点之一。
sip协议的提出和发展,是伴随着internet的发展而发展的,到目前为止它走过了以下几个阶段。
● 1996年首先出现了sip的概念,这时sip的主要应用是针对internet上的各种文本应用,如电子邮件、文字聊天等。
● 1999年3月,itef的多方多媒体会晤控制(mmusic)工作组提出了rfc2543建议,供各厂商和机构讨论。
● 1999年9月,sip工作组从mmusic中分离并独立出来,成立了sip工作组,并与2000年7月发表了sip的草案。
● 2002年6月,itef的sip工作组又发表了rfc3261建议,以取代rfc2543.
由于网络环境以及相关多媒体技术的不足,在sip协议首次提出的时候,仅仅针对各种文本应用,随着技术的发展,并通过和ietf中ip电话工作组(iptel)、ip网中电话选路(trip)工作组等兄弟工作组配合工作,在sip协议中大大加强了对多媒体通讯的......
SIP相关的RFC文档全收集(2005-12-21 11:16:00)
摘要:
(注:只供作参考,下载链接已删除)
Core SIP Documents
RFC 2543
SIP: Session Initiation Protocol (obsolete)
RFC 3261
SIP: Session Initiation Protocol
SDP Related Documents
RFC 2327
Session Description Protocol (SDP)
RFC 3264
An Offer/Answer Model with the Session Description Protocol (SDP)
RFC 3266
Support of IPv6 in SDP
RFC 3388
Grouping Media Lines in SDP
RFC 3407
Session Description Protocol (SDP) Simple Capability Declaration
RFC 3556
SDP Bandwidth Modifiers for RTCP Bandwidth
RFC 3605
Real Time Control Protocol (RTCP) attribute in Session Description Protocol (SDP)
RFC 3890
A Transport Independent Bandwidth Modifier
RTP Related Documents
RFC 3550
RTP: Transport Protocol for Real-Time Applications
RFC 3551
RTP Profile for A/V Conferences with Minimal Control
RFC 2198
RTP Payload for Redundant Audio Data
RFC 2733
An RTP Payload Format for Generic Forward Error Correction
RFC 2793
RTP Payload for T......
几种开源SIP协议栈对比(2005-12-21 09:57:00)
摘要:
随着VoIP和NGN技术的发展,H.323时代即将过渡到SIP时代,在H.323的开源协议栈中,Openh323占统治地位,它把一个复杂而又先进的H.323协议栈展现在普通程序员的眼前,为H.323普及立下了汗马功劳。而然当在SIP时代,则出现了群雄割据的状况,SIP相对于H.323简单,灵活,于是各种协议栈层出不穷,下面将详细对比最具有代表性的5个开源项目:OPAL,VOCAL,sipX,ReSIProcate,oSIP
1、OPAL
OPAL是Open Phone Abstraction Library,是Openh323的下一个版本,它仍然使用了Openh323的体系结构,并在其基础上进行扩展,同时实现了SIP,H.323,但在音频和视频的编码和传输部分有较大改动。OPAL初衷设计是包含任何电话通信协议,所以其底层进行了高度的抽象化,所以也能够很容易的支持MGCP,PSTN和将来会出现的协议。不过由于Openh323的最后一个版本还在开发中,所以原本6月发布的OPAL也被推迟,现有的OPAL还非常不完善,BUG也非常多,不过相信以Openh323的开发班底,一定能让OPAL十分优秀。
CVS : :pserver:anonymous@cvs.sourceforge.net:/cvsroot/openh323/opal
Language : C++
VxWorks port : Yes
Win32 port : Yes
Linux port : Yes
Supports RFC 3261 : Yes
Supports RFC 2327 : Yes
Supports RFC 3264 : Yes
Supports RFC 3263 : No
Supports RFC 3515 : Yes
Supports RFC 3262 : No
Supports RFC 3311 : No
TCP : Yes
UDP : Yes
SIZE : 8MB
License : MPL
Document : None
Samples : UA,GK
......
SIP的RFC中文文档(RFC3261)(7)(2005-12-15 14:48:00)
摘要:8.1.2 发送一个请求
于是,我们就开始查找请求发送的目标。除非有其他的特定说明,目标必须是通过DNS来查找的(参见[4]说明)。如果路由表(route set)中的第一个元素表明这是一个严格路由(strict router,在12.2.1.1节中讲述),那么这些过程必须在请求的Request-URI中说明。否则,这些过程在请求中被应用于第一个Route头域中(如果存在),或者在请求的Request-URI中(如果Route头域不存在)。这样一些过程产生了一系列的地址,端口,和用于传输的传输器。无论那个URI用在这个[4]中描述的过程的输入,如果Request-URI指明了SIPS,那么UAC必须按照[4]中描述的说明来认为输入的URI是SIPS的URI。
本地策略可以指定一套额外的目的地用于发送。如果Request-URI包含一个SIPS URI,任何额外的目的地都必须用TLS来表达。除此之外,如果请求没有包含Route头域,那么就没有对额外的目的地有什么其他的限制了。这个就提供了一个简单的外发(outbound)proxy的事前路由的选择。但是,用这样的方法配置一个外发proxy是不推荐的;应该由单个UPI规定的预先设定的路由集来指定外发proxy。如果请求包含了Route头域,请求应该发送到Route头域最上边的一个位置,但是请求也可能被发给由本文档约定的Route或者Request-URI所指定的服务器(同RFC2543定义的相反)。特别的,一个配置了外发proxy的UAC应该首先尝试把请求发送给由第一个Route头域值指定的位置,而不是采用把所有消息都发给外发proxy的策略。这就保证了外发的proxy通过不增加Record-Route头域而不参与后续请求的路径。这个也允许让不能分析第一个Route URI的终端,把请求交给外发proxy来发送。UAC应该遵循[4]中定义的过程来实现有状态的元素,尝试每一个地址直到连接到一个服务器。每一个尝试都是一个事务,因此,每一个都有一个不同的Via头域值和一个新的branch参数值。
此外,在Via头域中的transport的值被设置成为要到目标服务器所必须的transport。
8.1.3 处理应答
应答首先是被transport层处理,并且被transport层发送给上一层transaction层处理......
SIP的RFC中文文档(RFC3261)(6)(2005-12-15 14:48:00)
摘要:8 一般用户代理行为
一个用户代理代表了一个终端系统。它包含一个用户代理客户端(UAC),用来产生请求的,它包含一个用户代理服务端(UAS),用来响应请求的。UAC可以由一些外部的东西来发出请求和处理应答(比如用户按了一个按钮,或者按下了一个电话键产生了一个音频信号等等)。UAS是一个能够接收请求,并且产生应答的东西,它可以根据用户输入,外部输入,程序执行结果或者其他什么机制来产生应答。
当一个UAC发送一个请求,这些请求可能通过一些PROXY(代理服务器)传递到UAS上。当UAS产生一个应答,那么这个应答就会同样的被传送到UAC。UAC和UAS的处理由两个特点。第一,基于请求或者应答是否在一个对话里,第二,基于请求的方法(method)。会话的彻底描述在第12节;哪里描述了点对点的用户代理之间的关系,并且通过一些SIP方法建立了会话,比如INVITE方法等。
在本节,我们将讨论在处理对话外的请求时,UAC和UAS的方法无关的规则。这些当然也包括用于建立会话的请求。在26节讲述了对在对话外的请求和应答的安全处理。特别时,UAS和UAC之间的互相认证的机制。通过用S/MIME加密的消息体可以提供有限的隐私保证。
8.1 UAC特性
本节讲述UAC在会话外的特性。
8.1.1 产生一个请求
一个合法的SIP请求必须至少包含如下头域:TO,FROM,Cseq,Call-ID,Max-Forwards, Via;这些字段在所有SIP请求中必须包含。这6个字段是SIP消息的基本组成部分,他们提供了用于路由用的核心信息,包含了消息的地址,响应的路由,消息传递次数,详细的顺序,事务的唯一标志。
这些头域字段是必须包含在请求行之后的,请求行包含了请求的方法,Request-URI,SIP的版本号码。
有两个在对话外的发送请求的示例(通过INVITE请求建立连接,第13节),(通过OPTIONS请求查询负载,第11节)。
8.1.1.1 Request-URI
最开始的Request-URI头域应该是TO头域的的值。但是在REGISTER方法中,有一个值得注意的不同;REGISTER方法的Request-URI头域在第10节中指出。出于隐私的原因而把这些字段的值设置成为同一个值并不太合适(尤其是如果初始的UA期望Request-U......
SIP的RFC中文文档(RFC3261)(8)(2005-12-15 14:46:00)
摘要:8.2 UAS特性
UAS在处理对话外的请求的时候,有一组规则需要遵守,这组规则与方法无关。12节指明了一个方法来判定一个请求是否在一个对话里。
注意,请求的处理是原子级别的。如果请求被处理,那么这个请求的相关状态一定是一起更新的。如果它被拒绝了,那么这个请求的所有相关状态一定是没有改变的。
UASs应当遵循本节所规定的顺序来处理请求。(就是说,首先是身份认证,然后是方法判定,然后是头域,然后按照本文规定处理剩余部分)
8.2.1 方法判定
当请求被认证(或者身份认证被忽略),UAS必须首先判定这个请求的方法。如果UAS发现自己不能处理这个请求的方法的时候,它必须给出一个405(方法不支持)的应答。产生应答的步骤在8.2.6节规定,并且UAS必须在给出的405(方法不支持)应答中增加一个Allow头域。这个Allow头域必须列明哪些方法UAS支持。Allow头域的说明在20.5节。
如果请求中的方法是服务器所支持的,那么处理将继续。
8.2.2 包头判断
如果UAS不认识请求中的包头域(就是说,包头域不在本规范中定义或者不在任何扩展中定义),那么服务器必须忽略掉这个包头域并且继续处理本请求。UAS必须忽略任何处理本请求所不需要的长得畸形的包头域。
8.2.2.1 TO 和Request-URI
To头域包含了由From域描述的发送者发出的请求的原始接受者。原始接受者可能是也可能不是正在处理这个请求的UAS,取决于呼叫转移或者其他的proxy操作。当TO域值和自身不相符的情况下,UAS可以自行决定是否接收这个请求。但是,我们依旧是建议UAS处理这个请求,甚至TO这个头域是以他们不认识的URI方案表达的(比如一个tel:URI),或者To头域并非指向这个自身处理的UAS。当然,另外一方面来说,如果UAS决定拒绝这个请求,它应该产生一个403(禁止访问)的状态码,并且交给服务器的transaction层来发送。
但是,Request-URI确定UAS来处理这个请求。如果Request-URI使用了一个UAS所不支持的方案(比如tel:URI),那么UAS应当拒绝这个请求,并且给出拒绝代码416(不支持的URI方案)。如果Request-URI并没有指明本UAS来处理这个请求,那么UAS应当给出一个404(未找到)的应答。比如,一个UA使用REGIST......
SIP的RFC中文文档(RFC3261)(5)(2005-12-15 14:41:00)
摘要:7、SIP消息:
SIP协议是一个基于文本的协议,使用UTF-8字符集(RFC2279[7])。
一个SIP消息既可以是一个从客户端到服务器端的请求,也可以是一个从服务器端到客户端的一个应答。
即使在字符集上和语法细节上有所不同,请求(7.1)还是应答(7.2)消息都基于RFC2822格式的。(SIP允许包头域不是标准的RFC2822包头域)。这两种消息类型都由一个起始行,一个或者多个包头域,一个可选的消息中文组成。
一般消息= 起始行
*消息包头
CRLF
[消息正文]
起始行= 请求行/状态行
起始行、每一个包头行,空行、都必须由回车换行组成(CRLF)。即使消息中文没有,也必须有一个空行跟随。
除了在字符集上的区别以外,很多SIP的消息和包头域的格式都同HTTP/1.1一样。我们在这里就不重复它的语法和语义了,我们用[HX.Y]来标志HTTP/1.1规范(RFC2616[8])的X.Y节的描述。
SIP并非一个HTTP的超集或者扩展。
7.1 请求
SIP请求是根据起始行中的Request-Line来区分的。一个Request_line包含方法名字,Request-URI,用单个空格(SP)间隔开的协议版本。
Request-Line由CRLF结束。除了用作行结束标志以外,不允许CR或者LF出现在其他地方。在其他域中,不允许出现线形的空白(liner whitespace LWS)
 ......
SIP的RFC中文文档(RFC3261)(4)(2005-12-15 14:40:00)
摘要:5、协议的结构
SIP是一个分层的协议,意思是说SIP协议由一组相当无关的处理层次组成,这些层次之间只有松散的关系。协议分成不同层次来描述是为了能够更清晰的表达,在同一个小节里有功能的公共要素的交叉描述。本协议并没有规定一个具体的实现。当我们说一个要素”包含”某一个层,我们的意思是这个要素复核这个层定义的规则。
不是SIP每一个要素都一定包含每一个层。此外,SIP定义的要素是逻辑上的要素,不是物理要素。一个物理的实现可以实现不同的逻辑要素,或许甚至是基于串行事务处理原理。SIP最底层的是它的语法和编码层。编码方式是采用扩展的Backus-Naur Form grammar(BNF范式)。完整的BNF描述在25节;第7节有简要的SIP消息结构描述。
第二层是传输层。它定义了一个客户端如何发送请求和接收应答,以及一个服务器如何接收请求和发送应答。所有的SIP要素都包含一个通讯层。第18节有通讯层的描述。
第三层是事务层。事务是SIP的基本组成部分。一个事务是客户发送的一个请求事务(通过通讯层)发送到一个服务器事务,连同服务器事务的所有的该请求的应答发送回客户端事务。事务层处理应用服务层的重发,匹配请求的应答,以及应用服务层的超时。任何一个用户代理客户端(user agent client UAC)完成的事情都是由一组事务构成的。有关事务的讨论在第17节有描述。用户代理包含一个事务层,来实现有状态的代理服务器。无状态的代理服务器并不包含事务层。事务层包含一个客户元素(可以认为是一个客户事务)和一个服务器元素(可以认为是一个服务器事务),他们都可以用一个有限状态机来处理特定的请求。
在事务层之上是事务用户(TU)。每一个SIP实体,除了无状态代理,都是一个事务用户。当一个TU发出一个请求,它首先创建一个客户事务实例(client transaction instance)并且和请求一起发送,这包括了目标IP地址、端口号、以及发送请求的设备。TU可以创建客户事务,也可以取消客户事务。当客户取消一个事务,它请求服务器终止正在处理的事务,并且回滚状态到该事务开始前的状态,并且产生指定的该事务的错误报告。这是由CANCEL请求完成的,这个请求有自己的事务,并且包含一个被取消的事务(第9节)。
......
SIP的RFC中文文档(RFC3261)(3)(2005-12-15 14:38:00)
摘要:
当Alice的softphone收到180(Ringing)应答的时候,它提示Alice,可能是通过一个回铃音,或者屏幕上的一个消息提示。
在这个例子中,Bob决定响应这个呼叫。当他拿起电话,他的SIP电话发送200(OK)回应给发送者,表示这个电话已经接起来了。这个200(OK)包含了一个消息体,这个消息体包含SDP媒体描述,这个媒体描述包含Bob希望和Alice建立何种媒体连接。同样,SDP消息也是两段交换:Alice发送一个给Bob,Bob发送一个回给Alice。这个两段的交换提供基本的兼容性协商,并且基于简单的SDP提出/应答交换模型。如果Bob不想响应这个呼叫或者正在响应别的呼叫,一个错误的响应会代替正常的200(OK)回送出去,这样,就不会有连接建立。SIP完整的返回代码在21节有介绍。Bob发出的200(OK)(图一的F9消息)可能长得像这样的:
SIP/2.0 200 OK
Via: SIP/2.0/UDP server10.biloxi.com
;branch=z9hG4bKnashds8;received=192.0.2.3
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com
;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com
;branch=z9hG4bK776asdhds ;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 INVITE
Contact: <sip:bob@192.0.2.4>
Content-Type: application/sdp
Content-Length: 131
(Bob’s SDP not shown)
应答的第一行包含了应答代码(200)和原因(ok)。剩......