一、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 协议,即 会话初始协议(Session Initiation Protocol),是一个应用层的 点对点协议,用于初始、管理和终止网络中的语音和视频会话,是 GB28181 的核心之一。

按照 IETFRFC2543 的定义:

SIP是一个基于文本的应用层控制协议,独立于底层传输协议 TCP/UDP/SCTP,用于建立、修改和终止IP网上的双方或多方多媒体会话。SIP协议借鉴了HTTP、SMTP等协议,支持代理、重定向及登记定位用户等功能,支持用户移动。通过与RTP/RTCP、SDP、RTSP等协议及DNS配合,SIP支持语音、视频、数据、E-mail、状态、IM、聊天、游戏等。SIP协议可在TCP或UDP之上传送,由于SIP本身具有握手机制,可首选UDP。

SIP 协议虽然属于应用层协议,然而 SIP 本身并不提供任何服务。但是 SIP 是通信的基础,在 SIP 这个通信的基础上可以用来构建不同的服务。SIP 协议在建立和维持多媒体会话中,主要支持如下 5 个功能:

1) 检查终端用户的位置。无论被叫方在哪里均能确保呼叫达到被叫方,进行任何描述信息到定位信息的转换;

2)检查用户参与会话的意愿程度。参与者在呼叫中能够引入其他用户加入或者取消其他用户的连接;

3)检查媒体和媒体参数,允许与呼叫有关的组在支持特性上保持一致;

4)在呼叫与被叫双方建立会话;

5)发送和终止会话,修改会话参数,激活服务等会话管理操作;

二、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收到被叫方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字节的数据。

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消息为例:

步骤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/2.0 /r/n

Method 以下列出了几种消息Method方法:

Request-URI

指示请求的用户或者服务的地址信息

SIP-Version请求和响应消息都需要包含SIP版本信息

3.2、状态行

状态行格式:

SIP-Version Status-Code Reason-Phrase CRLF

状态行举例:

SIP/2.0 200 OK /r/n

Status-Code状态码:状态代码由3位数字组成,表示请求是否被理解或被满足。

状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。

第一个数字有五种可能的取值:

常用的状态码举例:

3.3、消息头

发送MESSAGE消息给user2

Header 字段含义说明:

四、SIP消息举例

这里举两个例子:

MESSAGE消息(Pager Mode)

REGISTER消息

4.1、MESSAGE消息(Pager Model)

以User1发送MESSAGE消息给user2为例:

步骤2:代理服务器转发User1的MESSAGE请求给USER2

代理服务器收到步骤1请求,到数据库中查找User2(注册过程中生成数据库),随后生成步骤2的数据。

步骤3:User2收到User1的消息后,回复200 OK给代理服务器

直接回应(200-OK) 没有Body,也不携带Contact头域

步骤4:代理服务器转发200 OK回复给User1

代理服务器收到回复后,去掉最顶端的Via,转发如下消息给User1

4.2、REGISTER消息

首先举例一个非鉴权注册消息。

4.2.1 非鉴权注册消息

192.168.2.161机器发送注册消息给192.168.2.89服务器:

当注册成功(回送200 OK)时,服务器发送的res消息参考如下:

4.2.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服务器

服务器对192.168.2.161发送401 Unauthorized信息给请求端,提示请求端需要带上鉴权信息重新注册:

请求端192.168.2.161通过Authorization头字段带上鉴权头信息,发送一个新的REGISTER消息:

服务器验证鉴权头的正确性,如果鉴权成功,给请求端发送200 OK消息。若失败,继续发送401消息

五、CPIM消息格式:

Message/CPIM是一个两部分实体,第一部分为消息元数据,第二部分为消息内容。这两部分与包装好的MIME头域相互独立,并且两部分之间用空格行隔开。消息元数据头信息遵循比MIME消息内容的头格式更严格的格式要求。

一个完整的消息格式如下:

m: Content-type: Message/CPIM

s:

h: (message-metadata-headers)

s:

e: (encapsulated MIME message-body)

其中,标签“m:”,“s:”,“h:”,“x:”并不是消息格式的一部分,而是用来区分消息的不同部分。具体含义如下:

m: 整个消息的MIME消息头

s: 空格分隔行

h: 消息头

e: 包含消息内容在内的封装好的MIME对象

x: 符合MIME安全的若干消息包装

u Message/CPIM消息的MIME消息头(m:)

消息的MIME消息头表示该消息采用的CPIM格式。具体形式为:

Content-type: Message/CPIM

u 消息头(h:)

在传输过程中,消息头的格式、顺序及内容都不能被修改。

具体格式为:Key:Value

对消息头的要求有:

确保一个消息头在同一行;

每行一个消息头;

处理器不能对消息头的长度限制;

消息头的开始和结尾不能出现空格;

必须使用UTF-8字符;

使用CR,LF结束该行;

消息头名称只能包含US ASCII码字符;

不能包含任何控制字符;

消息头名称冒号后必须有一个空格;

多行可以使用相同的消息头;

消息 头必须配对;

在不能识别消息头的情况下,该消息头将被忽略;

消息头的顺序不能改变;

例如:

To: Pooh Bear

From:

DateTime: 2001-02-02T10:48:54-05:00

CPIM定义的消息头有:NS、Require、From、To、cc、DateTime、Sunject。

下面是一个Message/CPIM消息的例子:

m: Content-type: Message/CPIM

s:

h: From: MR SANDERS

h: To: Depressed Donkey

h: DateTime: 2000-12-13T13:40:00-08:00

h: Subject: the weather will be fine today

h: Subject:;lang=fr beau temps prevu pour aujourd'hui

h: NS: MyFeatures

h: Require: MyFeatures.VitalMessageOption

h: MyFeatures.VitalMessageOption: Confirmation-requested

h: MyFeatures.WackyMessageOption: Use-silly-font

s:

e: Content-type: text/xml; charset=utf-8

e: Content-ID

e:

e: <body>

e: Here is the text of my message.

e: </body>

为了确保Message/CPIM的安全性,应用部署可以使用RFC1847,或其它合适的安全协议(如S/MIME或openPGP)对上述消息加密。

使用S/MIME和pkcs7,上述消息变为:

x: Content-Type: multipart/signed; boundary=next;micalg=sha1; protocol=application/pkcs7-signature

x:

x: --next

m: Content-Type: Message/CPIM

s:

h: From: MR SANDERS

h: To: Dopey Donkey

h: DateTime

h: Subject: the weather will be fine today

h: Subject:;lang=fr beau temps prevu pour aujourd'hui

h: NS: MyFeatures

h: Require: MyFeatures.VitalMessageOption

h: MyFeatures.VitalMessageOption: Confirmation-requested

h: MyFeatures.WackyMessageOption: Use-silly-font

s:

e: Content-type: text/xml; charset=utf-8

e: Content-ID:

e:

e: <body>

e: Here is the text of my message.

e: </body>

x: --next

x: Content-Type: application/pkcs7-signature

x:

x: (signature stuff)

视频通讯使用的SIP协议详解相关推荐

  1. SIP协议详解(中文)-1

    原文 1.SIP协议介绍 Internet的许多应用都需要建立和管理一个会话,会话在这里的含义是在参与者之间的数据的交换.由于考虑到参与者的实际情况,这些应用的实现往往是很复杂的:参与者可能是在代理间 ...

  2. SIP协议详解(中文)-3

    7.3.2 头域分类. 有一些头域是仅仅在请求(或者应答)中有效的.这些头域叫做请求头域或者应答头域.如果消息中的头域与这个消息的类型不匹配(比如在应答消息中出现的请求头域),这个头域必须被忽略.20 ...

  3. SIP协议详解(中文)-6

    由于MIME包体是在"inner"消息中的,实现中通常会加密MIME指定的头域,包括:MIME-Version,Content-Type,Content-Length, Conte ...

  4. sip协议详解_SIP协议详解-INVITE消息发送过程

    SIP协议是VoIP中最重要的信令控制协议.SIP中第一件事情就是主叫发送INVITE给被叫,被叫响铃.本文从多角度详细描述INVITE消息发送的全过程. 一.阅读RFC权威描述 关于INVITE消息 ...

  5. 【SIP协议详解】SIP协议各字段的含义

    Request-URI:表示消息请求的方法,其值代表了信令路径下一跳的地址,也就是目的地址 TO:头域包含了请求的逻辑接收地(目的地址)或者也可以是请求的用户(源地址) From:指定请求发起者的逻辑 ...

  6. 即时通讯音视频开发(十):实时语音通讯的回音消除技术详解

    前言 即时通讯应用中的实时音视频技术,几乎是IM开发中的最后一道高墙.原因在于:实时音视频技术 = 音视频处理技术 + 网络传输技术 的横向技术应用集合体,而公共互联网不是为了实时通信设计的.有关实时 ...

  7. modbus通讯协议详解

    1.Modbus协议简介 Modbus协议是一种广泛应用于当今工业控制领域的通用通信协议.通过此协议,控制器相互之间.或者控制器经由网路(如以太网)可以和其他设备之间进行通信.Modbus协议使用的是 ...

  8. RTSP协议详解与实时流视频预览-第6/11季视频课程-海思-朱有鹏-专题视频课程

    RTSP协议详解与实时流视频预览-第6/11季视频课程-海思-383人已学习 课程介绍         本季详细讲解RTSP协议的技术细节,并且编程实现基于RTSP协议的实时视频流传输,在局域网内浏览 ...

  9. modbus通讯协议详解(转载)

    转载自:https://www.cnblogs.com/The-explosion/p/11512677.html modbus通讯协议详解 1.Modbus 协议简介  Modbus协议是一种已广泛 ...

  10. 3、Modbus通讯协议详解

    前言 在平时用的时候模块都会带有自己的通讯协议,直接查看手册用就可以,所以平时对于modbus虽然是在用但是原理性的东西时常忘记. 但是如果你做一个底层,自己写一个通讯协议,这时候就要对协议本身有所了 ...

最新文章

  1. 高可用集群技术之heartbeat应用详解(一)
  2. 命令行配合sqlplus管理Oracle
  3. base64还原 java_base64字符串还原成原图片
  4. idea报错Class not found (在target中没有生成对应的class文件)
  5. 【嵌入式Linux】嵌入式Linux应用开发基础知识之I2C应用编程和SMBus协议及AP3216C应用编程
  6. Horizon View 7 发布Win10桌面三:链接克隆桌面池配置
  7. Jupyter Notebook——如何显示目录的导航栏(安装 Jupyter Notebook extension)
  8. linux --- TCPdump 工具
  9. PaddleOCR问题汇总(1)
  10. 几种 vue的数据交互形式
  11. 区块链学习(二)以太坊私有链搭建
  12. 项目介绍star原理_这个Python项目厉害了!多个实战案例教你分析时空数据处理...
  13. 企业级 SpringBoot 教程 (一)构建第一个SpringBoot工程
  14. 毕业设计:舆情监测系统(SpringBoot+NLP)
  15. Linux-you need at least 8.6GB disk space to install Ubuntu,this computer has only 8GB
  16. 服务器计算机性能测试,服务器平台计算性能工具Linpack服务器性能测试利器_一_.pdf...
  17. python编写poc_Poc编写
  18. 12306的“短信公众号”到底是个啥?
  19. 完全卸载docker 有效
  20. Arduino驱动LED128X64 - U8g2 自定义中文字库

热门文章

  1. JS调用OCX控件过程
  2. 小米商城官网部分代码
  3. linux opendir路径_Linux C - opendir 和 readdir 和 closedir - 目录文件打开
  4. 推荐一款基于bootstrap的漂亮的前端模板—inspinia_admin
  5. 工序能力指数Cp判定标准(附免费CPK计算工具)
  6. 看完左耳朵耗子的116篇文章,我给自己定了个5年技术规划
  7. 计算机联锁怎么排进路,计算机联锁进路选排设计
  8. 手把手教你安装破解IAR For ARM 6.3
  9. 网络通信原理之TCP,UDP,QUIC
  10. iText5实现Java生成PDF文件完整版