SIP基础协议总结

SIP协议是一个用于建立,更改和终止多媒体会话的应用层控制协议,大量借鉴了成熟的HTTP协议(文本格式编码,Request消息中的method等),采用基于文本的UTF-8编码方式,可以承载与UDP或者TCP协议之上(首选UDP)。和Diameter协议类似,SIP也是有一个基础协议和很多扩展协议,基础协议在RFC3261中定义,本文主要概括SIP基础协议的要点。

1.  基本概念:

·         Session:Session简单的说就是一次通话,从摘机拨号开始到最终的挂机之间所有的SIP消息都属于一个Session,它们具有相同的Call-Id。

·         Dialog:基于Peer-to-Peer,描述了两端的User Agents在一段时间内的关联。Dialog用Dialog Id来表示,Dialog Id是由三部分组成的:Call-Id,from中的tag,to中的tag。只有对Invite消息响应的的2xx 和 101-199 消息才能建立一个Dialog。100 Trying相应无法建立Dialog,因为100 Trying中的To属性没有tag值。

·         Transaction:一个Transction是有一个Request消息和一个或者多个临时或者最终应答消息构成的。如果对Invite的应答是200 OK,则接下来的ACK消息认为是另一个transaction。

 

2.  SIP网络实体:

·         UA(User Agent):和用户直接交互的SIP设备,可以是硬件的SIP电话也可以是电脑上具有SIP电话功能的软件等;发送SIP Request消息的UA即UAC(User Agent Client), 接受SIP Request消息的UA即UAS(User Agent Server), 一个UA通常既是UAC又是UAS。

·         Proxy Server:进行消息转发,负责把消息转发给最终用户或者另一个Proxy Server。

·         Redirect Server:和Diameter的Redirect Server类似,不进行消息转发,而是给消息发送方回复一个或者多个地址,建议发送方把消息发往这些地址。Redirect Server返回的地址并不一定就是最终用户的地址,也有可能是另一个Proxy Server的地址。

·         Registrars: 因为SIP需要支持用户的移动性,所以当用户改变位置后需要对新位置的终端进行注册,Registrars接受SIP用户注册,从而得知可以从何处找打当前用户。Registrars通常位于SIP Server(Proxy Server 或者Redirect Server)中。

·         Location Server:不是SIP实体,之所以说它不是SIP实体是因为Location Server上面不必运行SIP协议栈,SIP Server和 Location Server之间的通信方式也不是用SIP(比如用LDAP)。Location Server的作用是保存SIP用户位置数据(IP 或者Hostname),比如当一个SIP用户向SIP Server注册之后,SIP Server将该SIP用户位置信息上传到Location Server中,当SIP Server收到需要发送给该SIP用户的消息时,SIP Server再向Location Server询问该用户位置信息(IP 或者Hostname)。

 

3.  SIP消息分类:

SIP消息分为如下两类:

·         请求消息:UAC发给UAS的消息,包括INVITE、ACK、BYE、CANCEL、OPTION和REGISTER消息。

·         响应消息:UAS回应给UAC的消息,包括1xx、2xx、3xx、4xx、5xx、6xx响应消息,每类消息的具体含义如下表:

1xx

进展相应

临时相应

2xx

成功

最终相应

3xx

重定向错误

最终相应

4xx

客户端错误

最终相应

5xx

服务端错误

最终相应

6xx

全局错误

最终相应

4.  SIP消息格式:

SIP由于是采用文本格式编码,所以消息格式很简单,是由Message Header加可选的Message body构成,Message Header 从第二行开始每一行都由“Tag :Valued”格式组成,每一行描述一个属性。 头部的属性有很多,基本协议中定义了一部分,扩展协议也定义了相应的头部属性。如果消息中携带了Message body,则Message Header和Message body之间用一个空行分割开来;Message body通常有“Content-Type”和“Content-Length”属性来对Message body进行解释,例如:
Content-Type: application/sdp
Content-Length: 212

SIP消息也可以携带多个Message body,比如可以带上SDP信息和主叫方的照片,这样被叫就能看到主叫方的头像了。

SIP消息在经过Proxy的时候,Proxy只关心Message Header,而不会检查Message body,所以说Message body对Proxy是透明的。

5.  SDP(Session Description Protocol):

在SIP的Message body中最常见的就是SDP,这里概述一下SDP。Session Description Protocol (SDP) 在RFC 2327中被定义;SDP中携带了一些必要信息,以供用户可以加入一个多媒体会话,比如IP地址,端口号,会话的日期时间等;这有点儿类似电视台的节目单,有了节目单,我们就可以在指定的时间切换到指定的频道收看到预期的节目。SDP是单独定义的,和SIP没有必然的联系,SDP信息可以通过各种途径传输比如Email,Webpage等,SIP只是众多传输SDP方式中的一种而已。

1)  SDP语法:

SDP也是用文本格式描述的,一个SDP Description可以包含很多行,每一行的格式如下:
Type = Value
Type只用一个字母来表示;一个SDP Description通常有一个Session-level和多个Media-level信息组成;Session-level信息用来描述整个Session,每个Media-level信息用来描述一个特定的媒体流。Session-level总以”v=0”开头,Media-level总已”m=<media type> <port number> <transport protocol> <media formats>”开头,。下面是一个SDP Description的例子,该例子中包含了三个Media-level信息:
v=0
o=Bob 2890844526 2890842807 IN IP4 131.160.1.112
s=SIP seminar
i=A Seminar on the Session Initiation Protocol
u=http://www.cs.columbia.edu/sip
[email protected]
c=IN IP4 224.2.17.12/127
t=2873397496 2873404696
a=recvonly
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
m=video 51372 RTP/AVP 31
a=rtpmap:31 H261/90000
m=video 53000 RTP/AVP 32
a=rtpmap:32 MPV/90000

该例中o描述该session的发起者是Bob以及他的IP地址;s描述该session的名字;i描述了该session的一般信息;u说明可以从这个URL中获取和该session相关的更多信息;e描述了该session联系人的email。C和t描述了什么时间从哪里可以接收到该Session的multicast。m描述了一个媒体流的端口号,传输协议,媒体格式等信息。a可以用来对SDP进行扩展,比如双方如果协商音频的音量,可以用下面的SDP描述:
m=audio 49170 RTP/AVP 0
a=volume:8
前提是双方都需要理解volume的含义,如果对方不理解volume,也不会出错,只是将其忽略。

2)  SDP描述中常见属性:

v

Protocol version

b

Bandwidth information

o

Owner of the session and session identifier

z

Time zone adjustments

s

Name of the session

k

Encryption key

i

Information about the session

a

Attribute lines

u

URL containing a description of the session

t

Time when the session is active

e

E-mail address to obtain information about the session

r

Times when the session will be repeated

p

Phone number to obtain information about the session

m

Media line

c

Connection information

i

Information about a media line

6.  SIP呼叫流程实例分析:

下图是一个完整的SIP呼叫消息流示意图,这里重点关注SIP消息流,下一篇文中将给出一个稍微复杂的例子,那个例子中将重点关注SIP消息的路由和SIP常见头部字段的含义。

Laura要与Bob通话,Laura拨打Bob的的Public URI:sip:[email protected],给Bob一个Invite消息,在Invite消息中携带了SDP,表明Laura期望在UDP端口20002上收到包含PCM voice编码的RTP数据包。Proxy收到这个Invite消息后转发给Bob,同时给Laura回送一个100 Trying消息(Trying消息是Hop-to-Hop的,不会被转发)。Bob收到Invite消息后开始振铃,返回180 Ringing消息给Laura,Laura侧会听到回铃音。

 

INVITE sip:[email protected] SIP/2.0

Via: SIP/2.0/UDP workstation1000.university.com:5060

From: Laura Brown <sip:[email protected]>

To: Bob Johnson sip:[email protected]

Call-ID: [email protected]

CSeq: 1 INVITE

Contact: Laura Brown <sip:[email protected]>

Content-Type: application/sdp

Content-Length: 154

v=0

o=Laura 2891234526 2891234526 IN IP4 workstation1000.university.com

s=Let us talk for a while

c=IN IP4 138.85.27.10

t=0 0

m=audio 20002 RTP/AVP 0

 

当Bob摘机后,一个200 OK的最终应答消息会被返回给Laura,消息中携带了一个SDP,表明Bob可以在UDP端口41000上接受数据包。Laura收到200 OK后给Bob发送一个ACK消息,确认已经收到200 OK。此时双方进入通话。

 

SIP/2.0 200 OK

Via: SIP/2.0/UDP 131.160.1.110

Via: SIP/2.0/UDP workstation1000.university.com:5060

From: Laura Brown <sip:[email protected]>

To: Bob Johnson <sip:[email protected]>;tag=314159

Call-ID: [email protected]

CSeq: 1 INVITE

Contact: Bob Johnson <sip:[email protected]>

Content-Type: application/sdp

Content-Length: 154

v=0

o=Bob 2891234321 2891234321 IN IP4 131.160.1.112

s=Let us talk for a while

c=IN IP4 131.160.1.112

t=0 0

m=audio 41000 RTP/AVP 0

 

当通话结束时,Bob发送一个Bye消息给Laura,Laura随后回应200 OK给Bob,至此通话结束。

 

参考资料:

1.  “RFC 3261”- Section 4,Section 12,Section 17,Section 24;

2.  “SIP Demystified”- Chapter 4, Chapter 5;

 

你可能感兴趣的:(session,server,header,dialog,redirect,audio)