当前位置: 首页 > news >正文

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&#xff08;Session Initiation Protocol&#xff0c;会话初始化协议&#xff09;是一个应用层协议&#xff0c;用于在互联网上创建、修改和终止多媒体会话。SIP是一个客户端/服务器协议&#xff0c;…...

安全防御第四天:防病毒网关

一、恶意软件1.按照传播方式分类&#xff08;1&#xff09;病毒病毒是一种基于硬件和操作系统的程序&#xff0c;具有感染和破坏能力&#xff0c;这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地&#xff0c;它是病毒传播的目的地&#xff0c;又是下一次感染的出发点…...

Postman接口与压力测试实例

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。它提供功能强大的 Web API & HTTP 请求调试。 1、环境变量和全局变量设置 环境变量可以使用在以下地方&#xff1a; URLURL paramsHeader valuesform-data/url-encoded valuesRaw body contentHelper fi…...

TCP/IP socket

## TCP Socket 收发缓冲区: 每个socket在linux内核中都有一个发送缓冲区和一个接收缓冲区。 只要对端将数据发送过来&#xff0c;linux内核TCP/IP协议栈就会负责将数据缓存到socket对应的接收缓冲区中&#xff0c;无论是否调用recv。 recv()所做的工作&#xff0c;只是把内核缓…...

“工作三年,跳槽要求涨薪50%”,合理吗?

如果问在TI行业涨工资最快的方式是什么&#xff1f;回答最多的一定是&#xff1a;跳槽&#xff01;前段时间&#xff0c;知乎上这样一条帖子引发了不少IT圈子的朋友的讨论 &#xff0c;有网友提问 “程序员跳槽要求涨薪50%过分吗&#xff1f;”截图来源于知乎&#xff0c;如侵删…...

Vue学习计划九:了解Vue动画效果以及过渡动画和动态组件的使用方法

Vue.js 是一个流行的 JavaScript 框架&#xff0c;它提供了很多工具和功能&#xff0c;可以帮助开发人员创建动态、交互式的 Web 应用程序。其中之一就是动画效果&#xff0c;Vue.js 提供了一系列的 API 和指令&#xff0c;使得添加动画效果变得非常容易。 在 Vue.js 中&#…...

【Linux】进程理解与学习Ⅲ-环境变量

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;相关文章推荐&#xff1a;【Linux】冯.诺依曼体系结构与操作系统【Linux】进程理解与学习Ⅰ-进程概念浅谈Linux下的shell--BASH【Linux】进程理解与学习…...

【三】一起算法---栈:STL stack、手写栈、单调栈

纸上得来终觉浅&#xff0c;绝知此事要躬行。大家好&#xff01;我是霜淮子&#xff0c;欢迎订阅我的专栏《算法系列》。 学习经典算法和经典代码&#xff0c;建立算法思维&#xff1b;大量编码让代码成为我们大脑的一部分。 ⭐️已更系列 1、基础数据结构 1.1、链表➡传送门 1…...

电路设计的一些概念

锁存器的产生 论述1 (转)时序电路&#xff0c;生成触发器&#xff0c;触发器是有使能端的&#xff0c;使能端无效时数据不变&#xff0c;这是触发器的特性。 组合逻辑&#xff0c;由于数据要保持不变&#xff0c;只能通过锁存器来保存。 第一个代码&#xff0c;由于是时序逻…...

【Linux】Linux下权限的理解

前言&#xff1a;在之前我们已经对基本的指令进行了深入的学习&#xff0c;接下来我将带领大家学习的是关于权限的相关问题。在之前&#xff0c;我们一直是使用的【root】用户&#xff0c;即为“超级用户”&#xff0c;通过对权限的学习之后&#xff0c;我们就会慢慢的切换到普…...

Prometheus监控实战系列十七:探针监控

目前对于应用程序的监控主要有两种方式&#xff0c;一种被称为白盒监控&#xff0c;它通过获取目标的内部信息指标&#xff0c;来监控目标的状态情况&#xff0c;我们前面介绍的主机监控、容器监控都属于此类监控。另一种则是“黑盒监控”&#xff0c;它指在程序外部通过探针的…...

题目:JPA的懒加载失效是什么情况?

题目&#xff1a;JPA的懒加载失效是什么情况&#xff1f;Q1&#xff1a;什么是JPA的懒加载&#xff1f;Q2&#xff1a;JPA的懒加载会在什么情况下失效&#xff1f;Q3&#xff1a;如何避免JPA的懒加载失效&#xff1f;前言&#xff1a;在使用JPA进行数据库操作时&#xff0c;懒加…...

十六、消息推送

一、什么是消息推送&#xff1f; 消息推送通常是指网站的运营工作等人员&#xff0c;通过某种工具对用户当前网页或移动设备 APP 进行的主动消息推送。 消息推送一般又分为 Web 端消息推送和移动端消息推送。 消息推送无非是推&#xff08;push&#xff09;和拉&#xff08;p…...

PMP项目管理-【第一章】引论

项目知识体系&#xff1a; 项目管理知识体系&#xff1a; 1.1 项目特性 独特性&#xff1a;独特性会带来不确定性(风险) 临时性&#xff1a;1> 任何项目都有起始终止时间 2> 项目具备临时性&#xff0c;项目成果可能是永久的 1.2 项目驱动变革 从商业角度来看&#xff0c…...

前端布局小案例,分享3个漂亮的卡片组件

当今互联网发展迅猛&#xff0c;各种应用、网站和软件层出不穷&#xff0c;其中前端技术的发展更是让人瞩目。随着用户对于界面设计的要求越来越高&#xff0c;漂亮的卡片组件在各类网页设计中变得越来越流行。本文将分享三个精美的卡片组件&#xff0c;帮助您在前端开发中轻松…...

博客重载记录

博客重载记录流控算法实现open系统调用流程二分查找前言&#xff1a; 有时候看了一些比较好的文章&#xff0c;过几天就忘了&#xff0c;想想不如自己实现一遍博客代码或按博客结构自己写一遍&#xff0c;加深印象&#xff0c;但把别人的内容改个名字变成自己的博客&#xff0c…...

open-cv绘制简单形状line() circle() rectangle() polylines() putText() cvtColor()

OpenCV彩色图像中一个像素是按照“B-G-R”模式组织的。 绘图函数的一些公众参数&#xff1a; img &#xff1a;图像对象 color&#xff1a; 颜色&#xff0c;如果彩色用一个三元组表示&#xff0c;三元组的元素按照B-G-R组织&#xff0c;三元组(0,255,0)中B为0&#xff0c;G为2…...

基于 PyTorch + LSTM 进行时间序列预测(附完整源码)

时间序列数据&#xff0c;顾名思义是一种随时间变化的数据类型。 例如&#xff0c;24小时内的温度、一个月内各种产品的价格、某家公司一年内的股票价格等。深度学习模型如长短期记忆网络&#xff08;LSTM&#xff09;能够捕捉时间序列数据中的模式&#xff0c;因此可以用于预…...

GEE页面介绍

目录一、背景二、用户界面三、数据类型&#xff1a;栅格1、请求图像集合2、学习查看栅格元数据3、矢量实例一&#xff1a;四、数据集五、数据属性1、空间分辨率2、时间分辨率六可视化多个波段1、真彩色(TCI)2彩色红外&#xff08;CI&#xff09;3、伪色 1 和 2 (FC1/FC2)七、可…...

python自动发送邮件,qq邮箱、网易邮箱自动发送和回复

在python中&#xff0c;我们可以用程序来实现向别人的邮箱自动发送一封邮件&#xff0c;甚至可以定时&#xff0c;如每天8点钟准时给某人发送一封邮件。今天&#xff0c;我们就来学习一下&#xff0c;如何向qq邮箱&#xff0c;网易邮箱等发送邮件。 一、获取邮箱的SMTP授权码。…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...