【入门篇】SIP 协议详解
本博客转载自:https://xiaxl.blog.csdn.net/article/details/104661248
SIP 协议详解
2013年参与过一个“视频通讯的App”项目,使用Sip协议通信。当时通信协议这块不是自己负责,加上时间紧、任务重等方面的原因,一直未对Sip协议进行过深入的了解。
2020年春天疫情突发,宅在家里终于有了空余时间。这里来详细了解一下Sip协议。
以下内容大致分为以下几个部分:
- 协议简介
- 两种Sip会话模式Session Model与Pager Model;
- Sip 消息体结构
- 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技术对于他们的远意义。
二、Sip消息的两种会话模式
在Sip IM通信应用过程中,一般存在着两种会话模式:
- Session Model
- Pager Model
2.1、Session Model
会话中,对于消息体内容大于1300字节
时,一般采用Session Model
。其会话建立过程如下图所示:
主叫方A呼叫被叫方B:
- 步骤1:
主叫方A
发送INVITE
请求到代理服务器
; - 步骤2:
代理服务器
发送100 Trying 响应主叫方A
; - 步骤3~6:
代理服务器
搜索被叫方B
的地址,获取地址后转发INVITE请求; - 步骤7~9:
被叫方B
生成的180 振铃响应,返回给主叫方A
; - 步骤10~12:
被叫方B
生成的200 OK响应,返回给主叫方A
; - 步骤13~17:
主叫方A
收到被叫方B
200 OK响应后,向被叫方B
发送一个ACK,会话建立; - 步骤18~20:会话结束后,任何参与者(A或B)都可以发送一个BYE请求来终止会话;
- 步骤21~23:
主叫方A
发送200 OK响应来确认BYE,会话终止。
注:以上的整个流程称之为一个Dialog
2.2、Pager Model
在Sip消息中,对于消息体不大于1300字节
时,一般采用Pager Model
。Sip消息通信中采用MESSAGE
方法,MESSAGE
方法本身并不建立Dialog
,在多数应用中,每条IM消息都是独立的,颇似分页消息。
2.2.1 MESSAGE方法的由来
RFC3428
对Sip协议进行了扩展,在Sip协议中增加了MESSAGE
请求方法。采用Pager Model进行通信,传递不超过1300字节的数据。MESSAGE方法详细可参考 “SIP-RFC3428” https://tools.ietf.org/html/rfc3428 。
2.2.2 MESSAGE方法消息体
当User1想给User2发送IM消息时,只需构造一个MESSAGE,发出去即可。
对于其消息体body
可以是任何MIME
格式。但必须支持plain/text
格式,可以选择支持message/cpim
、message/sdp
格式,可能用message/cpim
会好一点,因为已有的IM系统标准是message/cpim
格式。
注:想了解CPIM消息格式的同学可参考:CPIM 消息格式:https://xiaxl.blog.csdn.net/article/details/104718006
注:想了解SDP消息格式的同学可参考:SDP 消息格式:https://xiaxl.blog.csdn.net/article/details/104723834
2.2.3 Pager Model请求流程如下
以User1向User2发送MESSAGE消息为例:
- 步骤1:
User1
发送MESSAGE
请求到代理服务器
; - 步骤2:
代理服务器
转发User1
的MESSAGE请求给USER2
; - 步骤3:
User2
收到User1
的消息后,回复200 OK给代理服务器
; - 步骤7~9:
代理服务器
转发200 OK回复给User1
三、SIP消息体格式
SIP消息体结构
与Http协议结构
相似,均由三部分组成:
- 请求行(request-line) or 状态行(status-line)
- 消息头(header)
- 正文(body)
3.1、请求行
请求行格式:Method Request-URI SIP-Version CRLF
请求行举例:INVITE sip:bob@zte.com SIP/2.0 /r/n
Method
以下列出了几种消息Method方法
:
Method | 方法说明 |
---|---|
REGISTER | 注册联系信息 |
INVITE | 发起会话请求 |
ACK | INVITE 请求的响应的确认 |
CANCEL | 取消请求 |
BYE | 终结会话 |
OPTIONS | 查询服务器能力 |
MESSAGE | RFC3428对Sip协议的扩展,增加了MESSAGE方法。采用Pager Model进行通信,传递不超过1300字节的数据。MESSAGE方法详细可参考 “SIP-RFC3428” https://tools.ietf.org/html/rfc3428 |
Request-URI
指示请求的用户或者服务的地址信息
SIP-Version
请求和响应消息都需要包含SIP版本信息
3.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 | 含义 |
---|---|---|
100 | Trying | 试呼叫 |
180 | Ringing | 振铃 |
181 | Call is Being Forwarded | 呼叫正在前转 |
200 | OK | 成功响应 |
302 | Moved Temporarily | 临时迁移 |
400 | Bad Request | 错误请求 |
401 | Unauthorized | 未授权 |
403 | Forbidden | 禁止 |
404 | Not Found | 用户不存在 |
408 | Request Timeout | 请求超时 |
480 | Temporarily Unavailable | 暂时无人接听 |
486 | Busy Here | 线路忙 |
504 | Server Time-out | 服务器超时 |
600 | Busy Everywhere | 全忙 |
3.3、消息头
发送MESSAGE
消息给user2
MESSAGE sip:user2@domain.com SIP/2.0
Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse
Max-Forwards: 70
From: sip:user1@domain.com;tag=49583
To: sip:user2@domain.com
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Type: text/plain
Content-Length: 18
Header | 含义说明 | 举例 |
---|---|---|
Call-ID | 由本地设备(Client)生成,全局唯一,每次呼叫这个值唯一不变 | Call-ID: asd88asd77a@1.2.3.4 |
From | 表示请求的发起者 | From: sip:user1@domain.com;tag=49583 |
To | 表示请求的接收者 | To: sip:user2@domain.com |
Via | Via头域是被服务器插入request中,用来检查路由环的,并且可以使response根据via找到返回的路 | Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse |
Max-Forwards | 用于表示这个包最多可以传送多少跳,每经过一跳都会减一当Max-Forwards==0系统会返回483。默认为70 | Max-Forwards: 70 |
Contact | 包含源的URI信息,用来给响应方直接和源建立连接用 | Contact: sip:192.168.100.1:1111 |
Content-Type | 指明消息体的类型 (SDP会话描述协议) | Content-Type: text/plain;Content-Type: application/sdp; Content-Type: application/cpim; |
Content-Length | 指明消息体的字节大小 | Content-Length: 18 |
四、SIP消息举例
这里举两个例子:
- MESSAGE消息(Pager Mode)
- REGISTER消息
4.1、MESSAGE消息(Pager Model)
以User1
发送MESSAGE
消息给user2
为例:
步骤1:User1
发送MESSAGE
请求到代理服务器
MESSAGE sip:user2@domain.com SIP/2.0
Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse
Max-Forwards: 70
From: sip:user1@domain.com;tag=49583
To: sip:user2@domain.com
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Type: text/plain
Content-Length: 18
步骤3:User2
收到User1
的消息后,回复200 OK给代理服务器
直接回应(200-OK) 没有Body,也不携带Contact头域
SIP/2.0 200 OK
Via: SIP/2.0/TCP proxy.domain.com;branch=z9hG4bK123dsghds;received=192.0.2.1
Via: SIP/2.0/TCP user1pc.domain.com;;branch=z9hG4bK776sgdkse;received=1.2.3.4
From: sip:user1@domain.com;tag=49394
To: sip:user2@domain.com;tag=ab8asdasd9
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Length: 0
步骤4:代理服务器
转发200 OK回复给User1
代理服务器
收到回复后,去掉最顶端的Via
,转发如下消息给User1
SIP/2.0 200 OK
Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse;
received=1.2.3.4
From: sip:user1@domain.com;;tag=49394
To: sip:user2@domain.com;tag=ab8asdasd9
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Length: 0
4.2、REGISTER消息
首先举例一个非鉴权注册消息。
4.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:01062237496@192.168.2.89>;tag=ca04c1391af3429491f2c4dfbe5e1b2e;epid=4f2e395931
To: <sip:01062237496@192.168.2.89>
Call-ID: da56b0fab5c54398b16c0d9f9c0ffcf2@192.168.2.161
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:01062237496@192.168.2.89>;tag=ca04c1391af3429491f2c4dfbe5e1b2e;epid=4f2e395931
To: <sip:01062237496@192.168.2.89>;tag=-00834-14d0805b62bc026d
Call-ID: da56b0fab5c54398b16c0d9f9c0ffcf2@192.168.2.161
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
当需要鉴权注册时
- 请求端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:01062237493@192.168.2.89>;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430d
To: <sip:01062237493@192.168.2.89>
Call-ID: c88a247a74b54a8c9e676bdde3bba6c9@192.168.2.161
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:01062237493@192.168.2.89>;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430d
To: <sip:01062237493@192.168.2.89>;tag=-001893-38ba013ba3dde36e
Call-ID: c88a247a74b54a8c9e676bdde3bba6c9@192.168.2.161
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:01062237493@192.168.2.89>;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430d
To: <sip:01062237493@192.168.2.89>
Call-ID: c88a247a74b54a8c9e676bdde3bba6c9@192.168.2.161
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
REGISTER sip:192.168.2.89 SIP/2.0
Via: SIP/2.0/UDP 192.168.2.161:8021 Max-Forwards: 70 From:
sip:01062237493@192.168.2.89;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430d
To: sip:01062237493@192.168.2.89 Call-ID:
c88a247a74b54a8c9e676bdde3bba6c9@192.168.2.161 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:01062237493@192.168.2.89;tag=efca469543ce4788a6a6a2c7b66cd01f;epid=de4504430d
To: sip:01062237493@192.168.2.89;tag=-001894-a5eb977c8969aa51
Call-ID: c88a247a74b54a8c9e676bdde3bba6c9@192.168.2.161 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
</div><div data-report-view="{"mod":"1585297308_001","dest":"https://blog.csdn.net/aiwusheng/article/details/104661248","extend1":"pc","ab":"new"}"><div></div></div><link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e0530931f4.css" rel="stylesheet"></div>
【入门篇】SIP 协议详解相关推荐
- 入木三分学网络第一篇--VRRP协议详解-----(1)
原帖:http://blog.chinaunix.net/uid-11654074-id-2857384.html 目录 入木三分学网络第一篇--VRRP协议详解 1. VRRP产生背景及应用环境 1 ...
- 【网络篇】第十七篇——IP协议详解
IP协议 网络层与数据链路层有什么关系? 基本概念 IP协议格式 分卡与组装 网段划分 IP地址的构成 DHCP协议 IP地址的分类 IP分类的缺点 无分类地址 CIDR 特殊的IP地址 IP地址的数 ...
- jmeter 加密解密_犯罪大师入门篇密文答案 谜之解密入门篇密文解题详解_游戏资讯...
第一关 犯罪大师入门篇密文答案是什么?犯罪大师谜之解密开启了新的入门篇解密,这次的解密分为四章,每章的内容涉及猪圈密码.埃特巴什密码和元音密码三个内容.因此对玩家来讲难度是很高的,那么具体的答案是什么 ...
- SIP协议详解(中文)-3
7.3.2 头域分类. 有一些头域是仅仅在请求(或者应答)中有效的.这些头域叫做请求头域或者应答头域.如果消息中的头域与这个消息的类型不匹配(比如在应答消息中出现的请求头域),这个头域必须被忽略.20 ...
- sip协议详解_SIP协议详解-INVITE消息发送过程
SIP协议是VoIP中最重要的信令控制协议.SIP中第一件事情就是主叫发送INVITE给被叫,被叫响铃.本文从多角度详细描述INVITE消息发送的全过程. 一.阅读RFC权威描述 关于INVITE消息 ...
- SIP协议详解(中文)-6
由于MIME包体是在"inner"消息中的,实现中通常会加密MIME指定的头域,包括:MIME-Version,Content-Type,Content-Length, Conte ...
- SIP协议详解(中文)-1
原文 1.SIP协议介绍 Internet的许多应用都需要建立和管理一个会话,会话在这里的含义是在参与者之间的数据的交换.由于考虑到参与者的实际情况,这些应用的实现往往是很复杂的:参与者可能是在代理间 ...
- 入木三分学网络第一篇--VRRP协议详解-----(2)
原帖:http://blog.chinaunix.net/uid-11654074-id-2857385.html 2.4 VRRP通告报文的发送与接收处理流程 2.4.1 当收到一个VRRP通告报文 ...
- 【SIP协议详解】SIP协议各字段的含义
Request-URI:表示消息请求的方法,其值代表了信令路径下一跳的地址,也就是目的地址 TO:头域包含了请求的逻辑接收地(目的地址)或者也可以是请求的用户(源地址) From:指定请求发起者的逻辑 ...
- VRRP协议详解-----(1)
目录 入木三分学网络第一篇--VRRP协议详解 1. VRRP产生背景及应用环境 1.1为什么要用VRRP 2.VRRP基本原理及实现过程 2.1 VRRP基本概念 2.2 VRRP报文组成 2.3 ...
最新文章
- cin输入问题的处理:cin.clear() 、cin.sync() 、cin.ignore()
- John the Ripper
- (转载)android如何在style文件中使用自定义属性
- Cordova:安卓启动页图片变形
- javascript同级遍历_有用的DOM遍历方法,你需要了解一下
- 何股票投资者十有九不赢?
- uniapp 子组件 props拿不到数据_总结下React组件间的通讯
- 2019年, video captioning论文汇总
- [Java基础]Lambda表达式练习
- Android设计模式之——原型模式
- 云网一体,“湘遇湘融 | 移动云TeaTalk·长沙站 启动倒计时
- ASP.NET连接ACCESS数据库web.config内路径最优写法
- 瑞幸高层调整:郭谨一担任CEO和董事长 陆正耀出局
- 历时半载,我的新课上线了
- ibm服务器如何进入u盘装系统,加密u盘在电脑上怎么打开ibm服务器u盘装系统
- Mimics和Amira在医学影像处理中的应用介绍
- ubuntn 常用命令和快捷键汇总
- BUUCTF之随便注
- 航空公司客户价值分析R语言实现
- 如果牛顿是程序员,那么?
热门文章
- css修改上传文件按钮样式,CSS自定义文件上传按钮样式,兼容主流浏览器
- 时间序列分析实验报告总结_时间序列分析实验报告
- 农业银行联行号怎么查询_中国农业银行大额联行号12位是什么,怎么查找
- 银行行号和银行代码是一样的吗?区别是什么?
- android studio javah命令,Android Studio 配置 javah 和 ndk-build 快捷编译
- 第一章 Web应用开发简介
- Unity3d是目前主流的游戏开发引擎
- 计算机主机放电,电脑需要放电才能开机_电脑主板放电才能开机
- 小米miui全机型代码对照与各机型发布时间表 了解小米机型发展历程
- 第1章练习题-SQL基础教程