音视频学习(三)——sip协议
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协议相关推荐
- 音视频学习(三、rtmp推流)
本来是想先写这一篇的,结果写完了之后,测试,竟然推不出去,尴尬,所以赶紧去补了一下FLV格式的原理,因为这个rtmp推流推的就是flv格式,但是顺序还是不变,还是写推流,你们也可以先看FLV格式解析, ...
- android 键编译,Android 音视频学习系列 (四) 一键编译 32/64 位 FFmpeg 4.2.2
前言 2020/5/20 增加了硬件解码编译脚本 编译环境 Centos + NDK20b + FFmpeg4.2.2 + Android-21/16 2020/4/26 更新了编译 64 位脚本 编 ...
- 【原理+实战+视频+源码】抖音,快手大热背后——Android 贴心的音视频学习指南来咯!
导语 Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 音视频的开发,往往是比较难的,而这个比较难 ...
- Android音视频学习系列(七) — 从0~1开发一款Android端播放器(支持多协议网络拉流本地文件)
系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...
- Android音视频学习系列(八) — 基于Nginx搭建(rtmp、http)直播服务器
系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...
- IOS音视频(三)AVFoundation 播放和录音
IOS音视频(三)AVFoundation 播放和录音 1. 音频理论知识 1.1 声音的物理性质 1.2 数字音频 1.2.1 采样.量化和编码 1.2.2 音频编码 1.3 音频编解码 2. 播放 ...
- Android音视频学习系列(五) — 掌握音频基础知识并使用AudioTrack、OpenSL ES渲染PCM数据
系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...
- 音视频 | 音视频学习-01
音视频 | 音视频学习1 1.说一下播放器的设计过程 这里的话主要分以下几步完成: 开启一个线程进行解封装操作 .读取音频.视频的压缩数据,并进行区分.若视频数据则插入视频队列,音频数据则插入音频队列 ...
- 音视频学习之ffmpeg时间戳相关整理(时间基tbr,tbn,tbc)
1: I帧/P帧/B帧 I帧:I帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含⼀幅完整的图像信息,属于帧内编码图像,不含运动⽮量,在解码时不需要参考其他帧图像.因此在I帧 ...
- Android 音视频开发(三) -- Camera2 实现预览、拍照功能
音视频 系列文章 Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍 ...
最新文章
- 在PHP中使用全局变量的几种方法
- 如何检查当TextBox设置为多行时是不是超长了?
- 全球智能驾驶公司列表
- Android stadio 模板 liveTemplate不管用
- 数据结构 python的书推荐-为什么程序员一定要学数据结构?数据结构书单推荐~...
- 题目1103:二次方程计算器
- Java并发工具包( java.util.concurrent)
- php 状态模式,PHP设计模式(十九)—状态模式 (State Pattern)
- 关于抢红包的_关于抢红包的话题800字作文
- Android官方开发文档Training系列课程中文版:连接无线设备之通过P2P搜索网络服务
- 适合0基础的web开发系列教程-canvas
- int main()和void main()的区别
- DevExpress XtraGrid网格控件示例四:初始化新建行的单元格
- Oracle 10g数据仓库实践pdf
- 窗体全部透明,控件不透明
- 基于时间窗的AGV调度算法优化
- Django 开发收银系统六
- 浅谈 Java 24个设计模式(23个GoF设计模式 + 简单工厂模式) 之 六个创建型模式...
- SHA-512摘要算法(带示例)
- iOS 音乐播放器demo讲解
热门文章
- catia曲面扫掠命令详解_CATIA建模教程(三)——扫掠曲面在曲面造型中的应用.pdf...
- Java获取List长度
- 网管管理软件的作用及发展趋势
- GMP编译make check时出现FAIL t-scan
- 电脑蓝牙音箱,有效解决笔记本电脑连接不了蓝牙音箱的办法
- python中pandas库的作用_Python数据分析之Pandas库(笔记)
- 打印系统开发(5)——书脊
- java 十进制十六进制转换_Java进制转换之十六进制转十进制
- Java进制转换详解
- 【CUDA】cuda安装 (windows版)