安全对于提供的服务来说特别重要。要达到理想的安全程度,SIP提供了一套安全服务,包括防止拒绝服务,认证服务(用户到用户,代理到用户),完整性保证,加密和隐私服务。
SIP可以基于IPV4也可以基于IPV6
3、术语
在这个文档中,关键词”必须”,”不允许”,”要求”,”可以”,”不可以”,”应该”,”不应该”,”建议”,”不建议”,”可能”,”可选” 是根据BCP14,RFC 2119[2]的规范描述SIP实现需要的不同层次
4、实施概览
这节通过简单的示例介绍了SIP的基本实现。本节是通过自然的而非正则的示例来介绍的。
第一个例子说明了SIP的基本功能:定位一个断点,发出通讯请求,通过协商会话参数建立会话,拆卸刚才建立的会话。
图一表示一个典型的Alice和Bob两个用户间的SIP消息交易交换例子.(每一个消息采用字母”F”和一个用来指向正文的一个数字做标记)在这个例子里,Alice在她的PC上使用一个SIP的应用程序(比如说一个软的电话),呼叫Bob在Internet上的一个SIP电话。这个例子也掩饰了两个SIP代理之间,怎样为Alice和Bob建立会话连接。This typical arrangement is often referred to as the "SIP trapezoid" as shown by the geometric shape of the dotted lines in Figure 1.
Alice 通过Bob的SIP标志 “呼叫” Bob,这个SIP标志是统一分配的资源(Uniform. Resource Identifier URI)称作SIP URI。SIP URI在19.1节中定义。它很像一个email抵制,典型的SIP URI包括一个用户名和一个主机名。在这个范例中,SIP URI是sip:bob@biloxi.com,biloxi.com是Bob的SIP服务提供商。Alice有一个SIP URI: sip:alice@atlanta.com。 Alice可以输入Bob的URI,也可以直接在地址本的一个超级链接上点击一下Bob的URI。SIP也提供保密URI,称作SIPS URI。例如:sips: bob@biloxi.com。 一个基于SIPS URI的通话保证这个通话是安全的,并且对呼叫者和被叫的所有的SIP消息是加密传输的(叫做TLS)。在TLS中,请求是通过加密方式传输给被叫方,但是这个加密机制是基于被叫方宿主服务器的实现的。
SIP是基于一个类似HTTP协议的请求应答的通讯模式。每一个通讯都包含对某个功能的请求,并且起码需要一个应答。在这个应答中,Alice的软电话发送一个含有Bbo的SIP URI抵制的INVITE通讯请求。INVITE是一个SIP请求的例子,表示请求方(Alice)希望服务方(Bob)应答。INVTE请求包含一系列的包头域(Header fields)。包头中包含很多属性并且包含了传输消息的附加信息。在INVITE中有如下的字段:呼叫的唯一标志,目的抵制,Alice的地址,Alice和Bob建立会话的类型。INVITE请求(图1中的F1)可能看起来像这样的:
INVITE sip:bob@biloxi.com SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
Max-Forwards: 70
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 INVITE
Contact: <sip:alice@pc33.atlanta.com>
Content-Type: application/sdp
Content-Length: 142
(Alice’s SDP not shown)
在这个例子中,200(OK)应答通过两个代理并且发送到Alice的softphone上,Alice的softphone收到这个应答,停止振铃,并且标志电话Bob已经接听。最后,Alice的电话发送一个确认消息,ACK,到Bob的SIP电话来确认接收到了这个最后的200(o’k)应答。在这个例子中,ACK信号是直接由Alice的softphone发送到Bob的SIP phone上,跨过了两个代理服务器。这是因为两个端点(Alice和Bob)通过INVITE/200(OK)的请求应答包中的Contact包头域都知道互相之间的地址了,这个地址是最开始发起INVITE请求的时候所不知道的。所以,不需要两个代理服务器再查找对方的地址了,所以代理服务器不参与接下来的通话流了。这就完成了一个完整的使用INVITE/200/ACK 三方握手来建立SIP会话的过程。会话建立过程中的细节描述再13节由描述。
现在,Alice和Bob的媒体会话开始了,他们通过发送刚才建立会话所交换的SDP包中约定的互相明白的媒体包来进行会话。一般情况下,端到端的媒体包和SIP信号控制包通过不同的通讯路径来发送。
在会话中,Alice或者Bob都可以改变他们自己的媒体会话属性。这个可以通过发送一个包含新媒体属性描述的re-INVITE请求来完成。这个re-INVITE是捆绑在一个现有的会话的,这样参与会话的对方可以明白这是要改变现有的会话属性而不是新建立一个会话。对方收到这个re-INVITE请求后,会发送一个200(OK)应答表示接受这个改变。请求方通过一个ACK来表示接受了对方的这个200(OK)应答。如果对方不同意这个媒体属性变化,他会发送一个错误的应答比如488(暂时不能进行),这个也会收到发起者的一个ACK响应。不管怎样,就是是re-INVITE的失败也不会影响到现有的会话-原有的会话还可以用上次的媒体会话属性继续。可以在14节找到会话属性更改的细节说明。
在通话结束的时候,Bob首先断开(挂机hangs up),并且发送一个BYE的消息。这个BYE的消息将直接送到Alice的softphone,同样是跳过代理的。Alice通过发送200(OK)应答来确认收到了这个BYE消息,这个消息终止了会话并且应答了BYE的请求。ACK在这里不需要发送-一个ACK信号只在响应一个INVITE的响应的时候被发送。我们稍晚一点会讨论这个INVITE的特别处理,但是基于SIP的可靠性的机制,一个通话的时间可以认为包含电话振铃和挂机的时间(but relate to the reliability mechanisms in SIP, the length of time it can take for a ringing phone to be answered, and forking.)基于这样的原因,SIP请求的处理通常根据是否INVITE请求进行分类,INVITE类和非INVITE类请求分开处理。结束会话的细节可以在15节查到。
24.2节描述了图1中使用的全部消息详细解释。在某些情况下,所有会话中的包都继续通过代理转发会很有用。比如,如果biloxi.com代理服务器希望在INVITE之后继续保持SIP消息流,他会在INVITE中增加一个头域(Record-Route)包含一个URI指向这个代理服务器的hostname或者IP地址。这个消息会被Bob的SIP电话和Alice的softphone所接到(因为Record-Route头域将在200(OK)应答中被送回),并且在会话中一直保存。那么biloxi.com代理服务器就可以继续接收和转发ACK,BYE,给BYE的200(OK)应答。每一个代理都可以单独决定是否接收INVITE以后的后续消息,并且这些后续消息都可以被发送到那些决定接收后续消息的代理服务器。这种情况通常发生在提供mid-call业务的代理服务器上。
登记服务是另一个常用的SIP操作。登记服务是biloxi.com代理服务器知道Bob当前地址的一个方法。在初始化的时候,或者每隔一段时间,Bob的SIP 电话发送REGISTER消息给biloxi.com的一个注册服务器。REGISTER消息包含了Bob当前登陆服务器的SIP或者SIPS的URI(sip:bob@biloxi.com)(转换成为Contact域中的SIP或者SIPS URI)。登记服务器登记这个映射,这个叫做绑定(binding),写到一个数据库里边,叫做定位服务(location service),这个数据库可以被biloxi.com的代理服务器使用。通常登记服务器和代理服务器是做在一起的。一个很重要的概念就是SIP服务器的差别在逻辑上,并非在物理上的差别。
Bob并没有限定非得在一个单个设备上发起注册。比如,他家里的SIP电话和公司的SIP电话都可以注册。这些消息在定位服务(location service)中保存,并且允许代理服务器通过不同的手段查找Bob。同样的,不同的用户也可以在同一个设备上同时注册。
定位服务(location service)是一个逻辑概念。他是让代理服务通过输入一个URI来查询到底应该向哪里转发请求。可以简单通过用户注册来建立这个定位服务所需要的资料,也可以通过其他方法。可以通过其他任意的地址映射方式来实现定位服务。
最后在SIP中需要注意的是,注册服务只是用来提供路由收到的SIP请求的,它并不做请求的身份认证的判定。在SIP中授权和认证可以通过建立在基于请求/应答的模式上的上下文相关的请求来实现,也可以使用更底层的方式来实现(具体在26节有描述)。
完整的注册SIP消息描述例子在24.1节。
其他SIP的操作,比如检查SIP服务器的负载,或者使用客户端使用可选项(OPTIONS),或者用CANCEL取消一个未决的请求,在后续的章节中会介绍。
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要素,包含,用户代理客户端和服务器,无状态和有状态代理服务器和注册服务器,包含一个可以互相区别的核心(Cores)。Cores,除了无状态代理服务器,都是事务用户。UAC(用户代理客户端)和UAS(用户代理服务端)的cores的行为依赖于实现,对所有的实现来说,有几个公共的原则(第8节)。对UAC来说,这些规则约束请求的建立;对UAS来说,这些规则约束请求的处理和应答。由于注册服务在SIP中是一个重要的角色,所以UAS处理REGISTER请求有一个特别的名字:登记员(registrar,登记服务器)。第10节描述了UAC和UAS的对REGISTER实现的core(核心)行为。第11节描述了OPTIONS的UAC和UAS的core实现,这个OPTIONS用来检测UA的处理能力的(UA-user agent)。
在对话中,有其他的相关会被发送。一个对话是一个持续一定时间的两个用户之间的端到端的SIP关系。对话过程要求两个用户代理之间的信息是有序的而且请求被正确路由传输的。在这个规范中,只有INVITE请求可以用来建立会话。当一个UAC在一个对话中发出请求的时候,它不仅遵循第8节描述的一般UAC规则而且也遵循对话中的请求规则。第12节讲述了对话并且讨论了对话的创建和维持,以及在对话中创建一个请求。
SIP中最重要的方法就是INVITE方法,它用来在不同的参与者中创建会话使用。一个会话由一组参与者,他们之间用于交流的媒体流组成。第13节讲述了这些会话的创建初始化过程,以及创建一个或一组对话。第14节讲述了在对话中使用INVITE请求来改变会话的属性。最后,第15节,讲述了如何终止会话。
第8、10、11、12、13、14、15节讲述了完整的UA核心(第9节描述了取消,在UA核心和代理核心中使用)。第16节讲数了代理服务器,代理服务器用于在两个UA之间做消息路由使用。
6、协议的定义
以下讲述的名次对SIP有着额外的意义:
Address-of-Record: 记录地址。一个address-of-record(AOR)是一个SIP或者SIPS URI它指向了一个具有定位服务的主机,这个主机可以把URI映射成为用户真正物理位置的URI。通常情况下,定位服务器是通过登记服务来建立的。一个AOR经常被认为是一个用户的”公共地址”
Back-to-Back UserAgent:背对背的用户代理(B2BUA)是一个逻辑实体,它就像用户代理服务器(UAS)一样接收和处理请求。为了决定该如何应答一个请求,B2BUA就像UAC一样工作,并且发出请求。但是它不像代理服务器(proxy),它维持对话状态,并且参与已经建立的对话中的每一个请求。由于它是直接的UAC和UAS的串连,所以,不需要对他有额外的定义。
Call:呼叫,一个呼叫是一个非正式的术语,它是指在端点之间一个一些通讯行为,通常用于建立多媒体对话。
Call Leg: 对话的别名;在本规范中没有使用。
Call Stateful: 如果一个代理服务器(proxy)保存一个对话的状态(从最开始的INVITE到对话终结的BYE),那么这个代理服务器就是请求有状态的。一个请求有状态(call stateful)的代理服务器也一定是事务有状态的,但是事务有状态的不一定是请求有状态的。
Client:客户端。一个客户端是一个任意的网络元素,它发出SIP请求和接收SIP应答。客户端可能会也可能不会和人交互。用户代理客户端(UAC)和代理服务器都是客户端。
Conference: 一个包含多个参与方的多媒体会话(见后)。
Core:核心。核心定义了SIP实体的特定类别。比如定义了一个有状态和无状态的代理服务器,一个用户代理或者注册服务器(registrar)。所有的核心,除了无状态代理服务器,都是事务用户。
Dialog:对话,一个对话是持续一段时间的两个UA之间的端到端的SIP关系。一个对话由SIP消息建立,就像用2xx响应INVITE请求。我们用Call identifier,local tag(本地tag),remote tag(对方tag)来标志一个对话,一个对话在RFC 2543中被正式叫做CALL LEG.
Downstream: 它是事务中的消息传递方向。它特指从UAC到UAS的请求流的方向,
Final Response:终结响应。一个响应终端SIP事务的应答,和事务中间的临时响应相反。所有的2xx,3xx,4xx,5xx,6xx响应都是终结响应。
Header:头。头域是在SIP消息头部用来描述这个SIP消息信息的部分。它由一堆头域字段组成。
Header Field:头域字段。头域字段是在SIP消息头域的字段。一个头域字段可以由多个头域字段行组成。一个头域字段由一个头域名和(零个或多个)头域值组成。多个头域值用’,’分割。某些头域字段只能有单个值,比如结果域(result)就只能有一个值。
Header Field Value:头域值。一个头域值是一个单个的值,一个头域字段可以有0个或者多个头域值。
Home Domain:宿主机。一个提供SIP服务的主机。一般指的是在登记服务中指明的记录地址中的URI的主机。
Informational Response:提示应答。和临时应答一样。
Initiator, Calling Party, Caller: 用INVITE初始一个会话(和对话)的那方。一个caller从发出INVITE请求建立对话开始,到对话终止都一直是这个角色。
Invitation: 一个INVITE请求。
Invitee,Invited User,Called Party, Callee:被叫方。收到INVITE请求并且建立会话的那方。一个被叫方从收到INVITE请求起,到终止INVITE建立的对话结束,都称作被叫方。
Location Service: 定位服务。定位服务是用来给SIP转发或者代理服务器确定被叫方可能的位置使用的。它包含一张绑定了address-of-record的表,被叫方可能有0到多个记录。绑定的记录可以通过多种渠道添加和删除;本规范定义了REGISTER方法来更新绑定表。
Loop:环路。当请求抵达一个代理服务器,代理服务器转发这个请求,当这个请求再次来到同一个代理服务器,就称之为环路。当第二次抵达的时候,Request-URI中包含了上次抵达的资料,并且由于并没有什么东西可以改变转发的策略,这样就导致这个请求还会再次被转发回来。环路请求是错误的,所以,处理程序需要检测和防止协议中出现的环路请求。
Loose Routing:丢失路由。代理服务器在下述情况下会丢失路由。
A proxy is said to be loose routing if it follows the procedures defined in this specification for processing of the Route header field. These procedures separate the destination of the request (present in the Request-URI) from the set of proxies that need to be visited along the way (present in the Route header field). A proxy compliant to these mechanisms is also known as a loose router.
Message:消息。SIP元素之间传送的协议数据就是消息。SIP消息既可以是请求也可以是应答。
Method:方法。方法是在服务器请求处理的主要功能。方法是请求消息自身携带的。典型的方法就是INVITE和BYE。
Outbound Proxy:对外代理服务器。一个代理服务器接收到客户的请求,即使它不是由Request_URI所决定的服务器。通常一个UA会手工配置一个对外的代理服务器,或者可以通过一个自动配置的协议自动配置一个。
Parallel Search: 并行搜索。并行搜索情况下,代理服务器会向多个用户可能存在的地方发起请求,并且等待应答。同串行搜索不同的地方是,并行搜索不会等待上一个请求应答回来之后再发起下一个搜索,而是一个接一个的发起搜索请求。
Provisional Response: 临时应答。服务器用来标志自己正在处理的应答,但是本应答并不结束一个SIP事务。1xx应答就是临时的,其他应答标志着事务的结束。
Proxy,Proxy Server:代理、代理服务器。一个中间的实体。它本身即作为客户端也作为服务端,为其他客户端提供请求的转发服务。一个代理服务器首先提供的是路由服务,也就是说保证请求被发到更加”靠近”目标用户的地方。代理服务器对某些强制政策有用(比如,确认一个用户是否允许建立一个呼叫等)。一个代理服务器翻译,并且,如果有需要的话,再转发前会重写请求消息。
Recursion:回路、递归。一个客户端,在响应请求的时候产生新的到Contract包头域的URI请求的时候,会在3xx响应中陷入递归。A client recurses on a 3xx response when it generates a new request to one or more of the URIs in the Contact header field in the response.
Redirect Server:重定向服务器。一个重定向服务器是一个产生3xx应答的UAS服务器,指示客户端连接别的URI。
Registrar: 登记员。一个登记员(登记服务器)是一个接收REGISTER请求得服务器。他把请求得信息放到定位服务器中,这样可以让定位服务器很方便得查找位置信息。
Regular Transaction:常规事务。凡不包含INVITE,ACK,或者CANCEL方法得事务就是常规事务。
Request: 请求。 一个由客户端发到服务端得SIP信息,用于执行特定得功能。
Response:应答。一个由服务端发到客户端得SIP信息。用来标志从客户端发往服务端得请求处理得情况得。
Ringback: 回铃音。回铃音是一个信号音。是给呼叫方得一个信号表示被叫方正在振铃(Ringing)。
Route Set: 路由集。路由集合是一个顺序得SIP或者SIPS URI。这些URI描述了传递一个请求所必须经历得代理列表。一个路由集可以是自适应得,因为包头中包含了Record-Route(记录路由),也可以是依赖配置得到得。
Server:服务器。一个server是一个网络元素接收请求并且处理请求并且发送回应给请求方。典型得服务器就是代理服务器(proxies),用户代理服务器(user agent servers),重定向服务器,登记服务器。
Sequential Search:顺序查找。在顺序查找中,代理服务器顺序尝试联系地址,在处理下一个之前必须等待上一个请求已经有一个结束应答。一个2xx或者6xx系列得最终应答总是结束一个顺序查找。
Session:会话。根据SDP得描述:”一个多媒体会话是一个由多媒体发送方和接受方组成得集合,并且包括在发送方和接受方之间得数据流。一个多媒体会议是一个典型得多媒体会话。”(RFC 2327[1])(一个session在SDP订一下可以是一个或者多个RTP sessino)。在定义中,一个被叫方可以被多次邀请,被不同得呼叫方邀请,到同一个会话。在SDP中,一个会话可以被SDP用户名,session id,网络类型,地址类型,地址元素得一个集合串所规定。
SIP 事务:一个SIP事务是在客户端和服务端得事件,包括了从第一个由客户端发送到服务端得请求,到最后一个(非1xx)服务端向客户端发出得终结应答。如果请求是一个INVITE请求,并且终结应答是一个非2xx得应答,那么事务还包括一个ACK给服务器做应答。给INVITE请求的2xx应答的ACK回应,是一个独立的事务。
Spiral:回溯。一个回溯是指一个SIP请求,路由给一个proxy,并且转发,但是又被路由回这个proxy,但是不同于回路(递归)的是,这次路由回来的请求包的包头中,包含了不同于原请求的请求包部分,使得本次proxy决定的路由转发与上次不同。通常,这是说,请求的Request-URI不同于上次的Request_URI。一个回溯不是一个错误,不同于回路(环路loop)。通常导致这样的现象是呼叫转发(call forwarding)。一个用户呼叫joe@example.com。example.com代理服务器转发请求到Joe的PC,并且Joe的pc呼叫转移到bob@example.com。这个请求被转发回example.com代理服务器。可是这个并不是一个环路(loop)。因为请求的目的地址变成了另一个用户,这就是回溯,是一个合法的情况。
Stateful Proxy:有状态的代理服务器。在逻辑上,有状态的代理服务器就是处理一个请求的过程中,维持的一个本规范所定义的客户端和服务端的事务状态机。也是一个事务又状态代理服务器(transaction stateful proxy)。具体的stateful proxy在第16节定义。一个(事务)有状态代理服务器和一个call stateful proxy不是一回事。
Stateless Proxy:无状态的代理服务器。在逻辑上,无状态代理服务器在处理请求中,并不维持客户和服务端的事务状态机。一个无状态的代理服务器直接转发每一个接收到的请求和每一个接收到的响应。
Strict Routing:严格路由。路由处理规则如果复核RFC2543协议(and many prior work in progress versions of this RFC) 就是一个严格路由。在这个规则下,如果在包头中包含Route域,那么代理服务器就会删除Request_URI域内容。本文档并不要求一定要有严格路由,本文档只要求松散路由就可以了。支持严格路由的代理服务器也叫严格路由器。
Target Refresh Request: 目标刷新请求。一个Target Refresh Request是一个在对话中发出的请求,用来更改对话目标的请求。
Transaction User(TU):事务用户。在transaction 层之上的协议层。TU包括了UAC 核心,UAS core,和proxy core。