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授权码。…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...