http://blog.sina.com.cn/s/blog_6b10255301012db7.html

1、什么是SIP

SIP(会话发起协议)属于IP应用层协议,用于在IP网上为用户提供会话应用。会话(Session)指两方或多方用户之间的语音、视频、及其他媒体形式的通信,具体可能是IP电话、会议、即时消息等等。

SIP初步-LMLPHP

SIP是一个信令协议,它对应于传统电话网络中的呼叫信令协议(比如SS7 ISUP)。构建一个完整多媒体通信架构还需要结合其他一些协议,必要的有:RTP,用于媒体传输;RSVP,用于QOS保证等等。

SIP初步-LMLPHP

2、基本功能

2.1 会话的发起与管理

SIP主要用于创建、修改和终止一个会话。

一个创建会话的简单的例子如下图所示:

SIP初步-LMLPHP

  • 发起方向目的方发送一个SIP请求消息(INVITE),其中包含提议的会话参数的描述,请求在二者之间建立一个会话;
  • 目的方返回一个SIP响应消息(200 OK),其中包含接受的会话参数的描述,接受会话建立请求
  • 发起方发送一个SIP请求消息(ACK)确认会话的建立。

一个修改会话的简单例子如下图所示:

SIP初步-LMLPHP

  • 会话中的任意一方可以发送一个SIP请求消息(reINVITE),其中包含提议的新的会话参数,请求修改二者之间的会话;
  • 另一方返回一个SIP响应消息(200 OK),其中包含接受的新的会话参数,接受会话修改请求

一个结束会话的简单的例子如下图所示:

SIP初步-LMLPHP

  • 会话中的任意一方可以发送一个SIP请求消息(BYE),请求结束会话;
  • 另一方返回一个SIP响应消息(200 OK),接受会话结束请求

2.2 用户位置管理

SIP支持用户(终端)的移动性。

SIP要求终端定期向网络发送注册请求(REGGISTER),报告自己的当前位置。这样SIP服务器中始终存储了用户(终端)的当前地址。当用户被呼叫时,SIP服务器能够将SIP请求发送到用户的当前地址。

SIP初步-LMLPHP

3、实体 & 网络

SIP UA(User Agent,用户代理)是最基本的SIP实体,它通常就是用户终端。理想情况下,通过SIP UA就可以完成用户之间会话的建立。(参见第2节 SIP基本功能中的会话发起与管理)。

但是为了支持SIP的移动性,以及其他高级功能,比如运营商对呼叫的控制等等,会话发起及管理的信令过程不能直接在两个SIP UA之间完成,而是需要经过由若干SIP服务器构成的SIP信令网络。

SIP初步-LMLPHP

这些SIP服务器可以分为两类:注册服务器和路由服务器。

SIP注册服务器(registrar)的主要功能是接受SIP UA的注册请求,维护用户名-地址映射。

路由服务器的主要功能是将SIP消息路由到目标SIP UA。路由服务器有SIP重定向服务器(redirect server)和SIP代理服务器(proxy)两种。前者以重定向方式路由SIP请求消息,后者以代理方式路由SIP请求消息。

在重定向方式下(如下图所示),SIP重定向服务器收到了SIP请求消息,查询到目标SIP UA的当前地址后,通过SIP响应消息(302 Moved temporarily)返回给发起方SIP UA。之后的SIP消息交互与重定向服务器无关,发起方SIP UA直接向目标SIP UA的当前地址发送请求消息。

SIP初步-LMLPHP

在代理方式下(如下图所示),SIP代理服务器收到了SIP请求消息,查询到目标SIP UA的当前地址后,将SIP请求消息转发到目标SIP UA的当前地址。之后的SIP消息交互都要经过SIP代理服务器。这使得SIP代理服务器可以对会话进行控制,比如结束会话等等。

SIP初步-LMLPHP

4、SIP操作与SIP消息

SIP所提供的功能是通过一些原子性的基本功能(比如注册(registration),发起会话(Initiation)、会话结束等)组合而成的。每个原子性基本功能是通过一个SIP操作完成的。

SIP操作基于类似HTTP的请求/响应事务模型,每个操作的调用过程体现为一个所谓事务 – 包含一个SIP请求和一个或多个相应的SIP响应。其中SIP请求消息中的方法(Method)指示出调用的操作。

SIP初步-LMLPHP

下表是在RFC 3261中定义的方法及其对应的SIP操作。

方法Method

SIP操作

INVITE

会话邀请

ACK

确认会话邀请

CANCEL

取消会话邀请

BYE

结束会话

REGISTER

注册

OPTIONS

查询服务器能力

SIP是一个基于文本(text-based)的协议,使用 UTF-8 字符集。SIP消息与HTTP/1.1非常类似,同样可以包含消息体(message body),通常是会话描述(session descriptions),也可能是其他内容。

SIP 消息有两类:从客户机到服务器的请求消息(request),从服务器到客户机的响应消息(response)。

除了第一行分别是请求行(Request-Line)和状态行(Status-Line)以外,SIP请求消息和SIP响应消息的剩下部分的组成基本类似,包括消息头域(message header)和消息体(message body)两部分(如下图所示)。

SIP初步-LMLPHP

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 Session Progress”,以支持临时响应的可靠传送。它不能应用于“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所标识的) 应该使用请求中提供的信息联系第三方。典型应用:Call Transfer 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:[email protected]
  • From:源端SIP URL,标识请求发送方;UAC本地标签。
    例子:From: sip:+1-314-342-7360 @gateway.wcom.com; tag=1234567
  • To:目标SIP URL,标识请求接受方;UAS本地标签。
    例子:To: sip:[email protected]; tag=314
  • Via:用于记录请求经由的路径
    例子:Via: SIP/2.0/TCP uunet.com
  • Max-Forwards:消息最大转发次数。服务每次转发消息时将此域值减1,当变成0时,服务器发送 483响应(Too Many 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 [email protected]
    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在开机时注册。消息流如下图所示。注意为了简化流程,这里没有给出在注册时通常所必需的鉴权过程。

SIP初步-LMLPHP

消息细节:

这次注册的有效期为2个小时(7200秒)

注册服务器返回 200 OK 响应。

5.2 会话建立与拆除

会话建立是SIP的最基本的功能。

消息流如下图所示。

SIP初步-LMLPHP

消息内容:(注意这里并未给出会话媒体参数SDP的细节)

F1 INVITE Alice -> atlanta.com proxy

F2 100 Trying atlanta.com proxy -> Alice

F3 INVITE atlanta.com proxy -> biloxi.com proxy

F4 100 Trying biloxi.com proxy -> atlanta.com proxy

F5 INVITE biloxi.com proxy -> Bob

F6 180 Ringing Bob -> biloxi.com proxy

F7 180 Ringing biloxi.com proxy -> atlanta.com proxy

F8 180 Ringing atlanta.com proxy -> Alice

F9 200 OK Bob -> biloxi.com proxy

F10 200 OK biloxi.com proxy -> atlanta.com proxy

F11 200 OK atlanta.com proxy -> Alice

F12 ACK Alice -> Bob

F13 BYE Bob -> Alice

F14 200 OK Alice -> Bob

05-23 04:10