在通话结束的时候,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的行为依赖于实现(
method),对所有的实现来说,有几个公共的原则(第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。
Upstream:上行流。一个在事务中的消息流向方向。它是指由用户代理服务器(UAS)发出应答到用户代理客户端(UAC)的消息流向方向。
URL-encoded:一串根据RFC2396-2.4节编码的字符。
User Agent Client(UAC):用户代理客户端。用户代理客户端是一个逻辑的概念,他创建一个新请求,并且用客户事务状态机发送这个请求。UAC角色只在事务中存在。换句话说,UAC就是一小段代码初始化一个请求,并且在事务中遵循UAC的规则。如果它接下来收到一个请求,那么在那个事务中,它就是作为UAS来处理请求。
UAC Core:UAC核心。在transaction和transport层之上得UAC实现的功能集合。
User Agent Server(UAS): 用户代理服务器.UAS是一个逻辑的实体,对SIP请求做响应的。应答接受、拒绝、或者转发对应的请求。UAS角色在事务中存在。换句话说,是响应请求的一小段软件,在事务中作为UAS存在。如果他发出请求,那么他就在事务中作为UAC存在。
UAS Core:UAS核心。在transaction和transport层智商的UAS实现的功能集合。
User Agent(UA)。一个逻辑实体的概念,包含UAC和UAS。
UAC和UAS,就像代理服务器和转发服务器,是在事务by事务的原理(串行事务处理)上定义的。例如,当发出一个初始化INVITE请求的时候,UA作为UAC初始化一个呼叫动作,当从被叫方接收到一个BYE请求的时候,UA作为UAS响应。类似的,同样的代码可以对一个请求做为proxy服务器处理,对另一个请求作为重定向服务器。
proxy,location,registrar服务器都是逻辑实体,在它们的实现中,
可能是作为单个应用实现的。