SIP协议学习之旅

        SIP是Session Initialization Protocol(会话初始协议)的缩写,它是IP网上的呼叫控制协议,用来初始(建立)、更改和终止一个或多个参与者会议的协议。它只描述建立/更改/终止一个会话,并不描述会话的内容。所以可以承载任何会话的内容,如语音、视频、游戏等。当然,SIP单独不能完成多媒体呼叫,必须要与其他协议(这里主要指应用层)一起才能组件完整的多媒体通信系统,与RTP(Real-Time Protocol)/RTCP(Real-Time Control Protocol)、SDP(Session Description Protocol)、MGCP(Media Gateway Control Protocol)、DNS(Domain Name System)等协议配合共同完成多媒体会话过程。

        SIP协议是一种应用层协议,独立于传输层,可以承载不同的传输层协议,如UDP(User Datagram Protocal)、TCP(Transmission Control Protocal)、TLS(Transport Layer Security)、SCTP(Stream Control Transmission Protocol)。

SIP是一种纯文本协议,它的形式如下(引自https://blog.csdn.net/bluegoby/article/details/52444720):

INVITE sips:[email protected] SIP/2.0
Via: SIP/2.0/TLS client.vvsip.com:5061; branch = z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:[email protected]> ;tag = 1234567
To: Bob <sips:[email protected]>
Call-ID: [email protected]
CSeq: 1 INVITE
Contact: <sips:[email protected]>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...
v = 0
o = Alice 2890844526 2890844526 IN IP4 client.vvsip.com
s = Session SDP
c = IN IP4 client.vvsip.com
t = 3034423619 0
m = audio 49170 RTP/AVP 0
a = rtpmap:0 PCMU/8000

 上面的命令参数解释在后面会给出。下面具体介绍SIP协议的机制。

1.SIP协议使用Client/Server模型。 

它的基本单元(客户端和服务端的基本交互单元)——消息分为三部分:第一行(请求行/响应行)、头域和(可选)消息体,其中第一行和头域必须由一个CRLF结尾。

消息分为两类——请求和相应,区别就在消息的第一行。

如请求行

INVITE sips:[email protected] SIP/2.0

和响应行

SIP/2.0 200 OK

           RFC3261定义了6个方法:INVITE\CANCEL\ACK\BYE\REGISTER\OPTIONS.

sip消息的状态码为一组三位数的数字,1XX为临时响应,2XX-6XX为最终响应。

1XX:临时响应,表示请求正在被处理;

2XX:成功响应,表示请求已被成功接收,完全理解并被接受;

3XX:重定向响应,表示需采取进一步以完成该需求;

4XX:客户机错误,表示请求消息中包含语法错误信息或服务器无法完成客户机请求;

5XX:服务器错误,表示服务器无法完成合法请求;

6XX:全局故障,表示任何服务器无法完成该请求。

 2.sip消息的头域(或头字段)

头域携带SIP实体的属性、消息体的属性等。

且每一个SIP消息都必须携带五个以上SIP头域,头域必须以CRLF结尾。

头域的基本结构为

field-name:field-value

比如

Via: SIP/2.0/TLS client.vvsip.com:5061; branch = z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:[email protected]> ;tag = 1234567

从上面截取的头域中可以看到,头域可以是多值(multi-value)的,甚至还可以有参数,如头域From中的参数“tag”,(值与对应参数用分号“;”相隔)。

多值的头域的表示方法一般有两种,一种是

field-name:field-value1,field-value-2,...

另一种是

field-name:field-value1
field-name:field-value2
...

通常如头域Via,Route等两种方法都可以使用,但是可能顺序相关(比如路径是有顺序的);特别注意的是,协议中规定

五个多值头域:Authorization、Proxy-Authorization、Proxy-Authenticate、WWW-Authenticate、Authentication-info只能

使用第二种方法将多个值分别在多个头域中列出,每个头域只能有一个值。

猜你喜欢

转载自blog.csdn.net/qq_22551385/article/details/81275595
今日推荐