SIP 协议详解

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

SIP 协议详解

xiaxveliang   2020-03-07 我要评论
## 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](https://upload-images.jianshu.io/upload_images/5969042-5e777956fffba6ec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 主叫方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`(见RFC3860)格式,可能用`message/cpim`会好一点,因为已有的IM系统标准是`message/cpim`格式。 ##### 2.2.3 Pager Model请求流程如下 以User1向User2发送MESSAGE消息为例: ![Pager Model](https://upload-images.jianshu.io/upload_images/5969042-10ec572517864a37.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + 步骤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` ```http 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 user2, 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:

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们