SIP协议及其简单介绍
SIP协议及其简单介绍
- 概述
- 流程
- SIP流程
- 两台设备建立会话
- 原理
- 使用场景
概述
SIP(Session Initiation Protocol,会话初始化协议)是一个应用层协议,用于在互联网上创建、修改和终止多媒体会话。SIP是一个客户端/服务器协议,允许在不同终端设备之间建立实时通信,包括语音、视频、消息等。SIP也可以用于呼叫控制和呼叫管理。
流程
SIP流程
SIP协议的流程如下:
-
SIP客户端向SIP服务器发送请求,请求建立会话,SIP请求可以是INVITE、REGISTER、ACK、BYE、CANCEL等。
-
SIP服务器接收到请求,进行鉴权验证,判断请求是否合法。
-
如果请求合法,则SIP服务器向客户端发送回复,回复可以是1xx、2xx、3xx、4xx、5xx、6xx等。
-
SIP客户端接收到回复,根据回复内容判断请求是否成功,如果成功则继续会话,如果失败则终止会话。
在会话过程中,SIP客户端和服务器之间可以交换多个请求和回复,直到会话结束。
两台设备建立会话
下面是两台设备进行 SIP 通话的详细流程,包括涉及 SIP 服务器的部分:
-
设备 A 向 SIP 服务器发送 INVITE 消息:设备 A 通过 SIP 协议向 SIP 服务器发送 INVITE 消息,该消息包含了设备 A 的 SIP 地址和设备 A 希望建立会话的相关信息,例如媒体类型、编码和传输协议等。
-
SIP 服务器向设备 B 发送 INVITE 消息:SIP 服务器收到设备 A 的 INVITE 消息后,会向设备 B 发送 INVITE 消息,该消息包含了设备 A 的 SIP 地址以及设备 B 的 SIP 地址和相关信息。
-
设备 B 回复 100 Trying 消息:设备 B 收到 INVITE 消息后,向 SIP 服务器发送 100 Trying 消息作为回复,表示设备 B 已经接收到 INVITE 消息并正在处理中。
-
SIP 服务器将 100 Trying 消息转发给设备 A:SIP 服务器将设备 B 发送的 100 Trying 消息转发给设备 A,让设备 A 知道设备 B 已经接收到 INVITE 消息并正在处理中。
-
设备 B 向 SIP 服务器发送回复消息:设备 B 分析 INVITE 消息中包含的信息,并向 SIP 服务器发送回复消息,例如 180 Ringing 或 200 OK 等。
-
SIP 服务器将回复消息转发给设备 A:SIP 服务器将设备 B 发送的回复消息转发给设备 A,让设备 A 知道设备 B 的回复。
-
设备 A 收到回复消息后,发送 ACK 消息:设备 A 收到设备 B 的回复消息后,如果该回复消息是 200 OK,则设备 A 将向 SIP 服务器发送 ACK 消息作为回复。如果回复消息是 180 Ringing,则设备 A 将等待设备 B 向其发送进一步的消息。
-
建立媒体通道:设备 A 和设备 B 成功建立会话后,将启动媒体通道来进行实时音视频传输。
-
会话结束:当通话结束时,设备 A 或设备 B 将向 SIP 服务器发送 BYE 消息来终止会话。SIP 服务器将将 BYE 消息转发给另一个设备,并回复 200 OK 消息作为回应,然后关闭媒体通道。
总的来说,SIP 通话涉及到 SIP 服务器来协调会话的建立和终止。设备 A 向 SIP 服务器发送 INVITE 消息来启动会话,SIP 服务器将 INVITE 消息转发给设备 B,设备 B 向 SIP 服务器发送回复消息,SIP 服务器将回复消息
原理
SIP协议的原理介绍如下:
SIP协议的工作原理类似于HTTP协议,SIP协议也采用了客户端/服务器模式。SIP协议定义了一系列请求和回复消息,这些消息由SIP客户端和SIP服务器之间交换,用于建立、修改和终止多媒体会话。
SIP协议中定义了多种消息头,用于传递会话相关信息,例如会话描述、呼叫控制、媒体类型等。SIP协议中也支持会话的路由和重定向,可以通过多个SIP服务器将请求路由到目标终端设备。
SIP协议中还定义了一些状态码,用于指示请求或回复的状态。例如,1xx状态码表示请求已收到但还未完成,2xx状态码表示请求已成功完成,3xx状态码表示需要进一步处理请求,4xx状态码表示请求无效,5xx状态码表示服务器内部错误,6xx状态码表示目标设备无法接受请求。
以下是一个基本的C++代码实例,用于创建和处理SIP通话。请注意,这只是一个示例代码,您需要根据您的具体情况进行修改和适应。
#include <iostream>
#include <pjsua2.hpp>using namespace pj;// 用于处理SIP通话的类
class MyCall : public Call
{
public:// 当通话状态发生变化时被调用virtual void onCallState(OnCallStateParam &prm){CallInfo ci = getInfo();// 如果通话被接通if (ci.state == PJSIP_INV_STATE_CONFIRMED) {std::cout << "Call connected" << std::endl;}}// 当接收到音频数据包时被调用virtual void onAudioMediaState(OnAudioMediaStateParam &prm){AudioMedia *aud_med = NULL;// 找到音频媒体for (unsigned i = 0; i < prm.medias.size(); i++) {if (prm.medias[i].type == PJMEDIA_TYPE_AUDIO) {aud_med = dynamic_cast<AudioMedia *>(prm.medias[i].media.get());break;}}// 如果找到音频媒体if (aud_med) {// 激活音频媒体AudioMedia::startTransmit(*aud_med, "/dev/null");}}
};// 用于处理SIP账户的类
class MyAccount : public Account
{
public:// 当新来电时被调用virtual void onIncomingCall(OnIncomingCallParam &prm){MyCall *call = new MyCall(*this, prm.callId);CallOpParam prm;prm.statusCode = PJSIP_SC_OK;call->answer(prm);}
};int main(int argc, char *argv[])
{// 初始化PJSUA2库Endpoint ep;ep.libCreate();// 配置PJSUA2库EpConfig ep_cfg;ep.libInit(ep_cfg);// 创建UDP传输对象TransportConfig tcfg;tcfg.port = 5060;ep.transportCreate(PJSIP_TRANSPORT_UDP, tcfg);// 启动PJSUA2库ep.libStart();// 创建SIP账户MyAccount acc;AccConfig acc_cfg;acc_cfg.idUri = "sip:username@domain.com";acc_cfg.regConfig.registrarUri = "sip:domain.com";acc_cfg.sipConfig.proxies.push_back("sip:proxy.domain.com");acc.create(acc_cfg);// 等待程序退出std::cout << "Press ENTER to quit..." << std::endl;std::cin.get();// 销毁PJSUA2库ep.libDestroy();return 0;
}
在此示例中,MyCall 类用于处理SIP通话,MyAccount 类用于处理SIP账户。main 函数初始化PJSUA2库,并创建一个UDP传输对象。然后,它创建一个SIP账户,并等待程序退出。当SIP账户收到新的呼入通话时,MyAccount 类会创建一个新的 MyCall 对象来处理
通话。 MyCall 类处理通话状态变化事件和音频数据包,当通话接通时打印一条消息,当收到音频数据包时将其传输到 /dev/null。
请注意,这只是一个简单的示例代码,实际的SIP通话实现需要更多的细节和处理来确保正确的通信。
使用场景
SIP协议的使用场景如下:
实时通信:SIP协议可以用于实现实时通信,包括语音、视频、消息等。例如,可以使用SIP协议在不同终端设备之间建立语音通话或视频会议。
呼叫控制:SIP协议可以用于呼叫控制和呼叫管理。例如,可以使用SIP协议将呼叫路由到目标终端设备,或者使用SIP协议终止呼叫。
电话系统:SIP协议可以用于构建电话系统。例如,可以使用SIP协议将电话呼入路由到IP电话或传统电话网,也可以使用SIP协议实现语音信箱和呼叫转移等电话功能。
联网设备:SIP协议可以用于联网设备之间的通信。例如,可以使用SIP协议在IoT设备之间传递命令和数据。
总之,SIP协议是一个非常重要的应用层协议,被广泛用于实时通信和呼叫控制。SIP协议具有灵活性和可扩展性,可以满足不同的应用需求。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
SIP协议及其简单介绍
SIP协议及其简单介绍概述流程SIP流程两台设备建立会话原理使用场景概述 SIP(Session Initiation Protocol,会话初始化协议)是一个应用层协议,用于在互联网上创建、修改和终止多媒体会话。SIP是一个客户端/服务器协议,…...
![](https://img-blog.csdnimg.cn/img_convert/24fc9a2d3328a472b3e32ec4408e75e8.png)
安全防御第四天:防病毒网关
一、恶意软件1.按照传播方式分类(1)病毒病毒是一种基于硬件和操作系统的程序,具有感染和破坏能力,这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地,它是病毒传播的目的地,又是下一次感染的出发点…...
![](https://img-blog.csdnimg.cn/img_convert/b10572865d80068afc57faffed987b12.png)
Postman接口与压力测试实例
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。它提供功能强大的 Web API & HTTP 请求调试。 1、环境变量和全局变量设置 环境变量可以使用在以下地方: URLURL paramsHeader valuesform-data/url-encoded valuesRaw body contentHelper fi…...
![](https://www.ngui.cc/images/no-images.jpg)
TCP/IP socket
## TCP Socket 收发缓冲区: 每个socket在linux内核中都有一个发送缓冲区和一个接收缓冲区。 只要对端将数据发送过来,linux内核TCP/IP协议栈就会负责将数据缓存到socket对应的接收缓冲区中,无论是否调用recv。 recv()所做的工作,只是把内核缓…...
![](https://img-blog.csdnimg.cn/img_convert/8cae93d84c877e2fdd96a102d02c4bbd.png)
“工作三年,跳槽要求涨薪50%”,合理吗?
如果问在TI行业涨工资最快的方式是什么?回答最多的一定是:跳槽!前段时间,知乎上这样一条帖子引发了不少IT圈子的朋友的讨论 ,有网友提问 “程序员跳槽要求涨薪50%过分吗?”截图来源于知乎,如侵删…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue学习计划九:了解Vue动画效果以及过渡动画和动态组件的使用方法
Vue.js 是一个流行的 JavaScript 框架,它提供了很多工具和功能,可以帮助开发人员创建动态、交互式的 Web 应用程序。其中之一就是动画效果,Vue.js 提供了一系列的 API 和指令,使得添加动画效果变得非常容易。 在 Vue.js 中&#…...
![](https://img-blog.csdnimg.cn/img_convert/d36bb1d155d440a4b5b461108e4087ae.png)
【Linux】进程理解与学习Ⅲ-环境变量
环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹相关文章推荐:【Linux】冯.诺依曼体系结构与操作系统【Linux】进程理解与学习Ⅰ-进程概念浅谈Linux下的shell--BASH【Linux】进程理解与学习…...
![](https://img-blog.csdnimg.cn/e50ee4e5b0a5455194b0431165d409f5.png)
【三】一起算法---栈:STL stack、手写栈、单调栈
纸上得来终觉浅,绝知此事要躬行。大家好!我是霜淮子,欢迎订阅我的专栏《算法系列》。 学习经典算法和经典代码,建立算法思维;大量编码让代码成为我们大脑的一部分。 ⭐️已更系列 1、基础数据结构 1.1、链表➡传送门 1…...
![](https://img-blog.csdnimg.cn/1794c0004d274ed893e2c76f5658e912.png)
电路设计的一些概念
锁存器的产生 论述1 (转)时序电路,生成触发器,触发器是有使能端的,使能端无效时数据不变,这是触发器的特性。 组合逻辑,由于数据要保持不变,只能通过锁存器来保存。 第一个代码,由于是时序逻…...
![](https://img-blog.csdnimg.cn/69772a93ecd44095ae11aa2560af5847.png)
【Linux】Linux下权限的理解
前言:在之前我们已经对基本的指令进行了深入的学习,接下来我将带领大家学习的是关于权限的相关问题。在之前,我们一直是使用的【root】用户,即为“超级用户”,通过对权限的学习之后,我们就会慢慢的切换到普…...
![](https://img-blog.csdnimg.cn/0cb885c99cc0484499fbef97274ba639.png)
Prometheus监控实战系列十七:探针监控
目前对于应用程序的监控主要有两种方式,一种被称为白盒监控,它通过获取目标的内部信息指标,来监控目标的状态情况,我们前面介绍的主机监控、容器监控都属于此类监控。另一种则是“黑盒监控”,它指在程序外部通过探针的…...
![](https://www.ngui.cc/images/no-images.jpg)
题目:JPA的懒加载失效是什么情况?
题目:JPA的懒加载失效是什么情况?Q1:什么是JPA的懒加载?Q2:JPA的懒加载会在什么情况下失效?Q3:如何避免JPA的懒加载失效?前言:在使用JPA进行数据库操作时,懒加…...
![](https://www.ngui.cc/images/no-images.jpg)
十六、消息推送
一、什么是消息推送? 消息推送通常是指网站的运营工作等人员,通过某种工具对用户当前网页或移动设备 APP 进行的主动消息推送。 消息推送一般又分为 Web 端消息推送和移动端消息推送。 消息推送无非是推(push)和拉(p…...
![](https://img-blog.csdnimg.cn/e809d66e37804565a07884ecf7dfe8e3.png)
PMP项目管理-【第一章】引论
项目知识体系: 项目管理知识体系: 1.1 项目特性 独特性:独特性会带来不确定性(风险) 临时性:1> 任何项目都有起始终止时间 2> 项目具备临时性,项目成果可能是永久的 1.2 项目驱动变革 从商业角度来看,…...
![](https://img-blog.csdnimg.cn/img_convert/25e28f6437ac1fa21a0688e8ba4723e9.png)
前端布局小案例,分享3个漂亮的卡片组件
当今互联网发展迅猛,各种应用、网站和软件层出不穷,其中前端技术的发展更是让人瞩目。随着用户对于界面设计的要求越来越高,漂亮的卡片组件在各类网页设计中变得越来越流行。本文将分享三个精美的卡片组件,帮助您在前端开发中轻松…...
![](https://www.ngui.cc/images/no-images.jpg)
博客重载记录
博客重载记录流控算法实现open系统调用流程二分查找前言: 有时候看了一些比较好的文章,过几天就忘了,想想不如自己实现一遍博客代码或按博客结构自己写一遍,加深印象,但把别人的内容改个名字变成自己的博客,…...
![](https://www.ngui.cc/images/no-images.jpg)
open-cv绘制简单形状line() circle() rectangle() polylines() putText() cvtColor()
OpenCV彩色图像中一个像素是按照“B-G-R”模式组织的。 绘图函数的一些公众参数: img :图像对象 color: 颜色,如果彩色用一个三元组表示,三元组的元素按照B-G-R组织,三元组(0,255,0)中B为0,G为2…...
![](https://img-blog.csdnimg.cn/img_convert/8a3bbd481dacdee414cca90705653ef7.png)
基于 PyTorch + LSTM 进行时间序列预测(附完整源码)
时间序列数据,顾名思义是一种随时间变化的数据类型。 例如,24小时内的温度、一个月内各种产品的价格、某家公司一年内的股票价格等。深度学习模型如长短期记忆网络(LSTM)能够捕捉时间序列数据中的模式,因此可以用于预…...
![](https://img-blog.csdnimg.cn/92399f62f46648d3b37e805ff4748609.png)
GEE页面介绍
目录一、背景二、用户界面三、数据类型:栅格1、请求图像集合2、学习查看栅格元数据3、矢量实例一:四、数据集五、数据属性1、空间分辨率2、时间分辨率六可视化多个波段1、真彩色(TCI)2彩色红外(CI)3、伪色 1 和 2 (FC1/FC2)七、可…...
![](https://img-blog.csdnimg.cn/5c4f113ad6614adca9028d5fd5bd36e1.png)
python自动发送邮件,qq邮箱、网易邮箱自动发送和回复
在python中,我们可以用程序来实现向别人的邮箱自动发送一封邮件,甚至可以定时,如每天8点钟准时给某人发送一封邮件。今天,我们就来学习一下,如何向qq邮箱,网易邮箱等发送邮件。 一、获取邮箱的SMTP授权码。…...
![](https://www.ngui.cc/images/no-images.jpg)
hastcat
hashcat 下载地址: https://hashcat.net/hashcat/ 案例 Usage: hashcat [options]... hash|hashfile|hccapxfile [dictionary|mask|directory]...https://xz.aliyun.com/t/4008破解linux shadow /etc/shadow中密码格式: $id$salt$encrypted如:$1$2eWq10AC$NaQqalCk3 1表…...
![](https://www.ngui.cc/images/no-images.jpg)
242. 一个简单的整数问题
Powered by:NEFU AB-IN Link 文章目录242. 一个简单的整数问题题意思路代码242. 一个简单的整数问题 题意 给定长度为 N的数列 A,然后输入 M行操作指令。 第一类指令形如 C l r d,表示把数列中第 l∼r个数都加 d 第二类指令形如 Q x,表示询问…...
![](https://img-blog.csdnimg.cn/2d76d520787742e4ba74da97e2797ad7.png)
docker安装Redis高可用(一主二从三哨兵)
本次教程使用docker swarm安装 准备三台机器 hostIP用途node1192.168.31.130redis-master01,redis哨兵节点01node2192.168.31.131redis-slave01, redis哨兵节点02node3192.168.31.132redis-slave02 redis哨兵节点02 注意事项: 1:需要保证三…...
![](https://img-blog.csdnimg.cn/b324d296d0e74e8b9ef30da8bc8f718a.png)
安全防御之入侵检测篇
目录 1.什么是IDS? 2.IDS和防火墙有什么不同?3.IDS的工作原理? 4.IDS的主要检测方法有哪些?请详细说明 5.IDS的部署方式有哪些? 6.IDS的签名是什么意思?签名过滤器有什么用?例外签名的配置作…...
![](https://img-blog.csdnimg.cn/7ba687bb4dd34e2286598c8a3ea5f61e.png#pic_center)
学习系统编程No.10【文件描述符】
引言: 北京时间:2023/3/25,昨天摆烂一天,今天再次坐牢7小时,难受尽在不言中,并且对于笔试题,还是非常的困难,可能是我做题不够多,也可能是没有好好的总结之前做过的一些…...
![](https://img-blog.csdnimg.cn/005288efcb1841968cb104013f465d07.png)
网络基础认识
目录 一、计算机网络背景 1.1 网络发展 1.2 "协议"由来 二、网络协议初识 2.1 协议分层 2.2 OSI七层模型 2.3 TCP/IP五层模型 三、网络协议栈 四、数据包封装与分用 五、网络传输基本流程 5.1 同局域网的两台主机通信 5.2 跨网络的两台主机通信 六、网络…...
![](https://img-blog.csdnimg.cn/21a541a2e9174cf5b3243d51d7626f41.png)
【蓝桥杯_练习】
蓝桥杯1.创建工程2.LED灯点亮led.c3.LCD液晶屏显示lcd.c4.定时器按键单机interrupt.hinterrupt.cman.c5.定时器(长按键)interrupt.hinterrupt.cmain.c6.PWMmain.c7.定时器-输入捕获(频率,占空比测量)interrupt.cmain.c…...
![](https://img-blog.csdnimg.cn/2e84d0b97a134ea2bb3549af2a9c48b3.png)
【C语言蓝桥杯每日一题】——跑步锻炼
【C语言蓝桥杯每日一题】—— 跑步锻炼😎前言🙌排序🙌总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者简介…...
![](https://img-blog.csdnimg.cn/fe22b6e5ffdf4d64b822c248588ffc58.png)
Qt之实现类似软件安装时的新功能介绍界面
一.效果 在软件安装时,一般会轮播软件的新功能,安装后,如果还想查看这些新功能该怎么办呢,我们可以把这个介绍新新功能的小应用集成到软件的“帮助”菜单中,比起纯黑文字的无趣介绍,图文方式的呈现会生动得多。 最近在看《赘婿》,借几张图过来用用。 二.原理 1.分层结…...
![](https://www.ngui.cc/images/no-images.jpg)
echarts地图不同地区设置不同的颜色
var myChart ec.init(document.getElementById(main));let option {tooltip: {trigger: item,},dataRange: {//左下角的颜色块。start:值域开始值;end:值域结束值;label:图例名称;color:自定义…...
![](/images/no-images.jpg)
白银网站建设白银/线下营销方式主要有哪些
当FCoE应用于存储网络时,它的采用速度并没有想象中那么快。但是,用户最终克服了当时的障碍,使得FCoE被广泛采用。 是否该考虑在存储网络中使用以太网光纤通道(FCoE)? James Damoulakis:几年前,当FCoE应用于存储网络时…...
![](/images/no-images.jpg)
南京网站建设包括哪些/seo有哪些经典的案例
RawImage与Image组件有些类似的地方, 但是它的用处比较特别但是在该特别的地方由特别有用: 在UI上面显示三维模型或三维成像在UI上面显示某类切图动画 在UI上面显示某类切图动画 赋值的Sprite的类型是default的类型 即图片导入unity后的默认类型 RawI…...
![](https://s1.51cto.com/attachment/201204/173533103.jpg)
阳澄湖大闸蟹网站建设/百度产品大全
一个经理上来电,说他打开网页浏览的时候出现需要安装Adobe Flash layer 才能查看,由于没有管理员权限,我远程在服务器上下载了一个Adobe Flash layer 11 最新版为他安装,但是安装一会就报错,提示简本出错。于是我按确定…...
![](https://images2015.cnblogs.com/blog/822713/201510/822713-20151015151659444-1943127463.png)
字体网站/云南省最新疫情情况
经过查阅资料和自己的理解整理出来的,欢迎大家指教。Awake和Start对比awake比start先执行。当有多个类的时候,所有类的awake执行完了才会执行start。awake里面一般放初始化的属性值,获取组件等。start里面可以处理一些只执行一次的功能。比如…...
![](https://img-my.csdn.net/uploads/201209/13/1347549627_7818.png)
17网站一起做网店普宁/上海网站seo快速排名
前段时间用C#写了一个骑士飞行棋的练习,现在想起了把他贴出来,用来练习基础知识非常好,如果需要完整的项目源码可以到这来去下载:完整项目代码下载 先来看看游戏规则: 图例说明: 幸运轮盘&#…...
![](/images/no-images.jpg)
wordpress 关键词/个人自己免费建网站
摘要 js字符串转日期,js日期转字符串。 更新日志 2018/08/21 在字符串转日期中,修改“日”的默认值为1.可以识别单数字的“日”,”月“。比如 1-9-2018可以直接这样转换NayiUtil.to_date("1-9-2015", "dd-mm-yyyy") …...