目录

一、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. 步骤1:主叫方A发送INVITE请求到代理服务器;
  2. 步骤2:代理服务器发送100 Trying 响应主叫方A;
  3. 步骤3~6:代理服务器搜索被叫方B的地址,获取地址后转发INVITE请求;
  4. 步骤7~9:被叫方B生成的180 振铃响应,返回给主叫方A;
  5. 步骤10~12:被叫方B生成的200 OK响应,返回给主叫方A;
  6. 步骤13~17:主叫方A收到被叫方B200 OK响应后,向被叫方B发送一个ACK,会话建立;
  7. 步骤18~20:会话结束后,任何参与者(A或B)都可以发送一个BYE请求来终止会话;
  8. 步骤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)鉴权注册消息

当需要鉴权注册时:

  1. 请求端192.168.2.161发送注册消息给192.168.2.89服务器
  2. 服务器对192.168.2.161发送“401 Unauthorized”信息给请求端,提示请求端需要带上鉴权信息重新注册
  3. 请求端带上鉴权信息后(带有“Authorization”头字段)重新向服务器注册
  4. 服务器验证鉴权头的正确性,如果鉴权成功,给请求端发送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协议【详解】相关推荐

  1. SSL / TLS 协议运行机制详解

    转载自  SSL / TLS 协议运行机制详解 互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想 ...

  2. 流媒体协议之RTSP详解

    1 流媒体协议之RTSP详解 文章目录 1 流媒体协议之RTSP详解 1.1 RTSP概述 1.2 RTSP协议交互过程 1.2.1 RTSP基于TCP交互过程 1.2.2 RTSP基于HTTP的交互 ...

  3. HTTP协议状态码详解(HTTP Status Code)

    HTTP协议状态码详解(HTTP Status Code) 使用ASP.NET/PHP/JSP 或者javascript都会用到http的不同状态,一些常见的状态码为: 200 – 服务器成功返回网页 ...

  4. 虚拟路由器冗余协议VRRP原理详解!

    虚拟路由器冗余协议VRRP原理详解! https://virtual.51cto.com/art/201905/596666.htm?pc 我们知道,为了实现不同子网之间的设备通信,需要配置路由.目前 ...

  5. HTTP协议状态码详解(HTTP Status Code)(转)

    原文链接:HTTP协议状态码详解(HTTP Status Code) 使用ASP.NET/PHP/JSP 或者javascript都会用到http的不同状态,一些常见的状态码为:  200 – 服务器 ...

  6. 流媒体协议之RTMP详解

    流媒体协议之RTMP详解 文章目录 流媒体协议之RTMP详解 1 RTMP概述 2 RTMP交互过程 2.1 握手协议 2.2 RTMP分块(chunk) 2.3 协议控制消息(Protocol Co ...

  7. 传输协议之ICMP详解

    文章目录 TCP和UDP ICMP 简介 ICMP出现的原因 ICMP的用途 ICMP作为IP的上层协议在工作(报文) ICMP实现之MTU探索 ICMP实现之改变路由 ICMP实现之源点抑制 ICM ...

  8. STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解

    STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解 上一次我们讲了OneNet平台的注册,这次我们来讲一下MQTT的常用报文用法 上一篇地址https ...

  9. sip协议呼叫流程详解

    1.SIP业务基本知识 1.1 业务介绍 会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始.管理和终止网络中的语音和视频会话,具体地说就是用来生成.修改和 ...

最新文章

  1. excel冻结窗口怎么设置_IE浏览器弹出窗口怎么设置
  2. Linux系统结构学习
  3. 疫情之下第一个倒闭航空公司:百年老店Avianca申请破产保护,国内民航也不乐观...
  4. Python极简入门:数据类型、条件语句、循环语句、异常处理
  5. PHP之PHP文件引用详解
  6. 巧用枚举CommandBehavior关闭SqlDataReader联接数据库时的conn.open状态
  7. 表示不同文件类型的魔术数字
  8. 杯水车薪!昔日手机巨头今拍卖外观设计专利抵债 起拍价仅2.11万元
  9. SCRUM Beta Day 3
  10. 机器学习的数学基础(一)—— 期望、方差、协方差与相关系数
  11. USB学习笔记连载(十五):USB固件更新以及安装驱动
  12. tp3.2 URL模式
  13. VScode Remote SSH连接失败
  14. vue+three.js导入obj模型不显示问题
  15. ARM Cortex-A系列(A53、A57、A73等)处理器性能分类与对比
  16. SQLmap 扫描工具的使用
  17. BZOJ3786 星际探索
  18. 虚拟机上服务器开机经常黑屏,VMware虚拟机开机黑屏怎么办?虚拟机开机就黑屏的完美解决办法...
  19. 政务行业云平台安全防护建设思路
  20. java 实现图片旋转_java实现图片旋转

热门文章

  1. Python数据分析案例14——文本计算TF-IDF值和LDA主题模型
  2. Windows找不到文件c:program files怎么办?
  3. 一名投资客手写MT4爆仓现价
  4. 推挽电路---采用二极管消除交越失真----克服交越失真的互补推挽输出电路图
  5. x265中计算RD Cost的几种方式
  6. 无线网络两台计算机如何共享打印机,打印机共享:如何实现多台电脑控制共用一台打印机(二无线篇)...
  7. 微信接口开发 2----接收微信接口返回的数据
  8. 赫赫大名的A*寻路算法(vb.net版本)
  9. 怎样用计算机画图抠图,画图抠图透明,画图工具怎么改底色
  10. 《惢客创业日记》2020.07.18-19(周六)谦逊的野人-马斯克