1、什么是SIP
SIP(会话发起协议)属于IP应用层协议,用于在IP网上为用户提供会话应用。会话(Session)指两方或多方用户之间的语音、视频、及其他媒体形式的通信,具体可能是IP电话、会议、即时消息等等。
SIP是一个信令协议,它对应于传统电话网络中的呼叫信令协议(比如SS7ISUP)。构建一个完整多媒体通信架构还需要结合其他一些协议,必要的有:RTP,用于媒体传输;RSVP,用于QOS保证等等。
- 发起方向目的方发送一个SIP请求消息(INVITE),其中包含提议的会话参数的描述,请求在二者之间建立一个会话;
- 目的方返回一个SIP响应消息(200 OK),其中包含接受的会话参数的描述,接受会话建立请求
- 发起方发送一个SIP请求消息(ACK)确认会话的建立。
一个修改会话的简单例子如下图所示:
- 会话中的任意一方可以发送一个SIP请求消息(reINVITE),其中包含提议的新的会话参数,请求修改二者之间的会话;
- 另一方返回一个SIP响应消息(200 OK),其中包含接受的新的会话参数,接受会话修改请求
一个结束会话的简单的例子如下图所示:
- 会话中的任意一方可以发送一个SIP请求消息(BYE),请求结束会话;
- 另一方返回一个SIP响应消息(200 OK),接受会话结束请求
2.2 用户位置管理
SIP支持用户(终端)的移动性。
SIP要求终端定期向网络发送注册请求(REGGISTER),报告自己的当前位置。这样SIP服务器中始终存储了用户(终端)的当前地址。当用户被呼叫时,SIP服务器能够将SIP请求发送到用户的当前地址。
3、实体 & 网络
SIP UA(User Agent,用户代理)是最基本的SIP实体,它通常就是用户终端。理想情况下,通过SIPUA就可以完成用户之间会话的建立。(参见第2节 SIP基本功能中的会话发起与管理)。
但是为了支持SIP的移动性,以及其他高级功能,比如运营商对呼叫的控制等等,会话发起及管理的信令过程不能直接在两个SIPUA之间完成,而是需要经过由若干SIP服务器构成的SIP信令网络。
这些SIP服务器可以分为两类:注册服务器和路由服务器。
SIP注册服务器(registrar)的主要功能是接受SIP UA的注册请求,维护用户名-地址映射。
路由服务器的主要功能是将SIP消息路由到目标SIP UA。路由服务器有SIP重定向服务器(redirectserver)和SIP代理服务器(proxy)两种。前者以重定向方式路由SIP请求消息,后者以代理方式路由SIP请求消息。
在重定向方式下(如下图所示),SIP重定向服务器收到了SIP请求消息,查询到目标SIPUA的当前地址后,通过SIP响应消息(302 Moved temporarily)返回给发起方SIPUA。之后的SIP消息交互与重定向服务器无关,发起方SIP UA直接向目标SIP UA的当前地址发送请求消息。
在代理方式下(如下图所示),SIP代理服务器收到了SIP请求消息,查询到目标SIPUA的当前地址后,将SIP请求消息转发到目标SIPUA的当前地址。之后的SIP消息交互都要经过SIP代理服务器。这使得SIP代理服务器可以对会话进行控制,比如结束会话等等。
4、SIP操作与SIP消息
SIP所提供的功能是通过一些原子性的基本功能(比如注册(registration),发起会话(Initiation)、会话结束等)组合而成的。每个原子性基本功能是通过一个SIP操作完成的。
SIP操作基于类似HTTP的请求/响应事务模型,每个操作的调用过程体现为一个所谓事务 –包含一个SIP请求和一个或多个相应的SIP响应。其中SIP请求消息中的方法(Method)指示出调用的操作。
下表是在RFC 3261中定义的方法及其对应的SIP操作。
方法Method | SIP操作 |
INVITE | 会话邀请 |
ACK | 确认会话邀请 |
CANCEL | 取消会话邀请 |
BYE | 结束会话 |
REGISTER | 注册 |
OPTIONS | 查询服务器能力 |
SIP是一个基于文本(text-based)的协议,使用 UTF-8字符集。SIP消息与HTTP/1.1非常类似,同样可以包含消息体(message body),通常是会话描述(sessiondescriptions),也可能是其他内容。
SIP 消息有两类:从客户机到服务器的请求消息(request),从服务器到客户机的响应消息(response)。
除了第一行分别是请求行(Request-Line)和状态行(Status-Line)以外,SIP请求消息和SIP响应消息的剩下部分的组成基本类似,包括消息头域(messageheader)和消息体(message body)两部分(如下图所示)。
4.1 SIP请求消息
根据请求行中的方法(method)的不同,SIP请求消息有很多种,分别完成各种操作的调用,实现各种功能,下面进行简单的介绍。
- INVITE/reINVITE:INVITE发起会话邀请。reINVITE(在一个已存在的对话中发送的INVITE称为reINVITE)修改已建立会话的参数。
- ACK:完成会话建立的3次握手 [INVITE-200-ACK],仅仅用于INVITE
- BYE :结束会话。
- CANCEL:取消正在建立中会话(INVITE已发送,但尚未收到最终响应(final response))。
- UPDATE:更新会话参数。它被建议用于替代 re-INVITE,与re-INVITE不同在于:它可以在初始INVITE未完成时发送,能用于在早对话(early dialog)中更新会话参数。
上面的4个请求用于会话建立与管理。
- REGISTER:登记UA当前的联系地址(contact)
- OPTIONS:查询服务器或对端UA的能力,具体包括支持的方法(method),扩展(extensions)、编解码(codecs)等。
- PRACK:临时响应(Provisional Response)确认。用于确认收到了临时响应,例如 “183 SessionProgress”,以支持临时响应的可靠传送。它不能应用于“100 Trying ”,只有101~199临时响应需要可靠传送。如果没有收到 PRACK,响应消息将被重传。
- NOTIFY:事件通知,具体的事件包括、业务状态的改变(MWI,...),用户状态的改变等等。
- SUBSCRIBE:订阅/取消(Expires=0)事件通知。
- PUBLISH:发布事件状态。PUBLISH 与 REGISTER的相似之处在于:允许用户在另一个实体(状态管理实体/registrar)中创建、修改和移除自己的状态。对PUBLISH请求的寻址与对于SUBSCRIBE 请求的寻址是一样的,PUBLISH 请求的Request-URI中填入的是用户希望发布其事件状态的资源地址。
上面的3个请求构成SIP事件发布-订阅-通知机制
- INFO:用于传送 mid-call 信令信息,同一时刻只能有一个 INFO 事务存在。通常用于携带 PSTN 信令消息(作为MIME 附件),例如,ISDN UUI (用户到用户信息)。
- MESSAGE:针对即时消息 (IM)的扩展,用于传送即时消息。MESSAGE请求通过MIME附件中携带内容。MESSAGE请求自身不发起 SIP 对话,在正常的用法中,每个即时消息都是单独存在的,非常类似 pager 消息。MESSAGE请求可以在其他SIP请求发起的对话上下文中发送。
- REFER:指示接收者 (Request-URI所标识的) 应该使用请求中提供的信息联系第三方。典型应用:CallTransfer features 。Allowed outside an established dialogue。
4.2 SIP响应消息
状态码 | 描述 | 例子 |
1xx | Informational 请求收到,处理中 | 180 Ringing 181 Call is Being Forwarded |
2xx | Success 操作已成功完成 | 200 OK |
3xx | Redirection 请求被重定向 | 300 Multiple Choices 302 Moved Temporarily |
4xx | Client Error 请求包含错误的文法,或者无法在本服务器上完成 | 401 Unauthorized 408 Request Timeout |
5xx | Server Error 请求有效,但服务器无法完成 | 503 Service Unavailable 505 Version Not Supported |
6xx | Global Failure 请求在任何服务器上都无法完成 | 600 Busy Everywhere 603 Decline |
4.3 SIP消息头域
根据请求行中的方法(method)的不同,SIP请求消息有很多种,分别完成各种操作的调用,实现各种功能,下面进行简单的介绍。
- Call-ID:用于唯一标识一个特定的会话或注册消息。应该具有随机性,保证全球唯一。
例子:Call-ID:31415926535@uunet.com - From:源端SIP URL,标识请求发送方;UAC本地标签。
例子:From: sip:+1-314-342-7360 @gateway.wcom.com; tag=1234567 - To:目标SIP URL,标识请求接受方;UAS本地标签。
例子:To: sip:10109000@operator.mci.com; tag=314 - Via:用于记录请求经由的路径
例子:Via: SIP/2.0/TCP uunet.com - Max-Forwards:消息最大转发次数。服务每次转发消息时将此域值减1,当变成0时,服务器发送 483响应(TooMany Hops response)。
例子:Max-Forwards: 10 - Cseq:请求序列号,用于区分同一个会话中的不同请求。
例如:CSeq: 1 INVITE
CSeq: 4325 BYE
CSeq: 1 REGISTER
上面6个头域是所有SIP消息中的必需的头域。
- Contact 另一个SIP URL用于直接消息路由。
例如:Contact: W. Riker, Acting Captain riker@starfleet.gov
Record-Route 需要自己处在后继消息的路径上时,proxy将自己的地址加插在请求消息中
例子:Record Route: sip.mci.com - Route 确定消息的选路
例子:Route: orinoco.brooks.net - Content-Length:消息体中的 Octet 数
例子:Content-Length: 285 - Content-Type:消息体内容类型
例子:Content-Type: application/sdp
5、详细的例子 (摘自IETF RFC 3261)
实际的例子可以帮助大家进一步地认识和理解前面的内容。这里的两个例子分别是关于SIP的两个最基本的功能:注册和会话建立。每个例子中给出了消息交互过程,以及必要的消息内容细节。
出于简明性的考虑,这里给出的消息的内容忽略了消息体及相应的头域(Content-Length和 Content-Type)。另外,还有一些头域比如Allow和 Supported 通常也会出现,但这里并未给出。
5.1 注册
Bob在开机时注册。消息流如下图所示。注意为了简化流程,这里没有给出在注册时通常所必需的鉴权过程。
消息细节:
F1 REGISTER Bob ->Registrar
REGISTER sip:registrar.biloxi.comSIP/2.0
Via: SIP/2.0/UDPbobspc.biloxi.com:5060;branch=z9hG4bKnashds7
Max-Forwards: 70
To: Bob<sip:bob@biloxi.com>
From: Bob<sip:bob@biloxi.com>;tag=456248
Call-ID: 843817637684230@998sdasdh09
CSeq: 1826 REGISTER
Contact:<sip:bob@192.0.2.4>
Expires: 7200
Content-Length: 0
这次注册的有效期为2个小时(7200秒)
注册服务器返回 200 OK 响应。
F2 200 OK Registrar -> Bob
SIP/2.0 200 OK
Via: SIP/2.0/UDPbobspc.biloxi.com:5060;branch=z9hG4bKnashds7;received=192.0.2.4
To: Bob<sip:bob@biloxi.com>;tag=2493k59kd
From: Bob<sip:bob@biloxi.com>;tag=456248
Call-ID: 843817637684230@998sdasdh09
CSeq: 1826 REGISTER
Contact: <sip:bob@192.0.2.4>
Expires: 7200
Content-Length: 0
5.2 会话建立与拆除
会话建立是SIP的最基本的功能。
消息流如下图所示。
消息内容:(注意这里并未给出会话媒体参数SDP的细节)
F1 INVITE Alice -> atlanta.com proxy
INVITE sip:bob@biloxi.com SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
Max-Forwards: 70
To: Bob <sip:bob@biloxi.com>
From: Alice<sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact:<sip:alice@pc33.atlanta.com>
Content-Type: application/sdp
Content-Length: 142
(Alice的 SDP 未显示)
F2 100 Trying atlanta.com proxy ->Alice
SIP/2.0 100 Trying
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>
From: Alice<sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Content-Length: 0
F3 INVITE atlanta.com proxy -> biloxi.comproxy
INVITE sip:bob@biloxi.com SIP/2.0
Via: SIP/2.0/UDPbigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
Max-Forwards: 69
To: Bob <sip:bob@biloxi.com>
From: Alice<sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact:<sip:alice@pc33.atlanta.com>
Content-Type: application/sdp
Content-Length: 142
(Alice的 SDP 未显示)
F4 100 Trying biloxi.com proxy -> atlanta.comproxy
SIP/2.0 100 Trying
Via: SIP/2.0/UDPbigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>
From: Alice<sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Content-Length: 0
F5 INVITE biloxi.com proxy -> Bob
INVITE sip:bob@192.0.2.4 SIP/2.0
Via: SIP/2.0/UDPserver10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
Via: SIP/2.0/UDPbigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
Max-Forwards: 68
To: Bob <sip:bob@biloxi.com>
From: Alice<sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact:<sip:alice@pc33.atlanta.com>
Content-Type: application/sdp
Content-Length: 142
(Alice的 SDP 未显示)
F6 180 Ringing Bob -> biloxi.com proxy
SIP/2.0 180 Ringing
Via: SIP/2.0/UDPserver10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
;received=192.0.2.3
Via: SIP/2.0/UDPbigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob<sip:bob@biloxi.com>;tag=a6c85cf
From: Alice<sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
Contact: <sip:bob@192.0.2.4>
CSeq: 314159 INVITE
Content-Length: 0
F7 180 Ringing biloxi.com proxy -> atlanta.comproxy
SIP/2.0 180 Ringing
Via: SIP/2.0/UDPbigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob<sip:bob@biloxi.com>;tag=a6c85cf
From: Alice<sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
Contact: <sip:bob@192.0.2.4>
CSeq: 314159 INVITE
Content-Length: 0
F8 180 Ringing atlanta.com proxy ->Alice
SIP/2.0 180 Ringing
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob<sip:bob@biloxi.com>;tag=a6c85cf
From: Alice<sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
Contact: <sip:bob@192.0.2.4>
CSeq: 314159 INVITE
Content-Length: 0
F9 200 OK Bob -> biloxi.com proxy
SIP/2.0 200 OK
Via: SIP/2.0/UDPserver10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
;received=192.0.2.3
Via: SIP/2.0/UDPbigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob<sip:bob@biloxi.com>;tag=a6c85cf
From: Alice<sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:bob@192.0.2.4>
Content-Type: application/sdp
Content-Length: 131
(Bob的 SDP 未显示)
F10 200 OK biloxi.com proxy -> atlanta.comproxy
SIP/2.0 200 OK
Via: SIP/2.0/UDPbigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob<sip:bob@biloxi.com>;tag=a6c85cf
From: Alice<sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:bob@192.0.2.4>
Content-Type: application/sdp
Content-Length: 131
(Bob的 SDP 未显示)
F11 200 OK atlanta.com proxy -> Alice
SIP/2.0 200 OK
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob<sip:bob@biloxi.com>;tag=a6c85cf
From: Alice<sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:bob@192.0.2.4>
Content-Type: application/sdp
Content-Length: 131
(Bob的 SDP 未显示)
F12 ACK Alice -> Bob
ACK sip:bob@192.0.2.4 SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds9
Max-Forwards: 70
To: Bob<sip:bob@biloxi.com>;tag=a6c85cf
From: Alice<sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 ACK
Content-Length: 0
现在Alice和Bob之间的媒体会话被建立。
Bob首先挂机。注意Bob的SIP 话机维护自己的 CSeq 编号空间,在这里是从231开始。因为是Bob 发送的请求,To 和From 头域的URIs和tags参数被掉换。
F13 BYE Bob -> Alice
BYE sip:alice@pc33.atlanta.com SIP/2.0
Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10
Max-Forwards: 70
From: Bob<sip:bob@biloxi.com>;tag=a6c85cf
To: Alice<sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 231 BYE
Content-Length: 0
F14 200 OK Alice -> Bob
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10
From: Bob<sip:bob@biloxi.com>;tag=a6c85cf
To: Alice<sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 231 BYE
Content-Length: 0