SIP 协议详解

我爱熊猫 2020-03-04

SIP 协议详解

一、Sip协议简介:

SIP(Session Initiation Protocol,会话初始协议)是由IETF(Internet Engineering Task Force,因特网工程任务组)制定的多媒体通信协议。广泛应用于CS(Circuit Switched,电路交换)、NGN(Next Generation Network,下一代网络)以及IMS(IP Multimedia Subsystem,IP多媒体子系统)的网络中,可以支持并应用于语音、视频、数据等多媒体业务,同时也可以应用于Presence(呈现)、Instant Message(即时消息)等特色业务。可以说,有IP网络的地方就有SIP协议的存在。
SIP是类似于HTTP。SIP可以减少应用特别是高级应用的开发时间。由于基于IP协议的SIP利用了IP网络,固定网运营商也会逐渐认识到SIP技术对于他们的远意义。

1.1、 SIP协议会话建立的基本过程

SIP 协议详解

主叫方A呼叫被叫方B:

  • 步骤1:主叫方A发送INVITE请求到代理服务器
  • 步骤1:代理服务器发送100 Trying 响应主叫方A
  • 步骤3~6:代理服务器搜索被叫方B的地址,获取地址后转发INVITE请求;
  • 步骤7~9:被叫方B生成的180 振铃响应,返回给主叫方A
  • 步骤10~12:被叫方B生成的200 OK响应,返回给主叫方A
  • 步骤13~17:主叫方A收到被叫方B200 OK响应后,向被叫方B发送一个ACK,会话建立;
  • 步骤18~20:会话结束后,任何参与者(A或B)都可以发送一个BYE请求来终止会话;
  • 步骤21~23:主叫方A发送200 OK响应来确认BYE,会话终止。

二、SIP消息体格式

SIP消息与Http相似,其由三部分组成:

  • 请求行(request-line) or 状态行(status-line)
  • 消息头(header)
  • 正文(body)

2.1、请求行

请求行格式:Method Request-URI SIP-Version CRLF
请求行举例:INVITE sip: SIP/2.0 /r/n

Method
以下列出了六种消息Method方法

Method方法说明
REGISTER注册联系信息
INVITE发起会话请求
ACKINVITE 请求的响应的确认
CANCEL取消请求
BYE终结会话
OPTIONS查询服务器能力

Request-URI
指示请求的用户或者服务的地址信息

SIP-Version
请求和响应消息都需要包含SIP版本信息

2.2、状态行

状态行格式: SIP-Version Status-Code Reason-Phrase CRLF
状态行举例:SIP/2.0 200 OK /r/n

Status-Code状态码:
状态代码由3位数字组成,表示请求是否被理解或被满足。
状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类

第一个数字有五种可能的取值:

状态码含义
1xx:临时响应、表示请求消息正在被处理
2xx成功响应、表示请求已被成功接收完全理解并接收
3xx重定向响应、表示需采取进一步完成请求
4xx客户机错误、表示请求消息中包含语法错误信息或服务器无法完成客户机的请求
5xx服务器错误、表示服务器无法合法完成请求
6xx全局故障 、表示任何服务器都无法完成该请求

常用的状态码举例:

状态码msg含义
100Trying试呼叫
180Ringing振铃
181Call is Being Forwarded呼叫正在前转
200OK成功响应
302Moved Temporarily临时迁移
400Bad Request错误请求
401Unauthorized未授权
403Forbidden禁止
404Not Found用户不存在
408Request Timeout请求超时
480Temporarily Unavailable暂时无人接听
486Busy Here线路忙
504Server Time-out服务器超时
600Busy Everywhere全忙

2.3、消息头

发送MESSAGE请求消息给192.168.100.02的2222端口

MESSAGE sip::2222 SIP/2.0

Call-ID: 
From: <sip:>;tag=-0037-708c9a5cba8dd878
To: <sip:>
CSeq: 1 MESSAGE
Via: SIP/2.0/UDP 192.168.100.1:1111;branch=z9hG4bK--22bd7222
Max-Forwards: 30
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: <sip:192.168.100.1:1111>
Content-Type: text/plain
Content-Length: 5

Hello
Header含义说明举例
Call-ID由本地设备(Client)生成,全局唯一,每次呼叫这个值唯一不变Call-ID:
From表示请求的发起者From: sip:[email protected];tag=-0037-708c9a5cba8dd878
To表示请求的接收者To: sip:[email protected]
ViaVia头域是被服务器插入request中,用来检查路由环的,并且可以使response根据via找到返回的路Via: SIP/2.0/UDP 192.168.100.1:1111;branch=z9hG4bK--22bd7222
Max-Forwards用于表示这个包最多可以传送多少跳,每经过一跳都会减一当Max-Forwards==0系统会返回483。默认为70Max-Forwards: 30
Contact包含源的URI信息,用来给响应方直接和源建立连接用Contact: sip:192.168.100.1:1111
Content-Type指明消息体的类型 (SDP会话描述协议)Content-Type: text/plain;Content-Type: application/sdp
Content-Length指明消息体的字节大小Content-Length: 5

三、SIP消息举例

这里举两个例子:

  • MESSAGE消息
  • REGISTER消息

3.1、MESSAGE消息

发送MESSAGE请求消息给192.168.100.02的2222端口:

MESSAGE sip::6010 SIP/2.0

Call-ID: 
From: <sip:>;tag=-0037-708c9a5cba8dd878
To: <sip:>
CSeq: 1 MESSAGE
Via: SIP/2.0/UDP 192.168.100.1:1111;branch=z9hG4bK--22bd7222
Max-Forwards: 30
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: <sip:192.168.100.1:1111>
Content-Type: text/plain
Content-Length: 5

Hello

收到来自192.168.100.02的2222端口的返回消息:

SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.100.1:1111;branch=z9hG4bK--22bd7222
From: <sip:>;tag=-0037-708c9a5cba8dd878
To: <sip:>;tag=-002-3c18e810ab17c76f
Call-ID: 
CSeq: 1 MESSAGE
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: <sip:192.168.100.02:54010>
Content-Type: text/plain
Content-Length: 11

Hello Hello

3.2、REGISTER消息

3.2.1 非鉴权注册消息

192.168.2.161机器发送注册消息给192.168.2.89服务器:

REGISTER sip:192.168.2.89 SIP/2.0

Via: SIP/2.0/UDP 192.168.2.161:10586
Max-Forwards: 70
From: <sip:>;tag=ca04c1391af3429491f2c4dfbe5e1b2e;epid=4f2e395931
To: <sip:>
Call-ID: 
CSeq: 1 REGISTER
Contact: <sip:192.168.2.161:10586>;methods="INVITE, MESSAGE, INFO, SUBSCRIBE, OPTIONS, BYE, CANCEL, NOTIFY, ACK, REFER"
User-Agent: RTC/1.2.4949 (BOL SIP Phone 1005)
Event: registration
Allow-Events: presence
Content-Length: 0

当注册成功(回送200 OK)时,服务器发送的res消息参考如下:

SIP/2.0 200 OK

Via: SIP/2.0/UDP 192.168.2.161:10586
From: <sip:>;tag=ca04c1391af3429491f2c4dfbe5e1b2e;epid=4f2e395931
To: <sip:>;tag=-00834-14d0805b62bc026d
Call-ID: 
CSeq: 1 REGISTER
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: sip:192.168.2.161:10586
Content-Length: 0
Expires: 3600
3.2.2 鉴权注册消息

当需要鉴权注册时

  • 请求端192.168.2.161发送注册消息给192.168.2.89服务器
  • 服务器对192.168.2.161发送“401 Unauthorized”信息给请求端,提示请求端需要带上鉴权信息重新注册
  • 请求端带上鉴权信息后(带有“Authorization”头字段)重新向服务器注册
  • 服务器验证鉴权头的正确性,如果鉴权成功,给请求端发送200 OK消息。若失败,继续发送401消息。

请求端192.168.2.161发送注册消息给192.168.2.89服务器

REGISTER sip:192.168.2.89 SIP/2.0

Via: SIP/2.0/UDP 192.168.2.161:8021
Max-Forwards: 70
From: <sip:>;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430d
To: <sip:>
Call-ID: 
CSeq: 1 REGISTER
Contact: <sip:192.168.2.161:8021>;methods="INVITE, MESSAGE, INFO, SUBSCRIBE, OPTIONS, BYE, CANCEL, NOTIFY, ACK, REFER"
User-Agent: RTC/1.2.4949 (BOL SIP Phone 1005)
Event: registration
Allow-Events: presence
Content-Length: 0

服务器对192.168.2.161发送401 Unauthorized信息给请求端,提示请求端需要带上鉴权信息重新注册:

SIP/2.0 401 Unauthorized

Via: SIP/2.0/UDP 192.168.2.161:8021
From: <sip:>;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430d
To: <sip:>;tag=-001893-38ba013ba3dde36e
Call-ID: 
CSeq: 1 REGISTER
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: <sip:192.168.2.89:14010>
Content-Length: 0
WWW-Authenticate: Digest realm="192.168.2.89", qop="auth", nonce="e17d377c3d2d9c343e26576a7fd04738481dfc10", opaque="", stale=FALSE, algorithm=MD5

请求端192.168.2.161通过Authorization头字段带上鉴权头信息,发送一个新的REGISTER消息:

REGISTER sip:192.168.2.89 SIP/2.0

Via: SIP/2.0/UDP 192.168.2.161:8021
Max-Forwards: 70
From: <sip:>;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430d
To: <sip:>
Call-ID: 
CSeq: 2 REGISTER
Contact: <sip:192.168.2.161:8021>;methods="INVITE, MESSAGE, INFO, SUBSCRIBE, OPTIONS, BYE, CANCEL, NOTIFY, ACK, REFER"
User-Agent: RTC/1.2.4949 (BOL SIP Phone 1005)
Authorization: Digest username="01062237493", realm="192.168.2.89", qop=auth, algorithm=MD5, uri="sip:192.168.2.89", nonce="e17d377c3d2d9c343e26576a7fd04738481dfc10", nc=00000001, cnonce="12660455546344082314666316435946", response="f57e47ce03162293b9ced07362ce2b79"
Event: registration
Allow-Events: presence
Content-Length: 0

服务器验证鉴权头的正确性,如果鉴权成功,给请求端发送200 OK消息。若失败,继续发送401消息

SIP/2.0 200 OK

Via: SIP/2.0/UDP 192.168.2.161:8021
From: <sip:>;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430d
To: <sip:>;tag=-001894-a5eb977c8969aa51
Call-ID: 
CSeq: 2 REGISTER
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: sip:192.168.2.161:8021
Content-Length: 0
Expires: 3600

四、CPIM消息格式

SIP协议中MESSAGE消息的扩展使得SIP能够支持IM通信。
MESSAGE消息的消息体可以是任何MIME类型的消息体,包括message/cpim(见RFC3860)格式

五、参考:

CPIM消息格式
https://www.xuebuyuan.com/1929719.html

========== THE END ==========

SIP 协议详解

相关推荐