【入门篇】SIP 协议详解

article/2025/9/23 7:22:59

本博客转载自: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。其会话建立过程如下图所示:

 SIP协议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.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/cpimmessage/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消息为例:

Pager Model

  • 步骤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发起会话请求
ACKINVITE 请求的响应的确认
CANCEL取消请求
BYE终结会话
OPTIONS查询服务器能力
MESSAGERFC3428对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含义
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全忙

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
ViaVia头域是被服务器插入request中,用来检查路由环的,并且可以使response根据via找到返回的路Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse
Max-Forwards用于表示这个包最多可以传送多少跳,每经过一跳都会减一当Max-Forwards==0系统会返回483。默认为70Max-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为例:

Pager Model

步骤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="{&quot;mod&quot;:&quot;1585297308_001&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/aiwusheng/article/details/104661248&quot;,&quot;extend1&quot;:&quot;pc&quot;,&quot;ab&quot;:&quot;new&quot;}"><div></div></div><link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e0530931f4.css" rel="stylesheet"></div>

http://chatgpt.dhexx.cn/article/f0isfyGV.shtml

相关文章

[Appium] Appium自动化测试原理及配置项

Appium自动化测试原理及配置项 一、App自动化测试原理 通过设计自动化脚本&#xff0c;通过发送指令到Appium Server&#xff0c;然后Appium Server转发指定到Android SDK框架来操作被测手机&#xff0c;这个类似于selenium通过浏览器驱动来操作浏览器 Android SDK不同系统不…

Appium 使用

前提是手机易经通过adb连接到电脑 1、打开Appium 点击startServer 2、打开Appium Inspector 填写下面的数据 desired_caps常用参数:platformName 平台的名称&#xff1a;iOS, Android, or FirefoxOSplatformVersion 设备系统版本号deviceName 设备…

Appium+Python第一篇:appium的基本使用及启动APP

一、appium的基本使用 appium环境安装 1、安装Android SDK &#xff08;1&#xff09;配置环境变量 用户变量的path添加以下三个路径&#xff1a; %ANDROID_HOME%\build-tools\31.0.0 %ANDROID_HOME%\platform-tools %ANDROID_HOME%\tools - 系统变量添加&#xff1a; 变量…

Appium - 入门指南(偏重于实际操作)

前言 此文章 偏向于实操 appium支持在不同平台上&#xff08;windows&#xff0c;linux、mac&#xff09; - 使用测试脚本&#xff08;支持不同语言C #&#xff0c;json&#xff0c;Ruby等等&#xff09; - 模拟测试各个平台的app&#xff08;web、windows、mobile等&#xff…

appium原理常用指北

环境搭建外文链接 1、appium电脑手机连接 环境需要&#xff1a;jdk、sdk、appium服务、手机(打开开发者模式) 检验&#xff1a;手机数据线连接电脑&#xff0c;电脑终端输入查看命令&#xff0c;出现设备表示连接成功。 adb devices启动appium服务&#xff0c;默认端口4723就…

手机APP自动化 Appium教程

Appium原理与安装 Appium 是一个移动 App &#xff08;手机应用&#xff09;自动化工具。 手机APP 自动化有什么用&#xff1f; 自动化完成一些重复性的任务比如微信客服机器人爬虫自动化测试 Appium 自动化方案的特点&#xff1a; 开源免费支持多个平台支持多种类型的自动…

Appium 简介

1.1 Appium 概述 Appium 是一个开源、跨平台&#xff08;测试程序跨平台、支持多平台上的app测试&#xff09;、多语言支持的&#xff08;开发语言&#xff09;移动应用自动化工具。 1.1.1 测试对象 Appium 的测试对象包括&#xff1a;原生 app&#xff0c;混合 app&#xf…

Appium 简明教程

转载&#xff1a;Appium 简明教程&#xff1a;http://www.testclass.net/appium https://www.cnblogs.com/fnng/p/4540731.html Appium 官网&#xff1a;http://appium.io/ Github 地址&#xff1a;https://github.com/appium/appium 主要包括以下几部分&#xff1a; appium新…

Appium框架原理和工作流程

一、Appium的框架原理 Appium是在手机操作系统自带的测试框架基础上实现的&#xff0c;Android和iOS的系统上使用的工具是&#xff1a; Android4.2以后是基于UIAutomator框架实现查找注入事件&#xff0c;iOS是UIAutomation Appium的架构原理如图&#xff0c;由客户端和服务…

Selenium+Appium底层原理

selenium 从某一方面来讲其实就是一个web服务器。 我们启动webdriver服务时&#xff0c;会在webdriver服务里生成对应的session,只要服务启动起来了&#xff0c;无论什么类型的客户端&#xff0c;理论上只要获取到了生成的session,请求时带上此session,应该都是可以和webdriver…

appium底层实现原理解析

appium原理 转自 木木L玲 一、什么是Appium Appium是一个开源、跨平台的测试框架&#xff0c;可以用来测试原生及混合的移动端应用。Appium支持IOS、Android及FirefoxOS平台。Appium使用WebDriver的json wire协议&#xff0c;来驱动Apple系统的UIAutomation库、Android系统…

【Appium学习总结1】----原理

Appium 是一个开源工具&#xff0c;用于自动化 iOS 手机、 Android 手机和 Windows 桌面平台上的原生、移动 Web 和混合应用。 appium安卓设备通信流程&#xff1a; 脚本-----------------> appium server-----------------> bootstrap.jar-----------------> uiauto…

Appium的使用

一、环境配置&#xff1a; 1、安装Node.js 2、配置JDK环境 3、配置Android SDK环境 4、安装Appium桌面版本 5、配置Python环境&#xff0c;安装selenium、Appium-Python-Client库 6、安装模拟器&#xff08;MuMu模拟器&#xff09; 环境配置参考&#xff1a; 这里是引用 二、使…

Appium 介绍以及工作原理

目录 1、什么是Appium&#xff1a;2、Appium各类组件&#xff1a;3、Appium理念&#xff1a;4、三张图了解 Appium工作原理&#xff1a; 1、什么是Appium&#xff1a; appium是一个移动端的自动化测试框架&#xff0c;可用于测试原生应用、移动网页应用、混合型应用&#xff0…

了解appium自动化的工作原理(uiautomator)

一、Appium加载的过程图解 Appium的原理 WebDriver script&#xff1a;我们的测试脚本&#xff08;java or python&#xff09; Appium&#xff1a; 会首先开启一个监听4723端口的server&#xff0c;接收测试脚本发送过来的对应请求&#xff0c;再将对应的请求发送给中间件Bo…

appium自动化的工作原理

appium自动化的工作原理 1. Appium组件 Appium Server Appium是一个C/S结构&#xff0c;包括Server和Client。Appium Server是Appium的服务端&#xff0c;作为一个Web接口服务&#xff0c;使用Node.js实现。 Appium Desktop Appium Server的图像界面&#xff0c;可设置启…

【Appium系列】- 框架原理

目录 简介 Appium支持哪些平台呢&#xff1f; Appium架构 Session Desired Capabilities 简介 Appium是一个跨平台的开源的自动化测试工具&#xff0c;可以用于测试不同类型的移动端应用程序&#xff08;Appium基础之App类型&#xff09;&#xff0c;这是一个非常优秀好用…

Appium学习日记(一)——Appium工作原理及其主要组件

Appium工作原理及其主要组件 Appium的工作原理(how Appium works) Appium的核心是一个服务器&#xff0c;它侦听符合API规范WebDriver的传入HTTP请求。对于那些过去使用Selenium为基于浏览器的应用程序进行测试自动化的人来说&#xff0c;这听起来可能已经很熟悉了。   WebD…

Appium详解

一、Appium安装 1、安装JDK&#xff08;1.8.0&#xff09;并配置环境 1、JDK文件下载安装下载JDK文件&#xff0c;点击运行安装2、配置环境&#xff08;1&#xff09;新建一个名为“JAVA_HOME”的环境变量&#xff0c;变量值为JDK的安装路径&#xff08;2&#xff09;选择Path…

appium工作原理详讲

appium简介 appium是一个移动端自动化框架&#xff0c;它采用C/S的设计模式&#xff0c;支持多类开发语言&#xff08;java python js c#…&#xff09;、支持多平台(ios android)&#xff0c;支持跨平台使用(windows linux)。它适用于原生或混合移动应用&#xff1b; appium…