1. 概念

SIP协议全称“会话发起协议”,属于应用层控制协议。它规定一个或多个参与方的终端进行交互通信的标准,能够建立、修改和中断连接实现视频、语音、即时通讯等,在OSI模型中位于会话层,如下图所示:

是一种什么协议?

  • SIP是一个基于文本的应用层控制协议,严格来讲属于会话层,用于创建、修改和释放一个或多个参与者的会话。这些会话可以是Internet多媒体会议、IP电话或多媒体分发。会话的参与者可以通过组播(multicast)、网状单播(unicast)或两者的混合体进行通信;
  • SIP是一种信令协议,用于初始、管理、终止网络中的语音和视频会议,具体地说就是用来生成、修改和终结一个或多个参与者之间的会话;
  • SIP是点对点协议;
  • SIP协议的终端可以是PC机、对讲仪终端、安装特定软件的手机、平板、网页或者语音机器人等定制化设备。主要用于即时通信;
  • SIP是一种源于互联网的IP语音会话控制协议,具有灵活、易于实现、便于扩展等特点;
  • 它是一种应用层协议,与其他应用层协议协同工作,通过Internet控制多媒体通信会话;
  • SIP与负责语音质量的预留协议(RSVP)互操作。它还与若干个其他协议进行协作,包括负责定位的轻型目录访问协议(LDAP)、负责身份验证的远程身份验证拨入用户服务 (RADIUS) 以及负责实时传输的 RTP 等多个协议;

2. 功能

  • 用户定位:SIP协议中被叫方可在不同位置移动,呼叫方用户请求与被叫方建立会话时,向SIP服务器发送请求查找找用户位置;
  • 用户有效性:会话参与者可以有多名,在收到呼叫请求之后,可自愿选择是否参与会话;
  • 用户能力描述:请求方在SDP中描述自身支持哪些媒体数据或会话参数;
  • 建立会话:在用户发送会话请求时,必要的一些媒体参数已描述清楚后,被叫方用户接受请求,并根据请求信息中的SDP描述来配置后,需要发送“Ringing"振铃消息建立起会话;
  • 会话管理:添加、修改媒体流参数或其他参数;保持会话等待、激活会话和终止现有会话。

3. 消息类型

SIP协议的消息是基于文本的协议,标准的消息由开始行、消息头和消息体组成,分为请求消息和响应消息,区别在于消息的起始行是否包含状态信息。SIP请求消息定义了6种方法:

  • REGISTER注册:UAC启动时告诉注册服务器自身的位置
  • INVITE邀请:UA发起会话邀请
  • ACK: 被呼叫方在收到邀请后,回应200或180表示确认,ACK表示主叫方收到确认信息,会话建立成功
  • CANCEL:被呼叫方取消主叫方的会话邀请
  • BYE:会话参与者有一方想退出已建成功的会话,发起BYE消息
  • OPTIONS:查询代理服务器的能力和负载情况

响应消息有6种,包含临时应答、请求成功、位置异常通知、请求失败通知、服务器故障或全局错误。

SIP协议支持消息扩展,消息类型、消息头和消息体都可以扩充,如以下几种情况

  • 将电话信令集成到sip消息中,以解决公共交换电话网和sip网络和互联;
  • 解决跨网域的防火墙和NAT通信问题;
  • refer事件扩展,支持呼叫转移;

4. 主要组件

  • 终端用户设备UA:用于创建和管理 SIP协议会话的设备;
  • 位置服务器:记录并管理UA的位置信息;
  • 注册服务器 :为了判定用户的处于何地,UA终端注册到一个注册服务器,注册服务器会分配特定地址给到终端UA ,该地址是有生命周期的,UA需要定时刷新注册状态以保活;
  • 代理服务器:接受UA 的会话请求并查询注册服务器,获取收件方 UA 的地址信息。然后,它将会话邀请信息直接转发给收件方 UA(同一域中)或代理服务器(UA 位于另一域中)。根据对请求的处理方式分为有状态代理服务器和无状态代理服务器,无状态代理服务器仅对消息进行简单传递,有状态代理服务器会保留接收的请求和应答的相关信息,用于处理与该消息有关的后续消息。通过创建事务状态机对消息的全生命周期进行管理,每条都是会给事务状态机处理,直到事务完成;
  • 重定向服务器:接收请求后查询请求消息者的位置信息,然后在应答消息中创建位置列表请返回该信息,允许 SIP代理服务器将 SIP协议会话邀请信息定向到外部域;

5. 标准协议

SIP协议被设计为非常简单,具有有限的命令集。它也是基于文本的,因此任何人都可以读取在SIP会话中的端点之间传递的SIP消息。

SIP的标准协议都是IETF制定的,所以SIP的标准协议都是通过RFCXXXX的方式来公布的,每个协议均制定了一些SIP的特性:

  • RFC3261:SIP的基本协议,定义了SIP的基本功能,特性等。要搞SIP的话,这个协议是不能不看的。网上有人已经将它翻译成中文,再结合英文原版协议看,应该比较好理解。
  • RFC3262:SIP中,如何定位服务器。这个没过多研究,一般的SIP协议栈都可以很好的支持,让它们去做就可以了。
  • RFC3265:事件通知机制,可通过此协议进行一些事件监控。
  • RFC3515:呼叫的转接。
  • RFC3666:与PSTN连接时的一些特性的说明。
  • RFC3911:通过Join的方式进行会议。

6. 实现机制

SIP是一个分层结构的协议,它的行为根据一组平等独立的处理阶段来描述,每个阶段之间是松耦合的关系。

  • SIP的最低层是其语法和编码。其编码使用扩充的背景 - 诺尔表单语法(BNF)指定。
  • 第二层是传输层。它定义了客户端如何发送请求和接收响应,以及服务器如何通过网络接收请求和发送响应。所有SIP元素都包含传输层。
  • 接下来是交易层。事务是由客户机事务(使用传输层)发送到服务器事务的请求,以及从服务器事务发送回客户机的对该请求的所有响应。用户代理客户端(UAC)完成的任何任务都使用一系列事务进行。无状态代理不包含事务层。
  • 交易层上方的图层称为交易使用者。除了无状态代理,每个SIP实体都是事务用户。

7. 会话过程

SIP协议同HTTP协议相似并采用了一些相同的设计原则如客户端UAC/服务端UAS模型,主动发起请求端为UAC端,接受请求端为UAS端,一个请求的完整称为一个事务,以一个或者多个响应结束,中间可以支持多个临时响应,在这个过程中UAC和UAS的角色是可以互换的,如一次呼叫事务中A发起呼叫,A是UAC,另一端是UAS;呼叫结束时谁先挂机谁是UAC,另一端是UAS。

SIP协议以INVITE请求,以SIP URL的方法表示发起以BYE请求来结束。根据不同的网络结构分为三种方式:两个UA之间直接进行呼叫、通过代理服务器呼叫和通过重定向的方式呼叫。SIP一般需要使用以下协议完整一次完成的通信:

  • SDP:会话名称、会话时间、 哪个IP端口、会话参与者所支持的多媒体种类、传输协议类型、编解码算法等信息
  • RTP: 实时传输协议
  • RTCP: 实时传输控制协议, 和 RTP一起工作的控制协议
  • TLS:提供安全性和完整性保障

7.1 一对一呼叫

无代理服务器的会话创建过程,直接实现SIP的消息发起和响应过程。

7.2 通过代理服务器呼叫

7.3 通过重定向呼叫

UAC通过重定向服务器获得真是UAS地址后,之后的通信过程和一对一的呼叫过程一样。

在200 OK传输过程如果对端在超时后没有收到,则说明该丢失要重新发送,直到UAS收到ACK请求,确保可靠性传输的完全完成。

音视频学习(三)——sip协议相关推荐

  1. 音视频学习(三、rtmp推流)

    本来是想先写这一篇的,结果写完了之后,测试,竟然推不出去,尴尬,所以赶紧去补了一下FLV格式的原理,因为这个rtmp推流推的就是flv格式,但是顺序还是不变,还是写推流,你们也可以先看FLV格式解析, ...

  2. android 键编译,Android 音视频学习系列 (四) 一键编译 32/64 位 FFmpeg 4.2.2

    前言 2020/5/20 增加了硬件解码编译脚本 编译环境 Centos + NDK20b + FFmpeg4.2.2 + Android-21/16 2020/4/26 更新了编译 64 位脚本 编 ...

  3. 【原理+实战+视频+源码】抖音,快手大热背后——Android 贴心的音视频学习指南来咯!

    导语 Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 音视频的开发,往往是比较难的,而这个比较难 ...

  4. Android音视频学习系列(七) — 从0~1开发一款Android端播放器(支持多协议网络拉流本地文件)

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  5. Android音视频学习系列(八) — 基于Nginx搭建(rtmp、http)直播服务器

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  6. IOS音视频(三)AVFoundation 播放和录音

    IOS音视频(三)AVFoundation 播放和录音 1. 音频理论知识 1.1 声音的物理性质 1.2 数字音频 1.2.1 采样.量化和编码 1.2.2 音频编码 1.3 音频编解码 2. 播放 ...

  7. Android音视频学习系列(五) — 掌握音频基础知识并使用AudioTrack、OpenSL ES渲染PCM数据

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  8. 音视频 | 音视频学习-01

    音视频 | 音视频学习1 1.说一下播放器的设计过程 这里的话主要分以下几步完成: 开启一个线程进行解封装操作 .读取音频.视频的压缩数据,并进行区分.若视频数据则插入视频队列,音频数据则插入音频队列 ...

  9. 音视频学习之ffmpeg时间戳相关整理(时间基tbr,tbn,tbc)

    1: I帧/P帧/B帧 I帧:I帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含⼀幅完整的图像信息,属于帧内编码图像,不含运动⽮量,在解码时不需要参考其他帧图像.因此在I帧 ...

  10. Android 音视频开发(三) -- Camera2 实现预览、拍照功能

    音视频 系列文章 Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍 ...

最新文章

  1. 在PHP中使用全局变量的几种方法
  2. 如何检查当TextBox设置为多行时是不是超长了?
  3. 全球智能驾驶公司列表
  4. Android stadio 模板 liveTemplate不管用
  5. 数据结构 python的书推荐-为什么程序员一定要学数据结构?数据结构书单推荐~...
  6. 题目1103:二次方程计算器
  7. Java并发工具包( java.util.concurrent)
  8. php 状态模式,PHP设计模式(十九)—状态模式 (State Pattern)
  9. 关于抢红包的_关于抢红包的话题800字作文
  10. Android官方开发文档Training系列课程中文版:连接无线设备之通过P2P搜索网络服务
  11. 适合0基础的web开发系列教程-canvas
  12. int main()和void main()的区别
  13. DevExpress XtraGrid网格控件示例四:初始化新建行的单元格
  14. Oracle 10g数据仓库实践pdf
  15. 窗体全部透明,控件不透明
  16. 基于时间窗的AGV调度算法优化
  17. Django 开发收银系统六
  18. 浅谈 Java 24个设计模式(23个GoF设计模式 + 简单工厂模式) 之 六个创建型模式...
  19. SHA-512摘要算法(带示例)
  20. iOS 音乐播放器demo讲解

热门文章

  1. catia曲面扫掠命令详解_CATIA建模教程(三)——扫掠曲面在曲面造型中的应用.pdf...
  2. Java获取List长度
  3. 网管管理软件的作用及发展趋势
  4. GMP编译make check时出现FAIL t-scan
  5. 电脑蓝牙音箱,有效解决笔记本电脑连接不了蓝牙音箱的办法
  6. python中pandas库的作用_Python数据分析之Pandas库(笔记)
  7. 打印系统开发(5)——书脊
  8. java 十进制十六进制转换_Java进制转换之十六进制转十进制
  9. Java进制转换详解
  10. 【CUDA】cuda安装 (windows版)