GB28181系列二:SIP信令

        我的音视频/流媒体开源项目(github)

        GB28181系列目录

目录

一、SIP报文介绍      

二、SIP交互流程:

1、Session Model

2、Pager Model

3、SIP信令交互过程中的3个定义

三、媒体传输(SDP和RTP)


一、SIP报文介绍      

        这里将会介绍SIP的报文消息格式,请求/响应方法、SIP的信令交互过程。SIP请求和响应消息格式如下图所示:

        SIP报文格式和HTTP完全一样,只不过里面的值不一样,使用的错误码也是一样,比如200表示请求成功,40x表示客户端错误,50x表示服务端错误,这样SIP就很好理解了。HTTP有GET、POST等方法,同样SIP也有自己的方法。

        SIP中常见的方法如下:

INVITE:表示主叫用户发起会话,邀请其他用户加入一个会话,也可以用在呼叫建立后用于更新会话(此时INVITE又称为Re-invite)
ACK:客户端向服务器端证实它已经收到了对INVITE请求的最终响应。
PRACK:表示对1XX响应信息的确认请求消息。
BYE:表示终止一个已经建立的呼叫。
CANCEL:表示在收到对请求的最终响应之前取消该请求,对于已完成的请求则无影响。
REGISTER:表示客户端向SIP服务器端注册列在To字段中的地址信息。
OPTIONS:表示查询被呼叫的相关信息和功能。

        SIP常见的错误码如下:

00试呼叫(Trying)
180振铃(Ringing)
181呼叫正在前转(Call is Being Forwarded)
200成功响应(OK)
302临时迁移(Moved Temporarily)
400错误请求(Bad Request)
401未授权(Unauthorized)
403禁止(Forbidden)
404用户不存在(Not Found)
480暂时无人接听(Temporarily Unavailable)
486线路忙(Busy Here)
504服务器超时(Server Time-out)
600全忙(Busy Everywhere)

二、SIP交互流程:

        介绍SIP交互流程之前需要知道SIP有两种会话模式:Session Model和Pager Model。

        会话中,对于消息体内容大于1300字节时,一般采用Session Model;对于消息体不大于1300字节时,一般采用Pager Model。

        Session Model和Pager Model区别如下:

特点Session ModelPager Model
通信类型双向实时通信单向消息发送
会话持久性持久的会话,双方可实时互动息单向发送,接收方可稍后回复
建立过程需要通过INVITE建立会话不需要会话建立
实时性高实时性,需要双方即时响应较低实时性,接收方可以稍后回复
应用场景语音、视频通话、实时聊天短信、电子邮件、离线消息通知

1、Session Model

        Session Model下的两个用户通话过程的SIP消息交互如下图:

        0:用户A和用户B在终端启用之后都会向注册服务器注册自己的信息(ip地址、账号等);

        1:主叫方A发送INVITE请求到代理服务器1;

        2:代理服务器1发送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,会话终止。

        注意:连接建立之后的音视频传输就不经过代理服务器了,是用户之间直接传输(p2p)。

        这期间代理服务器只负责找到用户B并进行消息转发,如果把代理服务器去掉,而是用户A直接向用户B发起呼叫请求,那么流程就比较简单清晰了,如下图所示:

2、Pager Model

        Pager Model采用Message方法,Message方法本身并不建立Dialog(Dialog是什么会在后面说明),在多数应用中,每条IM消息都是独立的,SIP信令交互流程如下:

        Pager Model息单向发送,接收方可稍后回复,所以上图中200 OK是虚线。

3、SIP信令交互过程中的3个定义

        用户A、B之间SIP信令交互过程中有三个定义:dialog(对话)、session(会话)、transaction(事务)

        Transaction事务:是指一个请求消息以及这个请求对应的所有响应消息的集合。

        Dialog对话:是两个UA之间持续一段时间的点对点的SIP连接。

        Session会话:是一次通信过程中所有参与者之间的关联关系以及他们之间的媒体流的集合。

        上面介绍了Session Model下的两个用户通话过程的SIP消息交互流程,结合流程图再看dialog(对话)、session(会话)、transaction(事务)就比较容易理解了。

        用户A发送INVITE到收到对端的200 OK就是一个Transaction事务,用户B发送BYE到收到对端的200 OK也是一个Transaction事务,即事务就是一个完整的请求-响应过程;用户A和用户B整个通话期间(包括音视频传输过程)就是一个Session会话;用户A和用户B之间的SIP连接就是一个Dialog对话,Dialog是描述两个用户的连接即这个SIP连接的两个用户是谁,和Session不同,Session是描述两个用户的整个通话过程。

三、媒体传输(SDP和RTP)

        两个用户进行SIP信令交互的最终目的就是进行音视频通话,因此双方要进行媒体协商,SIP媒体协商使用的是SDP协议。媒体协商完毕之后,双方使用RTP协议进行音视频传输,关于RTP协议可以看我另外一个文章《RTSP系列三:RTP协议介绍》

        SDP(Session Description Protocol) 是一种用于描述多媒体会话的格式。主要用于描述会话的多媒体内容(例如音频、视频,以及编码格式)和传输方式(如传输协议、端口号等)。

sip呼叫里SDP的一些字段的含义
v=0 # sdp版本
o=- 1 0 IN IP4 164.135.25.51 # o=<用户名> <会话id> <会话版本> <网络类型><地址类型> <本机地址>
s=SNS call # 用于传递会话主题
c=IN IP4 164.135.25.51 # 记录media ip, 即接收RTP流的媒体地址,不一定是本机地址
t=0 0 # 会话时间,一般由其它信令控制,故0m=audio 30254 RTP/AVP 0 # audio/音频接收端口(必须为偶数)/表示音频通过RTP传输/0表示允许音频的格式(见下一行"a=")
a=rtpmap:0 PCMU/8000 # 如果RTP头部的类型字段如果等于0,表示RTP负载用的数据是PCMU,8000采样率格式的音频
a=sendrecv # 可以接收也可以发送音频m=video 30186 RTP/AVP 122 123 # video/视频接收端口(必须为偶数)/视频通过RTP传输/122,123表示允许视频的格式为122,123
a=rtpmap:122 H264/90000 # 如果RTP头部的类型字段如果等于122,表示RTP负载用的数据是H264编码格式的视频
a=fmtp:122 profle-level-id-64E01F;max-br=1152 # 122类型的视频编码参数
a=rtpmap:123 H264/90000 # 如果RTP头部的类型字段如果等于123,表示RTP负载用的数据是H264编码格式的视频
a=fmtp:123 profile-level-id-42E01F;max-br=1152 # 123类型的视频编码参数
a=sendrecv # 可以接收也可以发送视频

        SDP是在什么阶段协商的呢,如下图所示:

        SDP协商完毕之后就确定了使用什么方式传输(UDP-RTP/AVP,TCP-RTP/AVP/TCP)使用什么协议传输音视频(RTP),编码格式是什么(H264,PCMU),音视频传输的端口是多少(UDP记录了传输端口,新建UDP socket传输音视频;如果是TCP则不用关心SDP中的端口号,新建TCP socket传输音视频)。

        系列三将会详细介绍SIP各种类型消息包含的字段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/479805.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ViSTa:一个包含4000多个视频和逐步描述的层次化数据集,用于评估VLMs在不同复杂性任务中的表现。

2024-11-22&#xff0c;由Google DeepMind和MATS机构创建的ViSTa数据集&#xff0c;为评估视觉语言模型&#xff08;VLMs&#xff09;在理解基于顺序的任务方面的能力提供了新的视角&#xff0c;这对于强化学习中的成本降低和安全性提升具有重要意义。 数据集地址&#xff1a;…

区块链:波场-TRON链

注意: 1、调试时请将所有的API地址都换成 https://api.trongrid.io 以免报错等问题 https://api.trongrid.io 主网 (Mainnet) 适用于生产环境 https://api.shasta.trongrid.io 测试网 (Shasta) 适用于开发者测试 https://nile.trongrid.io 测试网 (Nile) …

【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配

接到一个需求是类似下图的3D多房间视角&#xff0c;需要拖拽屏幕 问题 在做这种屏幕拖拽的时候发现&#xff0c;需要拖拽起来有跟手的感觉&#xff0c;会存在不同分辨率机型的适配问题。 即&#xff1a;美术调整好了机型1的手感&#xff0c;能做到手指按下顶层地板上下挪动&…

比特币libsecp256k1中safegcd算法形式化验证完成

1. 引言 比特币和其他链&#xff08;如 Liquid&#xff09;的安全性取决于 ECDSA 和 Schnorr 签名等数字签名算法的使用。Bitcoin Core 和 Liquid 都使用名为 libsecp256k1 的 C 库来提供这些数字签名算法&#xff0c;该库以其所运行的椭圆曲线命名。这些算法利用一种称为modu…

『VUE』elementUI dialog的子组件created生命周期不刷新(详细图文注释)

目录 1. 测试代码分析令人迷惑的效果 分析原因解决方法 如何在dialog中反复触发created呢?总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 主要是在做表单的时候想要有一个编辑表单在dialog弹窗中出现,同时dialog调用的封装的…

深入探讨 Redis 持久化机制:原理、配置与优化策略

文章目录 一、引言二、Redis持久化概述三、RDB&#xff08;Redis DataBase&#xff09;持久化1、RDB概念与工作原理2、RDB的配置选项3、RDB优化配置项4、RDB的优势与劣势 三、AOF&#xff08;Append-Only File&#xff09;持久化1、AOF概念与工作原理2、AOF的三种写回策略3、Re…

使用爬虫时,如何确保数据的准确性?

在数字化时代&#xff0c;数据的准确性对于决策和分析至关重要。本文将探讨如何在使用Python爬虫时确保数据的准确性&#xff0c;并提供代码示例。 1. 数据清洗 数据清洗是确保数据准确性的首要步骤。在爬取数据后&#xff0c;需要对数据进行清洗&#xff0c;去除重复、无效和…

(计算机网络)期末

计算机网络概述 物理层 信源就是发送方 信宿就是接收方 串行通信--一次只发一个单位的数据&#xff08;串行输入&#xff09; 并行通信--一次可以传输多个单位的数据 光纤--利用光的反射进行传输 传输之前&#xff0c;要对信源进行一个编码&#xff0c;收到信息之后要进行一个…

111. UE5 GAS RPG 实现角色技能和场景状态保存到存档

实现角色的技能存档保存和加载 首先&#xff0c;我们在LoadScreenSaveGame.h文件里&#xff0c;增加一个结构体&#xff0c;用于存储技能相关的所有信息 //存储技能的相关信息结构体 USTRUCT(BlueprintType) struct FSavedAbility {GENERATED_BODY()//需要存储的技能UPROPERT…

Js-对象-04-Array

重点关注&#xff1a;Array String JSON BOM DOM Array Array对象时用来定义数组的。常用语法格式有如下2种&#xff1a; 方式1&#xff1a; var 变量名 new Array(元素列表); 例如&#xff1a; var arr new Array(1,2,3,4); //1,2,3,4 是存储在数组中的数据&#xff0…

【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序

DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 1. 窗口的划分 1.1 窗口分为&#xff1a;基于时间的窗口 和 基于数量的窗口 基于时间的窗口&#xff1a;基于起始时间戳 和终止时间戳来决定窗口的大小 基于数量的窗口&#xff1a;根据固定的数量定义窗口 的大小 这…

Java代码操作Zookeeper(使用 Apache Curator 库)

1. Zookeeper原生客户端库存在的缺点 复杂性高&#xff1a;原生客户端库提供了底层的 API&#xff0c;需要开发者手动处理很多细节&#xff0c;如连接管理、会话管理、异常处理等。这增加了开发的复杂性&#xff0c;容易出错。连接管理繁琐&#xff1a;使用原生客户端库时&…

linux系统下如何将xz及ISO\img等格式压缩包(系统)烧写到优盘(TF卡)

最近用树莓派做了个NAS&#xff0c;效果一般&#xff0c;缺少监控及UI等&#xff0c;详细见这篇文章&#xff1a; https://blog.csdn.net/bugsycrack/article/details/135344782?spm1001.2014.3001.5501 所以下载了专门的基于树莓派的NAS系统直接使用。这篇文章是顺便复习一…

带有悬浮窗功能的Android应用

android api29 gradle 8.9 要求 布局文件 (floating_window_layout.xml): 增加、删除、关闭按钮默认隐藏。使用“开始”按钮来控制这些按钮的显示和隐藏。 服务类 (FloatingWindowService.kt): 实现“开始”按钮的功能&#xff0c;点击时切换增加、删除、关闭按钮的可见性。处…

MD5算法加密笔记

MD5是常见的摘要算法。 摘要算法&#xff1a; 是指把任意⻓度的输⼊消息数据转化为固定⻓度的输出数据的⼀种密码算法. 摘要算法是 不可逆的, 也就是⽆法解密. 通常⽤来检验数据的完整性的重要技术, 即对数据进⾏哈希计算然后⽐ 较摘要值, 判断是否⼀致. 常⻅的摘要算法有: MD5…

C#变量和函数如何和unity组件绑定

1.Button On_click (1)GameObject通过Add component添加上Script (2)Button选GameObject组件而不是直接选Script,直接选Script出现不了Script中的函数 2.RawImage 上面是错的 3.Text 上面是错的&#xff0c;应该是直接在GameObject里面填上对应的值 总结&#xff1a; …

开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序源码助力品牌共建:价值、策略与实践

摘要&#xff1a;在当今数字化商业环境下&#xff0c;品牌构建已演变为企业与消费者深度共建的过程。本文聚焦于“开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序源码”&#xff0c;探讨其如何融入品牌建设&#xff0c;通过剖析品牌价值构成&#xff0c;阐述该技术工具在助力…

介绍一下atol(arr);(c基础)

hi , I am 36 适合对象c语言初学者 atol(arr)&#xff1b;是返回整数(long型)&#xff0c;整数是arr数组中字符中数字 格式 #include<stdio.h> atol(arr); 返回值arr数组中的数字 未改变arr数组 #include<stdio.h> //atol(arr); 返 <stdlib> int main…

数据结构C语言描述5(图文结合)--广义表讲解与实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…

鸿蒙学习使用本地真机运行应用/元服务 (开发篇)

文章目录 1、前提条件2、使用USB连接方式3、使用无线调试连接方式4、运行 1、前提条件 在Phone和Tablet中运行HarmonyOS应用/元服务的操作方法一致&#xff0c;可以采用USB连接方式或者无线调试的连接方式。两种连接方式是互斥的&#xff0c;只能使用一种&#xff0c;无法同时…