会话初始协议---SIP协议【详解】
目录
一、SIP协议简介
二、SIP消息的两种会话模式
1、Session Model
2、Pager Model
三、SIP消息体格式
1、请求行(request-line)
2、状态行(status-line)
3、消息头
四、SIP消息举例
1、MESSAGE消息(Pager Model)
2、REGISTER消息
(1)非鉴权注册消息
(2)鉴权注册消息
一、SIP协议简介
会话发起协议(SIP,Session Initiation Protocol)是在VoIP技术中使用的最常见的协议之一,用于控制发起、修改、终结交互式多媒体会话的信令协议。它是一种应用层协议,与其他应用层协议协同工作,以控制Internet上的多媒体通信会话。
官方指导文档参考:https://datatracker.ietf.org/doc/html/rfc3428
二、SIP消息的两种会话模式
在SIP IM通信应用过程中,一般存在着两种会话模式:
- Session Model
- Pager Model
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收到被叫方B200 OK响应后,向被叫方B发送一个ACK,会话建立;
- 步骤18~20:会话结束后,任何参与者(A或B)都可以发送一个BYE请求来终止会话;
- 步骤21~23:主叫方A发送200 OK响应来确认BYE,会话终止。
注:以上的整个流程称之为一个Dialog
2、Pager Model
在Sip消息中,对于消息体不大于1300字节时,一般采用Pager Model。Sip消息通信中采用MESSAGE方法,MESSAGE方法本身并不建立Dialog,在多数应用中,每条IM消息都是独立的,颇似分页消息。
当User1想给User2发送IM消息时,只需构造一个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)
1、请求行(request-line)
请求行格式:Method Request-URI SIP-Version CRLF
请求行举例:INVITE sip:bob@zte.com SIP/2.0 /r/n
常用的Method包括:
Method | 方法说明 |
---|---|
REGISTER | 注册 |
INVITE | 发起会话请求 |
ACK | INVITE 请求的响应的确认 |
CANCEL | 取消请求 |
BYE | 终结会话 |
OPTIONS | 查询服务器能力 |
MESSAGE | RFC3428对Sip协议的扩展,增加了MESSAGE方法。采用Pager Model进行通信,传递不超过1300字节的数据。MESSAGE方法详细可参考 “SIP-RFC3428” RFC 3428 - Session Initiation Protocol (SIP) Extension for Instant Messaging |
Request-URI
指示请求的用户或者服务的地址信息
SIP-Version
请求和响应消息都需要包含SIP版本信息
2、状态行(status-line)
状态行格式: 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、消息头
发送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: 18user2, come here.
Header 字段含义说明:
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消息举例
1、MESSAGE消息(Pager Model)
以User1发送MESSAGE消息给user2为例:
步骤1:User1发送MESSAGE请求到代理服务器
MESSAGE sip:user2@domain.com SIP/2.0Via: 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: 18user2, come here.
步骤2:代理服务器转发User1的MESSAGE请求给USER2
代理服务器收到步骤1请求,到数据库中查找User2(注册过程中生成数据库),随后生成步骤2的数据。
MESSAGE sip:user2@domain.com SIP/2.0
Via: SIP/2.0/TCP proxy.domain.com;branch=z9hG4bK123dsghds
Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse;received=1.2.3.4
Max-Forwards: 69
From: sip:user1@domain.com;tag=49394
To: sip:user2@domain.com
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Type: text/plain
Content-Length: 18user2, come here.
步骤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 OKVia: 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
2、REGISTER消息
(1)非鉴权注册消息
192.168.2.161
机器发送注册消息给192.168.2.89
服务器:
REGISTER sip:192.168.2.89 SIP/2.0Via: 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 OKVia: 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
(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.0Via: 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 UnauthorizedVia: 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.0Via: 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 OKVia: 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
会话初始协议---SIP协议【详解】相关推荐
- SSL / TLS 协议运行机制详解
转载自 SSL / TLS 协议运行机制详解 互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想 ...
- 流媒体协议之RTSP详解
1 流媒体协议之RTSP详解 文章目录 1 流媒体协议之RTSP详解 1.1 RTSP概述 1.2 RTSP协议交互过程 1.2.1 RTSP基于TCP交互过程 1.2.2 RTSP基于HTTP的交互 ...
- HTTP协议状态码详解(HTTP Status Code)
HTTP协议状态码详解(HTTP Status Code) 使用ASP.NET/PHP/JSP 或者javascript都会用到http的不同状态,一些常见的状态码为: 200 – 服务器成功返回网页 ...
- 虚拟路由器冗余协议VRRP原理详解!
虚拟路由器冗余协议VRRP原理详解! https://virtual.51cto.com/art/201905/596666.htm?pc 我们知道,为了实现不同子网之间的设备通信,需要配置路由.目前 ...
- HTTP协议状态码详解(HTTP Status Code)(转)
原文链接:HTTP协议状态码详解(HTTP Status Code) 使用ASP.NET/PHP/JSP 或者javascript都会用到http的不同状态,一些常见的状态码为: 200 – 服务器 ...
- 流媒体协议之RTMP详解
流媒体协议之RTMP详解 文章目录 流媒体协议之RTMP详解 1 RTMP概述 2 RTMP交互过程 2.1 握手协议 2.2 RTMP分块(chunk) 2.3 协议控制消息(Protocol Co ...
- 传输协议之ICMP详解
文章目录 TCP和UDP ICMP 简介 ICMP出现的原因 ICMP的用途 ICMP作为IP的上层协议在工作(报文) ICMP实现之MTU探索 ICMP实现之改变路由 ICMP实现之源点抑制 ICM ...
- STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解
STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解 上一次我们讲了OneNet平台的注册,这次我们来讲一下MQTT的常用报文用法 上一篇地址https ...
- sip协议呼叫流程详解
1.SIP业务基本知识 1.1 业务介绍 会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始.管理和终止网络中的语音和视频会话,具体地说就是用来生成.修改和 ...
最新文章
- excel冻结窗口怎么设置_IE浏览器弹出窗口怎么设置
- Linux系统结构学习
- 疫情之下第一个倒闭航空公司:百年老店Avianca申请破产保护,国内民航也不乐观...
- Python极简入门:数据类型、条件语句、循环语句、异常处理
- PHP之PHP文件引用详解
- 巧用枚举CommandBehavior关闭SqlDataReader联接数据库时的conn.open状态
- 表示不同文件类型的魔术数字
- 杯水车薪!昔日手机巨头今拍卖外观设计专利抵债 起拍价仅2.11万元
- SCRUM Beta Day 3
- 机器学习的数学基础(一)—— 期望、方差、协方差与相关系数
- USB学习笔记连载(十五):USB固件更新以及安装驱动
- tp3.2 URL模式
- VScode Remote SSH连接失败
- vue+three.js导入obj模型不显示问题
- ARM Cortex-A系列(A53、A57、A73等)处理器性能分类与对比
- SQLmap 扫描工具的使用
- BZOJ3786 星际探索
- 虚拟机上服务器开机经常黑屏,VMware虚拟机开机黑屏怎么办?虚拟机开机就黑屏的完美解决办法...
- 政务行业云平台安全防护建设思路
- java 实现图片旋转_java实现图片旋转
热门文章
- Python数据分析案例14——文本计算TF-IDF值和LDA主题模型
- Windows找不到文件c:program files怎么办?
- 一名投资客手写MT4爆仓现价
- 推挽电路---采用二极管消除交越失真----克服交越失真的互补推挽输出电路图
- x265中计算RD Cost的几种方式
- 无线网络两台计算机如何共享打印机,打印机共享:如何实现多台电脑控制共用一台打印机(二无线篇)...
- 微信接口开发 2----接收微信接口返回的数据
- 赫赫大名的A*寻路算法(vb.net版本)
- 怎样用计算机画图抠图,画图抠图透明,画图工具怎么改底色
- 《惢客创业日记》2020.07.18-19(周六)谦逊的野人-马斯克