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协议具有灵活性和可扩展性,可以满足不同的应用需求。
相关文章:
SIP协议及其简单介绍
SIP协议及其简单介绍概述流程SIP流程两台设备建立会话原理使用场景概述 SIP(Session Initiation Protocol,会话初始化协议)是一个应用层协议,用于在互联网上创建、修改和终止多媒体会话。SIP是一个客户端/服务器协议,…...
安全防御第四天:防病毒网关
一、恶意软件1.按照传播方式分类(1)病毒病毒是一种基于硬件和操作系统的程序,具有感染和破坏能力,这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地,它是病毒传播的目的地,又是下一次感染的出发点…...
Postman接口与压力测试实例
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。它提供功能强大的 Web API & HTTP 请求调试。 1、环境变量和全局变量设置 环境变量可以使用在以下地方: URLURL paramsHeader valuesform-data/url-encoded valuesRaw body contentHelper fi…...
TCP/IP socket
## TCP Socket 收发缓冲区: 每个socket在linux内核中都有一个发送缓冲区和一个接收缓冲区。 只要对端将数据发送过来,linux内核TCP/IP协议栈就会负责将数据缓存到socket对应的接收缓冲区中,无论是否调用recv。 recv()所做的工作,只是把内核缓…...
“工作三年,跳槽要求涨薪50%”,合理吗?
如果问在TI行业涨工资最快的方式是什么?回答最多的一定是:跳槽!前段时间,知乎上这样一条帖子引发了不少IT圈子的朋友的讨论 ,有网友提问 “程序员跳槽要求涨薪50%过分吗?”截图来源于知乎,如侵删…...
Vue学习计划九:了解Vue动画效果以及过渡动画和动态组件的使用方法
Vue.js 是一个流行的 JavaScript 框架,它提供了很多工具和功能,可以帮助开发人员创建动态、交互式的 Web 应用程序。其中之一就是动画效果,Vue.js 提供了一系列的 API 和指令,使得添加动画效果变得非常容易。 在 Vue.js 中&#…...
【Linux】进程理解与学习Ⅲ-环境变量
环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹相关文章推荐:【Linux】冯.诺依曼体系结构与操作系统【Linux】进程理解与学习Ⅰ-进程概念浅谈Linux下的shell--BASH【Linux】进程理解与学习…...
【三】一起算法---栈:STL stack、手写栈、单调栈
纸上得来终觉浅,绝知此事要躬行。大家好!我是霜淮子,欢迎订阅我的专栏《算法系列》。 学习经典算法和经典代码,建立算法思维;大量编码让代码成为我们大脑的一部分。 ⭐️已更系列 1、基础数据结构 1.1、链表➡传送门 1…...
电路设计的一些概念
锁存器的产生 论述1 (转)时序电路,生成触发器,触发器是有使能端的,使能端无效时数据不变,这是触发器的特性。 组合逻辑,由于数据要保持不变,只能通过锁存器来保存。 第一个代码,由于是时序逻…...
【Linux】Linux下权限的理解
前言:在之前我们已经对基本的指令进行了深入的学习,接下来我将带领大家学习的是关于权限的相关问题。在之前,我们一直是使用的【root】用户,即为“超级用户”,通过对权限的学习之后,我们就会慢慢的切换到普…...
Prometheus监控实战系列十七:探针监控
目前对于应用程序的监控主要有两种方式,一种被称为白盒监控,它通过获取目标的内部信息指标,来监控目标的状态情况,我们前面介绍的主机监控、容器监控都属于此类监控。另一种则是“黑盒监控”,它指在程序外部通过探针的…...
题目:JPA的懒加载失效是什么情况?
题目:JPA的懒加载失效是什么情况?Q1:什么是JPA的懒加载?Q2:JPA的懒加载会在什么情况下失效?Q3:如何避免JPA的懒加载失效?前言:在使用JPA进行数据库操作时,懒加…...
十六、消息推送
一、什么是消息推送? 消息推送通常是指网站的运营工作等人员,通过某种工具对用户当前网页或移动设备 APP 进行的主动消息推送。 消息推送一般又分为 Web 端消息推送和移动端消息推送。 消息推送无非是推(push)和拉(p…...
PMP项目管理-【第一章】引论
项目知识体系: 项目管理知识体系: 1.1 项目特性 独特性:独特性会带来不确定性(风险) 临时性:1> 任何项目都有起始终止时间 2> 项目具备临时性,项目成果可能是永久的 1.2 项目驱动变革 从商业角度来看,…...
前端布局小案例,分享3个漂亮的卡片组件
当今互联网发展迅猛,各种应用、网站和软件层出不穷,其中前端技术的发展更是让人瞩目。随着用户对于界面设计的要求越来越高,漂亮的卡片组件在各类网页设计中变得越来越流行。本文将分享三个精美的卡片组件,帮助您在前端开发中轻松…...
博客重载记录
博客重载记录流控算法实现open系统调用流程二分查找前言: 有时候看了一些比较好的文章,过几天就忘了,想想不如自己实现一遍博客代码或按博客结构自己写一遍,加深印象,但把别人的内容改个名字变成自己的博客,…...
open-cv绘制简单形状line() circle() rectangle() polylines() putText() cvtColor()
OpenCV彩色图像中一个像素是按照“B-G-R”模式组织的。 绘图函数的一些公众参数: img :图像对象 color: 颜色,如果彩色用一个三元组表示,三元组的元素按照B-G-R组织,三元组(0,255,0)中B为0,G为2…...
基于 PyTorch + LSTM 进行时间序列预测(附完整源码)
时间序列数据,顾名思义是一种随时间变化的数据类型。 例如,24小时内的温度、一个月内各种产品的价格、某家公司一年内的股票价格等。深度学习模型如长短期记忆网络(LSTM)能够捕捉时间序列数据中的模式,因此可以用于预…...
GEE页面介绍
目录一、背景二、用户界面三、数据类型:栅格1、请求图像集合2、学习查看栅格元数据3、矢量实例一:四、数据集五、数据属性1、空间分辨率2、时间分辨率六可视化多个波段1、真彩色(TCI)2彩色红外(CI)3、伪色 1 和 2 (FC1/FC2)七、可…...
python自动发送邮件,qq邮箱、网易邮箱自动发送和回复
在python中,我们可以用程序来实现向别人的邮箱自动发送一封邮件,甚至可以定时,如每天8点钟准时给某人发送一封邮件。今天,我们就来学习一下,如何向qq邮箱,网易邮箱等发送邮件。 一、获取邮箱的SMTP授权码。…...
九成企业担忧内部系统无法跟上高管薪酬管理需求
• 89%的高级人力资源(HR)、绩效奖励和薪酬负责人表示,企业内部技术无法跟上高管薪酬管理的需求 • 80%的受访者表示,过去三年中参与激励计划的人数有所增加 • 66%的受访者认为,依赖多家服务提供商是保持数据准确性和一致性的主要障碍 对于…...
ElevenLabs台湾话语音上线后用户留存率骤降47%?揭秘方言语料清洗盲区与3步合规性校验法
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs台湾话语音上线后用户留存率骤降47%?揭秘方言语料清洗盲区与3步合规性校验法 ElevenLabs于2024年Q2正式上线台湾话(闽南语)语音合成服务,初期D…...
在Node.js项目中集成Taotoken实现稳定的大模型调用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Node.js项目中集成Taotoken实现稳定的大模型调用 对于需要在产品中集成AI能力的中小型团队而言,开发过程常常伴随着一…...
FantiaDL终极指南:如何快速下载Fantia平台上的所有内容
FantiaDL终极指南:如何快速下载Fantia平台上的所有内容 【免费下载链接】fantiadl Download posts and media from Fantia 项目地址: https://gitcode.com/gh_mirrors/fa/fantiadl FantiaDL是一款专为Fantia用户设计的强大开源下载工具,能够帮助你…...
DeepSeek-Coder-V2:如何用开源代码智能模型解决企业级开发痛点?
DeepSeek-Coder-V2:如何用开源代码智能模型解决企业级开发痛点? 【免费下载链接】DeepSeek-Coder-V2 DeepSeek-Coder-V2: Breaking the Barrier of Closed-Source Models in Code Intelligence 项目地址: https://gitcode.com/GitHub_Trending/de/Deep…...
【ElevenLabs福建话语音落地实战】:20年语音AI专家亲授3大避坑指南与本地化部署全流程
更多请点击: https://codechina.net 第一章:ElevenLabs福建话语音落地的行业价值与技术定位 福建话(闽南语泉州/厦门腔)作为联合国教科文组织认定的“严重濒危语言”,其语音合成能力的工程化落地,已超越单…...
AI时代Geo优化:深度解析阶段、工作与实战SOP
引言在生成式人工智能(Generative AI)浪潮的推动下,数字内容生态正经历一场深刻的变革。传统的搜索引擎优化(SEO)已然演进为生成式引擎优化(Generative Engine Optimization, 简称GEO)ÿ…...
维智物联定位SDK Flutter 插件
开发指南 维智定位SDK Flutter 插件:在 Android / iOS / HarmonyOS 上调用原生 Wayz 定位SDK 完成持续定位、正/逆地理编码、场所搜索等功能。 SDK与Flutter插件:Flutter插件源码不附带 Android/ iOS / HarmonyOS SDK,需由开发者自行导入SDK…...
Fere AI 新手快速上手指南
在快速迭代的开发节奏中,我们常常面临这样的困境:想要为应用集成智能对话能力,却被复杂的模型部署、高昂的算力成本或是晦涩的 API 文档劝退。很多时候,开发者需要的不是一个庞大的底层框架,而是一个能够即插即用、稳定可靠且易于集成的智能服务接口。无论是构建客服机器人…...
论文被吐槽逻辑乱?,有哪些真正值得入手的的AI智能降重工具推荐?
毕业论文降AIGC率,优先选语义重构 学术优化 去AI痕迹的工具,免费与付费结合更高效。下面按中文、英文、免费/付费分类推荐,附实测效果与适用场景。 一、中文论文降重工具(最常用) 1. 千笔AI(综合全能首选…...
