sip协议学习

一 SIP的消息整体描述

SIP消息用于会话连接的建立及修改。SIP消息有两种:客户机到服务器的请求(Request),服务器到客户机的响应(response)。

SIP消息包括三个部分SIP消息由一个起始行(start-line)一个或多个字段(field)组成的消息头、一个标志消息头结束的空行(CRLF)以及作为可选项的消息体(message body)组成,其中描述消息体(message body)的头称为实体头(entity header)。


   起始行分请求行(Request-Line)和状态行(status-line)两种,其中请求行是请求消息的起始行,状态行是响应消息的起始行,起始行位于消息的最开始。

   消息头分通用头(general-header)、请求头(request-header)、响应头(response-header)和实体头(entity-header)四种。


        消息头,描述消息的属性,类似于HTTP消息头的语法和语义,其中某些是完全照搬。

        消息体,消息体主要是对消息所要建立的会话的描述。典型的消息体为SDP(会话描述协议)格式,用来对所要建立的会话进行描述,例如建立一个多媒体会话的消息体中包含音频、视频编码及取样频率等信息的描述。消息体的类型采用MIME(多目的互联网邮件扩展)所定义的代码进行标识,如SDP的类型标识为application/SDP。除了SDP,消息体也可以是其他各种类型的文本或二进制数据。


(1)SIP请求消息

INVITE方法用于邀请用户和服务参加一个会话。在INVITE请求的消息体中可对被叫方被邀请参加的会话作以描述。如主叫方能接收的媒体类型、发出的煤体类型及其一些参数。对INVITE请求的成功响应必须在响应的消息体中说明被叫方愿意接收哪种媒体,或者说明被叫方发出的媒体。服务器可以自动地用200 OK响应会议邀请。

ACK请求用于客户机向服务器证实它已经收到了对INVITE请求的最终响应。ACK只和INVITE请求一起使用。对2xx最终响应的证实由客户机用户代理发出,对其它最终响应的证实由收到响应的第一个代理或第一个客户机用户代理发出。ACK请求的To、From、Call-ID、Cseq字段的值由对应的INIVITE请求的相应字段的值复制而来。

OPTIONS用于向服务器查询其能力。如果服务器认为它能与用户联系,则可用一个能力集响应OPTIONS请求;OPTIONS的From、To分91包含主被叫的地址信息,对OPTIONS请求的响应中的From、To(可能加上tag参数)、Call-ID字段的值由OPTIONS请求中响应的字段值复制得到。

BYE用户代理客户机用BYE请求向服务器表明它想释放呼叫。BYE请求可以像INVITE请求那样被转发,可由主叫方发出也可以由被叫方发出。呼叫的一方在释放(挂断)呼叫前必须发出BYE请求,收到BYE请求的这方必须停止发媒体流给发出BYE请求的这方。

CANCEL请求用于取消一个Call-ID、To、From和Cseq(仅序列号)字段值相同的正在进行的请求,但取消不了已经完成的请求(如果服务器返回一个最终状态响应,则认为请求己完成)。CANCEL请求中的Call- ID、To、Cseq的数字部分及From字段和原请求的对应字段值相同,从而使CANCEL请求与它要取消的请求匹配。

REGISTER方法用于客户机向SIP服务器注册列在To字段中的地址信息。

INFO方法是对SIP协议的扩展,用于传递会话中产生的与会话相关的控制信息,如:ISUP和ISDN信令消息,以及DTMF数字等。

其中INVITE和ACK用于建立呼叫,完成三次握手,或者用于建立以后改变会话属性;BYE用以结束会话;OPTIONS用于查询服务器能力;CANCEL用于取消己经发出但未最终结束的请求;REGISTER用于客户机向注册服务器注册用户位置等消息。

除了在建立会话时进行各种消息交互外,SIP终端还可以在会话过程中,发出消息改变或添加会话的某些属性。例如,用户在进行语音通话的过程中,想增加视频通信,他可以在不中断通话的情况下,发送新的INVITE消息,打开双方的视频媒体,使通话变成可视电话。这为用户的使用带来很大的灵活性。

(2)SIP响应消息

SIP协议中用三位整数的状态码(status code)和原因值(reason code)来表示对请求做出回答,状态码用于机器识别操作,原因短语(reason-phrase)是对状态码的简单文字描述,用于人工识别操作。状态码的第一个数字定义响应的类别,在SIP/2. 0中第一个数字有6个值,定义如下:

        lxx——暂时响应,表示请求已经收到,正继续处理请求。
  2xx——成功地响应,表示行动己经成功地收到,理解和接收。
  3xx——重定位响应,表示为完成呼叫请求,还必须采取进一步的动作。
  4xx——客户机错误,属于请求失败响应,表示请求有语法错误或不能被服务器执行。客户机需要修改请求,然后再重发请求。
  5xx——服务器错误,属于服务器失败响应,表示服务器出错,不能执行合法请求。
  6xx——全局失败响应,表示任何服务器都不能执行请求。

3 SIP的呼叫建立

3.1 SIP的直接呼叫

(1)首先,主叫向被叫发出INVITE请求。INVITE请求的作用是发起并建立呼叫,邀请被叫加入主叫建立的呼叫。

(2)被叫收到请求后对主叫做出响应。接受请求方对请求的响应分为临时响应(状态码为1xx)和最终相应(状态码为2xx)。主叫只对最终相应做出回应。图1中,被叫做出的临时相应有100Trying(尝试连接),180 Ringing(被叫振铃或进入受到请求状态),182 Queued(被叫可能有多个呼叫要处理,所以主叫请求需要排队等待);被叫做出的最终响应是200 OK,表示被叫接受并开始处理呼叫请求。

(3)为了向被叫证实主叫收到了最终响应,主叫收到响应后发送ACK请求。被叫收到主叫的ACK请求,标志呼叫建立阶段结束。

(4)主叫或被叫在呼叫建立后发起后续请求。后续请求可由参加呼叫的任一方发起。可发起INVITE请求,进行交互操作,并对当前呼叫进行修改;也可发起BYE请求终止当前呼叫。

SIP直接呼叫流程如图1所示。

SIP用户适配器在测试所用交换系统中结构如图2所示。

3.2 SIP在系统中的呼出流程

当基本呼叫进程分析呼叫信息,它会发送请求路由消息给路由管理模块,如果路由管理模块发现是SIP路由,它会返回SIP地址给基本呼叫进程,基本呼叫进程会将SIP地址添加到SETUP消息中发给SIP模块,当SIP模块收到从基本呼叫进程发来的SETUP消息,它将分配呼叫资源,呼叫ID,然后向进程发送消息,流程如图3所示。

3.3 SIP在系统中的呼入流程

当SIP模块从呼叫进程收到了INVITE消息,它将分配呼叫资源并且将呼叫ID和呼叫资源绑定,返回100消息给进程,发送SETUP消息给基本呼叫进程,流程如图4所示。

3.4 SIP在系统中的放音流程

如果有该SIP用户注册有放音服务,连接管理模块将会发送放音命令给SIP—UA模块,SIP—UA会向进程发送INVITE,在对方返回200OK后,SIP模块会发送放音命令回应给连接管理模块,然后进入放音阶段,流程见图5。
 SIP消息的组成 

有两种类型的SIP消息: 
● 请求:从客户机发到服务器 
● 响应:从服务器发到客户机 
SIP请求消息包含三个元素:请求行、头、消息体。 
SIP响应消息包含三个元素:状态行、头、消息体。 
请求行和头域根据业务、地址和协议特征定义了呼叫的本质,消息体独立于SIP协议并且可包含任何内容。 


SIP定义了下述方法:  


INVITE——邀请用户加入呼叫。 
BYE——终止一呼叫上的两个用户之间的呼叫。 
OPTIONS——请求关于服务器能力的信息。 
ACK——确认  被叫方  已经接收到 主叫方(发起方)对INVITE的最终响应。 
REGISTER——提供地址解析的映射,让服务器知道其它用户的位置。 
INFO——用于会话中信令。


IP里面的To和From字段是用来显示请求的方向,而不是消息的方向,方向是从请求方指向服务方。
clip_image001
      上图显示了两个启用了SIP的设备之间的 SIP 消息交互。 这两个设备可以是 SIP 电话、 手持设备、 掌上电脑或手机。 它假定两个设备已经连接到 IP 网络比如互联网,并且已经知道彼此的 IP 地址。
主叫方Tesla通过发送的一条SIP INVITE给被叫方Marconi来启动信息交互。 在 这条INVITE请求消息中包含了关于主叫方请求的会话或呼叫类型方面的细节。 它可以是一个简单的语音 (音频) 会话、类似于视频会议的多媒体会话或者它可能是一个游戏会话。
这条INVITE 消息包含以下内容:
 
INVITE sip:marconi@radio.org SIP/2.0
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
Max-Forwards: 70
To: G. Marconi <sip:Marconi@radio.org>
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 INVITE
Subject: About That Power Outage...
Contact: <sip:n.tesla@lab.high-voltage.org>
Content-Type: application/sdp
Content-Length: 158

v=0
o=Tesla 2890844526 2890844526 IN IP4 lab.high-voltage.org
s=Phone Call
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

因为SIP消息是基于文本编码的协议,所以这使得SIP消息看起来像UDP数据报在以太网上传输那样的在线传输。
 
INVITE消息中列出来的区域被称为头部区域。
 
       它们都有着这样的形式: 头标记:值 CRLF。
 
       第一行被称为开始行,该行标记了一种称为INVITE的方法,后面跟着的是请求的URI(Request-URI),最后是SIP版本号码2,它们之间使用空格来加以区分。SIP消息的每一行都用过CRLF来终结。请求的URI是SIP URI的一种特殊形式,它指明了请求要被发送到的资源,它也被称作请求目标。
      第二行的第一个字段是VIA, 每一个SIP设备产生或者转发一条SIP消息的时候都会在Via字段里面加上自己的地址 ,一般都是可以通过DNS解析的IP地址。Via字段包含了SIP版本 2.0,紧跟一个“/”,之后的UDP表示通过UDP进行传输,然后接着一个空格,接着是主机名或者IP地址,接着分号,最后是端口值。在上面的这个例子中是通用的SIP端口号5060。SIP的传输采用TCP、UDP、TLS和SCTP。端口号将在章节后面些的内容进行描述。 Branch参数是一个传输标记符。针对这条SIP信息的后续响应可以被相互关联上就是因为它们包含一样的传输标记。

      下一行的头标记是Max-Forwards,它被初始化为一个整数值,每个SIP服务器在接受和转发这个请求的过程中都会增加这个值,这个将简化环回检测。

      下一行就是To和From行了,它们标识了SIP请求的发起者和目标。如同本例一样,在名字标签被使用的情况下,SIP URI就被放在了括弧内,它将被使用来路由请求。在提醒过程中,名字标签将会被使用,但是却不会被协议本身所使用。
       Call-ID行是用来保持对特定SIP会话进行记录的标识符。SIP请求的发起者创建了本地唯一的字符串,然后通常会添加@和它的IP地址以便让该标识全球唯一。针对Call-ID,会话中的每一方都会贡献一个随机的标识符。这些标识符在每一次呼叫中都不一样。这些标识符被称为tag-(标签),在每一个会话建立之后,这些标签会被包含在To和From字段。最初的INVITE中包含了一个From 标签,但是在To中没有标签。
       用户代理(User Agent)产生一条INVITE来建立会话,同时也产生了唯一的Call-ID和From标签。回应这个INVITE的用户代理也将产生一个标签求。最终本地标签(包含在From)、远程标签(包含在To)以及Call-ID三个合在一起来唯一地标识建立起的会话,也被称作“对话”,对话的标识符被参与会话的双方用来识别特定会话,因为在同一时间,在它们之间可能会建立很多的会话。在该建立好的会话之后的后续请求也将使用这个会话标示符。它们将会在下面的实例中展示。
       下一行的头标记是CSeq,或者是command sequence(命令队列),它包含有一个数字,以及一个方法。在本例中是INVITE。在每一个新的请求被发送的时候,这个数字就会被增加。在本例中,它被初始化为1,但是也有可能从一个其它整数开始。
Via、Max-Forwards、To、From、Call-ID和CSeq构成了任何一条SIP请求语句里面的最小组成部分。其它的部分就可以作为可选附加信息或者针对于特别请求的必要信息。在这条INVITE消息里面,头标记Contact也是需要的,因为它包含了Tesla的通讯设备的SIP URI,也称作UA(用户代理),这个URI可以被使用来直接路由信息到Tesla。可选的头标记Subject(主题)也出现在这个例子里,它没有被协议所使用,但是却可以在振铃被叫方的时候显示出来以帮助被叫方决定是否接受这个呼叫。这点有点类似于电子邮件里面的From(发件人)和Subject(主题)。其它出现在这条INVITE消息内的头标记则包含了建立呼叫所必须的媒体信息。

Content-Type 和Content-Length头标记字段标识了消息体是SDP并且包含了158个字节的数据。

          关于158个字节的基本知识包含在了表2.1中。每行结尾的CRLF显示为??每一行的字节数据值显示在右边在消息主体和消息头部之间有一行空行把二者隔开。而消息头是以Content-Length结尾的在本例中,有7行SDP数据描述了呼叫者Tesla希望建立呼叫的媒体属性。这些媒体信息是必须的,因为SIP不知道将要建立的媒体会话的类型,所以呼叫者必须指明它想建立会话的类型(音频、视频、游戏),SDP字段的名字在表2.2中,并且在7.1章节会讨论,但是我们将快速的预览一下必要的基本信息。
表2.1: Content-Length Calculation 例子
LINE
TOTAL
v=0??
05
o=Tesla 2890844526 2890844526 IN IP4 lab.high-voltage.org??
59
s=Phone Call??
14
c=IN IP4 100.101.102.103??
26
t=0 0??
07
m=audio 49170 RTP/AVP 0??
25
a=rtpmap:0 PCMU/8000??
22
158


Table 2.2: SDP 实例数据
SDP 参数
参数名称
v=0
Version number
版本号码
o=Tesla 2890844526 2890844526 IN IP4 lab.high-voltage.org
Origin containing name
原始包含名字
s=Phone Call
Subject
主题
c=IN IP4 100.101.102.103
Connection
连接
t=0 0
Time
时间
m=audio 49170 RTP/AVP 0
Media
媒体
a=rtpmap:0 PCMU/8000
Attributes
属性

表2.2包含了
连接的IP地址:100.101.102.103
媒体格式:音频
端口号:49170
媒体支持的协议:RTP
媒体编码:PCM μ Law
采样率:8000Hz

                INVITE 只是SIP请求消息的一个例子,在RFC 3261和其它一些扩展RFC里共定义了5种方法或者其它的SIP请求。
           图2.1中的另外一条消息是回应INVITE 的180 Ringing消息。这条消息说明了被叫方已经收到了INVITE并且提醒正在进行。提醒可能是振铃、在屏幕上显示一条消息,或者其它吸引被叫方Marconi注意的方法。
             180 Ringing是SIP回应消息的一个例子。回应是数字化的并且由数字的第一个数字来分类。一条180回应是消息类的,通过第一个位数字为1来标识。消息类的回应被用来传递呼叫过程中的一些非关键的信息。很多SIP回应代码是基于HTTP 版本1.1的回应代码,但是做了一些扩展和增加。任何一位浏览过网页的用户在他们想要浏览的网页不存在的时候应该都接到过来自于WEB服务器的“404 Not Found”回应。404 NOT FOUND也是一个有效的SIP“客户端错误类”的回应,如果请求的是一位未知的用户,那么也会返回404。
              在SIP中,单一的决定了回应方式的回应代码是由服务器或者用户来解释的。在本例中的回应,Ringing,就是标准的建议。但是可以使用任何文本来提示更多信息,比如说180,稍等,我将试图叫醒他,就既是一个非常合理的SIP回应,并且它有着和180 Ringing回应相同的意思。

180 Ringing回应有着如下的结构:

SIP/2.0 180 Ringing
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
;received=100.101.102.103
To: G. Marconi <sip:marconi@radio.org>;tag=a53e42
From: Nikola Tesla <sip:n.tesla@high-voltage.org>&gt;;tag=76341
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 INVITE
Contact: <sip:marconi@tower.radio.org>
Content-Length: 0
该消息是大部分通过复制INVITE消息里面的内容来的,包含了Via、To、From、Call-ID和CSeq行,然后添加了一行包含有SIP版本号、回应代码、原因短语的回应行。这种方法简化了对回应的消息处理。

         Via行 包含了原始的branch参数, 但是增加了额外的received参数 这个参数包含了IP地址表明了请求是由100.101.102.103所接受的 这个IP地址也是Via行里面的URI (lab.high-voltage.org)通过DNS所解析来的
        
         注意在回应消息里面大家认为可能会被修改的To和From字段其实没有被修改。从消息里面看出,消息是从Tesla发送给Marconi,头部区域读取将读取相反的信息。这是 因为SIP里面的To和From字段是用来显示请求的方向,而不是消息的方向,方向是从请求方指向服务方 因为Tesla发起了这个请求,所有的回应将读取To为Marconi,From为Tesla。
To行现在包含了一个由Marconi产生的标签,在这次会话或者对话的所有后续请求和回应都将包含由Tesla产生的标签和Marconi产生的标签。
这个回应包含了一个Contact行,里面包含了一个地址。一旦会话建立起来之后,通过里面这个地址,Marconi就可以被直接联系到
当被呼叫的Marconi决定接受这个呼叫(比如接听呼叫),那么一条包含200 OK的回应将会被发送。这条回应同时也表明了呼叫发起者所提出的媒体会话类型是可以接受的。这条200 OK是成功类的回应的一个例子。 200 OK的消息体包含有Marconi的媒体信息:
SIP/2.0 200 OK
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
;received=100.101.102.103
To: G. Marconi <sip:marconi@radio.org>;tag=a53e42
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 INVITE
Contact: <sip:marconi@tower.radio.org>
Content-Type: application/sdp
Content-Length: 155
v=0
o=Marconi 2890844528 2890844528 IN IP4 tower.radio.org
s=Phone Call
c=IN IP4 200.201.202.203
t=0 0
m=audio 60000 RTP/AVP 0
a=rtpmap:0 PCMU/8000
这条回应采用和180 Ringing回应一样的方式构建的,它也包含同样的To标签和Contact URI。但是媒体支持能力却一定要通过附加在SDP进行告知。和表2.2一样的SDP字段,该SDP包含:
端点IP地址: (200.201.202.203);
媒体格式 (audio);
端口 (60000);
媒体传输协议: (RTP);
媒体编码:(PCM μ-Law);
采样率 (8,000 Hz).
最后一步就是通过一个“确认”消息来确认媒体会话。确认意思就是Tesla成功的接到了Marconi的回应。媒体信息的交换可以让媒体会话使用其它协议来建立会话,在本例中是RTP。
ACK sip:marconi@tower.radio.org SIP/2.0
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bK321g
Max-Forwards: 70
To: G. Marconi <sip:marconi@radio.org>;tag=a53e42
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 ACK
Content-Length: 0
命令顺序-CSeq有着和INVITE一样的号码,但是方法却被设置成了ACK。到了这一点,媒体会话就将使用SIP消息上携带的媒体信息了。 媒体会话使用其它的协议开始了,典型的是RTP。Via行的branch参数包含一些不同于INVITE的新传输识别标识,因为确认的200 OK的ACK被认为是一个独立的传输。
这个信息交互展示了SIP是一个端到端的行令协议。一个SIP网络,或者SIP服务器是不要求被使用的协议的。两个运行SIP协议族的端点如果知道对方的IP地址的话就可以使用SIP来建立会话。虽然不是很直观,但是这个例子也展示了SIP协议的客户端-服务器的特性。Tesla产生INVITE请求,它就是一个SIP客户端,当Marconi回应这个请求,它就是一个SIP服务器。当媒体会话建立好了之后,Marconi产生一个BYE请求,这个过程它又是一个SIP客户端,而Tesla回应这个请求的时候,它则成了为SIP服务器。这也就是为什么SIP服务器和SIP客户端必须同时都包含SIP服务器和SIP客户端软件,因为在一个典型的会话过程中,二者都是不可获取的。
        
      这个特点不同于其它客户端-服务器端的HTTP或者FTP之类的Internet协议。WEB浏览器永远都是HTTP客户端,而WEB服务器永远都是HTTP服务端,FTP也是一样的道理。在SIP内,在会话过程中,一个端点将在客户端和服务器端进行来回切换。

在图2.1中Marconi发送了一个BYE请求来结束会话:
BYE sip:n.tesla@lab.high-voltage.org SIP/2.0
Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf
Max-Forwards: 70
To: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
From: G. Marconi <sip:marconi@radio.org>;tag=a53e42
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 BYE
Content-Length: 0
本例中的Via行包含有Marconi的主机地址并且也包含了一个新的传输标示符,因为BYE被认为是不同于上面的INVITE和ACK传输的单独的传输。To和From行反应了这个请求时产生于Marconi。他们已经将上面的传输信息颠倒了过来。但是Tesla能够通过和INVITE中一样的本地标签、远程标签和CALL-ID识别出该会话,然后结束相应的媒体会话。注意例子中所有的branch ID都使用z9hG4bK字符串开始,这是一个特殊的字符串,它说明了branch ID是使用了RFC 3261中严格定义的规则计算而来,也说明作为一个传输识别标记,是可用的结果的[1]。
针对BYE请求的是一个200 OK的回应:
SIP/2.0 200 OK
Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf
;received=200.201.202.203
To: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
From: G. Marconi <sip:marconi@radio.org>;tag=a53e42
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 BYE
Content-Length: 0
这个回答是回应CSeq:1
[1]这个字符串是必须的,因为用户代理通过RFC 3261 所产生的branch ID有可能不适合来做传输标示符。在本例中,客户端必须使用To标标签、From标签、Call-ID和CSeq来创建自己的传输标识符

SIP和VoIP协议及其应用

SIP协议是NGN中的重要协议,越来越得到业界的重视。本文简单介绍了VoIP和SIP协议的含义,并从背景、功能、主要消息这几个方面对SIP协议的工作原理进行了介绍,分析了SIP呼叫建立的流程。

1 VoIP简介

当前Internet的应用日益广泛,随着骨干网速率的高速增长,接入网速率的不断提高,Internet上的业务正从窄带走向宽带、从非实时走向实时,VoIP(Voice over Internet Protocol)业务就是其中的一类重要的业务。

VoIP是通过对语音信号进行数字化编码、压缩处理成帧,然后转换为IP数据包在IP网络上进行传输,来达到在IP网络上进行语音通信目的的技术。它最大的优势是能广泛地利用Internet和全球IP互连的环境,非常廉价的提供语音、传真、视频和数据等业务,如统一消息、虚拟电话、虚拟语音/传真邮箱、查号业务、Internet呼叫中心、Internet呼叫管理、电视会议、电子商务、传真存储转发和各种信息的存储转发等。

目前在VoIP领域有两个完全独立的信令协议:国际电联电信标准化部(International Telecommunications Union—Telecommunication Standardization Sector,ITU-T)的H.323协议簇和因特网工程任务组(Internet Engineering Task Force,IETF)的SIP(Session Initiation Protocol)协议。

传统的IP网络主要是用来传输数据业务,采用的是尽力而为的、无连接的数据技术,因此没有服务质量保证,存在分组丢失、失序到达和时延抖动等情况。数据业务对此要求不高,但话音属于实时业务,对时序、时延等有严格的要求。因此必须采取特殊措施来保障一定的业务质量。VoIP的关键技术包括信令技术、编码技术、实时传输技术、服务质量保证(QoS)技术、以及网络传输技术等。

2 SIP协议及其功能简介

2.1 会话初始协议SIP

会话初始协议(SIP)是IETF提出的在IP网上进行多媒体通信的应用层控制协议。SIP是IETF标准进程的一部分,它是在诸如SMTP(简单邮件传送协议)和HTTP(超文本传送协议)基础之上建立起来的。它用来建立、改变和终止基于IP网络的用户间的呼叫。为了提供电话业务,它还需要结合不同的标准和协议,特别是需要确保传输(RTP),与当前电话网络的信令互连,能够确保语音质量(RSVP),能够提供目录(LDAP),能够鉴权用户(RADIUS)等等。以Internet协议(HTTP)为基础,遵循Internet的设计原则,基于对等工作模式。利用SIP可实现会话的连接、建立和释放,并支持单播、多播和可移动性。此外,SIP如果与SDP配合使用,可以动态地调整和修改会话属性,如通话带宽、所传输的媒体类型及编解码格式。  

SIP大大优于现有的一些协议,如将PSTN音频信号转换为IP数据包的媒体网关控制协议 (MGCP)。因为MGCP是封闭的纯语音标准,所以通过信令功能对其进行增强比较复杂,有时会导致消息被破坏或丢弃,从而妨碍提供商增加新的服务。而使用SIP,编程人员可以在不影响连接的情况下在消息中增加少量新信息。例如,SIP 服务提供商可以建立包含语音、视频和聊天内容的全新媒体。如果使用 MGCP、H.323 或SS7标准,则提供商必须等待可以支持这种新媒体的协议新版本。而如果使用SIP,尽管网关和设备可能无法识别该媒体,但在两个大陆上设有分支机构的公司可以实现媒体传输。而且,因为SIP的消息构建方式类似于HTTP,开发人员能够更加便捷地使用通用的编程语言(如Java)来创建应用程序。对于等待了数年希望使用SS7和高级智能网络(AIN)部署呼叫等待、主叫号码识别以及其他服务的运营商,现在如果使用SIP,只需数月时间即可实现高级通信服务的部署。

2.2 SIP协议的基本功能

SIP被描述为用来生成、修改和终结一个或多个参与者之间的会话。这些会话包括因特网多媒体会议,因特网(或任何IP网络)电话呼叫和多媒体发布。会话中的成员能够通过多播或单播联系的网络来通信。SIP支持会话描述,它允许参与者在一组兼容媒体类型上达成一致。它同时通过代理和重定向请求到用户当前位置来支持用户移动性。SIP不与任何特定的会议控制协议捆绑。本质上,SIP提供以下功能。

名字翻译和用户定位:无论被呼叫方在哪里都确保呼叫达到被呼叫方。执行任何描述信息到定位信息的映射。确保呼叫(会话)的本质细节被支持。

特征协商:它允许与呼叫有关的组(这可以是多方呼叫)在支持的特征上达成一致(注意:不是所有方都能够支持相同级别的特征)。例如视频可以或不可以被支持。总之,存在很多需要协商的范围。

呼叫参与者管理:呼叫中参与者能够引入其他用户加入呼叫或取消到其他用户的连接。此外,用户可以被转移或置为呼叫保持。

呼叫特征改变:用户应该能够改变呼叫过程中的呼叫特征。例如,呼叫可以被设置为“voice-only”,但是在呼叫过程中,用户可以根据需要开启视频功能。也就是说一个加入呼叫的第三方为了加入该呼叫可以开启不同的特征。

2.3 SIP的消息整体描述

SIP消息用于会话连接的建立及修改。SIP消息有两种:客户机到服务器的请求(Request),服务器到客户机的响应(response)。

SIP消息包括三个部分:SIP消息由一个起始行(start-line)、一个或多个字段(field)组成的消息头、一个标志消息头结束的空行(CRLF以及作为可选项的消息体(message body)组成,其中描述消息体(message body)的头称为实体头(entity header)。起始行分请求行(Request-Line)和状态行(status-line)两种,其中请求行是请求消息的起始行,状态行是响应消息的起始行,起始行位于消息的最开始。消息头分通用头(general-header)、请求头(request-header)、响应头(response-header)和实体头(entity-header)四种。消息头,描述消息的属性,类似于HTTP消息头的语法和语义,其中某些是完全照搬。消息体,消息体主要是对消息所要建立的会话的描述。典型的消息体为SDP(会话描述协议)格式,用来对所要建立的会话进行描述,例如建立一个多媒体会话的消息体中包含音频、视频编码及取样频率等信息的描述。消息体的类型采用MIME(多目的互联网邮件扩展)所定义的代码进行标识,如SDP的类型标识为application/SDP。除了SDP,消息体也可以是其他各种类型的文本或二进制数据。

(1)SIP请求消息

INVITE方法用于邀请用户和服务参加一个会话。在INVITE请求的消息体中可对被叫方被邀请参加的会话作以描述。如主叫方能接收的媒体类型、发出的煤体类型及其一些参数。对INVITE请求的成功响应必须在响应的消息体中说明被叫方愿意接收哪种媒体,或者说明被叫方发出的媒体。服务器可以自动地用200 OK响应会议邀请。

ACK请求用于客户机向服务器证实它已经收到了对INVITE请求的最终响应ACK只和INVITE请求一起使用。对2xx最终响应的证实由客户机用户代理发出,对其它最终响应的证实由收到响应的第一个代理或第一个客户机用户代理发出。ACK请求的To、From、Call-ID、Cseq字段的值由对应的INIVITE请求的相应字段的值复制而来。

OPTIONS用于向服务器查询其能力。如果服务器认为它能与用户联系,则可用一个能力集响应OPTIONS请求;OPTIONS的From、To分91包含主被叫的地址信息,对OPTIONS请求的响应中的From、To(可能加上tag参数)、Call-ID字段的值由OPTIONS请求中响应的字段值复制得到。

BYE用户代理客户机用BYE请求向服务器表明它想释放呼叫。BYE请求可以像INVITE请求那样被转发,可由主叫方发出也可以由被叫方发出。呼叫的一方在释放(挂断)呼叫前必须发出BYE请求,收到BYE请求的这方必须停止发媒体流给发出BYE请求的这方。

CANCEL请求用于取消一个Call-ID、To、From和Cseq(仅序列号)字段值相同的正在进行的请求,但取消不了已经完成的请求(如果服务器返回一个最终状态响应,则认为请求己完成)。CANCEL请求中的Call- ID、To、Cseq的数字部分及From字段和原请求的对应字段值相同,从而使CANCEL请求与它要取消的请求匹配。

REGISTER方法用于客户机向SIP服务器注册列在To字段中的地址信息。

INFO方法是对SIP协议的扩展,用于传递会话中产生的与会话相关的控制信息,如:ISUP和ISDN信令消息,以及DTMF数字等。

其中INVITE和ACK用于建立呼叫,完成三次握手,或者用于建立以后改变会话属性;BYE用以结束会话;OPTIONS用于查询服务器能力;CANCEL用于取消己经发出但未最终结束的请求;REGISTER用于客户机向注册服务器注册用户位置等消息

除了在建立会话时进行各种消息交互外,SIP终端还可以在会话过程中,发出消息改变或添加会话的某些属性。例如,用户在进行语音通话的过程中,想增加视频通信,他可以在不中断通话的情况下,发送新的INVITE消息,打开双方的视频媒体,使通话变成可视电话。这为用户的使用带来很大的灵活性。

(2)SIP响应消息

SIP协议中用三位整数的状态码(status code)和原因值(reason code)来表示对请求做出回答,状态码用于机器识别操作,原因短语(reason-phrase)是对状态码的简单文字描述,用于人工识别操作。状态码的第一个数字定义响应的类别,在SIP/2. 0中第一个数字有6个值,定义如下:

        lxx——暂时响应,表示请求已经收到,正继续处理请求。
  2xx——成功地响应,表示行动己经成功地收到,理解和接收。
  3xx—重定位响应,表示为完成呼叫请求,还必须采取进一步的动作。
  4xx——客户机错误,属于请求失败响应,表示请求有语法错误或不能被服务器执行。客户机需要修改请求,然后再重发请求。
  5xx——服务器错误,属于服务器失败响应,表示服务器出错,不能执行合法请求。
  6xx——全局失败响应,表示任何服务器都不能执行请求。

3 SIP的呼叫建立

3.1 SIP的直接呼叫

(1)首先,主叫向被叫发出INVITE请求。INVITE请求的作用发起并建立呼叫邀请被叫加入主叫建立的呼叫。

(2)被叫收到请求后对主叫做出响应。接受请求方对请求的响应分为临时响应(状态码为1xx)最终相应(状态码为2xx。主叫只对最终相应做出回应。

           

          图1中,

                   被叫做出的临时相应有100Trying(尝试连接),180 Ringing(被叫振铃或进入受到请求状态),182 Queued(被叫可能有多个呼叫要处理,所以主叫请求需要排队等待);

                   被叫做出的最终响应是200 OK,表示被叫接受并开始处理呼叫请求。


(3)为了向被叫证实主叫收到了最终响应主叫收到响应后发送ACK请求。被叫收到主叫的ACK请求,标志呼叫建立阶段结束。


(4)主叫或被叫在呼叫建立后发起后续请求。后续请求可由参加呼叫的任一方发起。可发起INVITE请求,进行交互操作,并对当前呼叫进行修改;也可发起BYE请求终止当前呼叫。


SIP直接呼叫流程如图1所示。

SIP用户适配器在测试所用交换系统中结构如图2所示。


3.2 SIP在系统中的呼出流程


当基本呼叫进程分析呼叫信息,它会发送请求路由消息给路由管理模块,如果路由管理模块发现是SIP路由,它会返回SIP地址给基本呼叫进程,基本呼叫进程会将SIP地址添加到SETUP消息中发给SIP模块,当SIP模块收到从基本呼叫进程发来的SETUP消息,它将分配呼叫资源,呼叫ID,然后向进程发送消息,流程如图3所示。


3.3 SIP在系统中的呼入流程


当SIP模块从呼叫进程收到了INVITE消息,它将分配呼叫资源并且将呼叫ID和呼叫资源绑定,返回100消息给进程,发送SETUP消息给基本呼叫进程,流程如图4所示。


3.4 SIP在系统中的放音流程


如果有该SIP用户注册有放音服务,连接管理模块将会发送放音命令给SIP—UA模块,SIP—UA会向进程发送INVITE,在对方返回200OK后,SIP模块会发送放音命令回应给连接管理模块,然后进入放音阶段,流程见图5。


4 结论与展望

SIP协议作为NGN通信的核心协议将有着极大的市场潜力和应用前景。协议是通信的基础,尤其是在3G和VoIP中,SIP的灵活性和可扩展性都将得到体现并受到人们的欢迎。可以预见在不远的将来,尤其是一些大的运营商,其中心平台都会以SIP为核心。

SIP能够连接使用任何IP网络(有线LAN和 WAN、公共Internet骨干网、移动2.5G、3G和Wi-Fi)和任何IP设备(电话、PC、PDA、移动手持设备)的用户,从而出现了众多利润丰厚的新商机,改进了企业和用户的通信方式。基于SIP的应用(如VoIP、多媒体会议、push-to-talk(按键通话)、定位服务、在线信息和IM)即使单独使用,也会为服务提供商、ISV、网络设备供应商和开发商提供许多新的商机。不过,SIP 的根本价值在于它能够将这些功能组合起来,形成各种更大规模的无缝通信服务。

使用SIP,服务提供商及其合作伙伴可以订制和提供基于SIP的组合服务,使用户可以在单个通信会话中使用会议、Web控制、在线信息、IM等服务。实际上,服务提供商可以创建一个满足多个最终用户需求的灵活应用程序组合,而不是安装和支持依赖于终端设备有限特定功能或类型的单一分散的应用程序。通过在单一、开放的标准SIP应用架构下合并基于IP的通信服务,服务提供商可以大大降低为用户设计和部署基于IP的新的创新性托管服务的成本。它是SIP可扩展性促进本行业和市场发展的强大动力,是我们所有人的希望所在。但是,作为一种不能加密的协议,SIP协议的安全性也变得十分复杂,这也是我们在未来不容忽略的一个问题。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值