1、什么是SIP
SIP(会话发起协议)属于IP应用层协议,用于在IP网上为用户提供会话应用。会话(Session)指两方或多方用户之间的语音、视频、及其他媒体形式的通信,具体可能是IP电话、会议、即时消息等等。
SIP是一个信令协议,它对应于传统电话网络中的呼叫信令协议(比如SS7ISUP)。构建一个完整多媒体通信架构还需要结合其他一些协议,必要的有:RTP,用于媒体传输;RSVP,用于QOS保证等等。
2、基本功能
2.1 会话的发起与管理
SIP主要用于创建、修改和终止一个会话。
一个创建会话的简单的例子如下图所示:
一个修改会话的简单例子如下图所示:
一个结束会话的简单的例子如下图所示:
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请求消息有很多种,分别完成各种操作的调用,实现各种功能,下面进行简单的介绍。
上面的4个请求用于会话建立与管理。
上面的3个请求构成SIP事件发布-订阅-通知机制
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请求消息有很多种,分别完成各种操作的调用,实现各种功能,下面进行简单的介绍。
上面6个头域是所有SIP消息中的必需的头域。
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