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

SIP 会议信令

SIP(Session Initiation Protocol)是一个应用层协议,用于在IP网络中创建、修改和终止多媒体通信会话,比如语音、视频通话、即时消息等。SIP 协议特别适合实现多方参与的会议(会议呼叫)功能。下面我们将详细讲解 SIP 会议信令及其工作原理。

SIP 会议信令的基本原理

SIP 是一种文本协议,类似于 HTTP,用于管理和控制会话的建立、管理以及终止。SIP 通过请求和响应的交互方式来完成这些任务。

在 SIP 会议中,涉及多个用户或设备进行通话,会议通常由一个会议服务器(Conference Server)或多点控制单元(MCU)来协调。SIP 会议信令流程分为邀请用户加入会议管理会议终止会议等几个阶段。

核心概念:
  1. User Agent (UA): SIP 用户代理,通常是 SIP 客户端(如电话、软终端等),负责发起或接收 SIP 请求和响应。
  2. Proxy Server: 代理服务器,用于中转和路由 SIP 信令。
  3. Registrar Server: 注册服务器,负责维护 UA 的注册信息。
  4. Conference Focus: 会议的核心节点,负责处理所有 SIP 会议相关的信令和媒体流,通常由 MCU 扮演。
  5. Dialog: SIP 中的一次会话,表示两个终端之间的交互。

常见的 SIP 信令方法

SIP 使用了多个信令方法来完成会话的不同阶段。以下是 SIP 会议信令中的主要方法及其作用:

  1. INVITE

    • 用途: 用于邀请用户加入一个会话或会议。会议信令流程通常从 INVITE 开始。
    • 原理: SIP UA 向会议服务器或其他用户代理发送 INVITE 请求,包含会话的初始信息,如 SDP(Session Description Protocol)数据,描述会议的媒体格式、编码方式等。
    • 示例:
      INVITE sip:bob@conference.example.com SIP/2.0
      Via: SIP/2.0/UDP 192.0.2.1
      From: <sip:alice@example.com>;tag=1928301774
      To: <sip:bob@conference.example.com>
      Call-ID: a84b4c76e66710
      CSeq: 314159 INVITE
      Content-Type: application/sdp
      
  2. ACK

    • 用途: 用于确认对 INVITE 的成功响应。
    • 原理: 当 INVITE 请求得到 200 OK 响应后,UA 发送 ACK 确认,表示会话已建立。ACK 确保双方都同意会话的设置。
  3. BYE

    • 用途: 用于终止会话或离开会议。
    • 原理: 当用户希望挂断或离开会议时,发送 BYE 请求,会议服务器或对方收到后,会终止媒体流并释放资源。
  4. OPTIONS

    • 用途: 查询对方的能力(如支持的媒体类型)。
    • 原理: 在会议中,可以使用 OPTIONS 请求来检查对方的能力而不发起实际的会话。
  5. CANCEL

    • 用途: 取消正在进行的 INVITE 请求。
    • 原理: 如果在会议中某个用户邀请了另一方但希望在对方接听之前取消邀请,可以发送 CANCEL 请求。
  6. REGISTER

    • 用途: 注册用户的位置或设备信息。
    • 原理: 用户代理通过 REGISTER 请求向 Registrar 服务器注册它的位置信息,以便其他用户可以找到该用户。
  7. PRACK (Provisional Acknowledgment)

    • 用途: 用于确认临时响应(如 1xx 消息),增强了 INVITE 请求的可靠性。
    • 原理: 在 SIP 会议中,PRACK 用于确保临时消息得到确认,尤其是在较复杂的多方会议环境下。
  8. REFER

    • 用途: 转接呼叫,或者邀请第三方进入现有的会话。
    • 原理: REFER 通常用于 SIP 会议中邀请新用户加入或将会议转移到其他终端。
    • 示例:
      REFER sip:bob@conference.example.com SIP/2.0
      Refer-To: sip:charlie@conference.example.com
      
  9. NOTIFY

    • 用途: 通知状态的改变。
    • 原理: 通常与 SUBSCRIBE 配合使用,NOTIFY 用于向会议中的其他成员通报状态改变(例如用户离开、加入或媒体状态的改变)。
  10. SUBSCRIBE

    • 用途: 订阅会议状态的更新。
    • 原理: 在会议中,某些 UA 可以通过 SUBSCRIBE 请求订阅会议相关的事件,如谁正在讲话,谁加入或离开会议等。

SIP 会议中的 SDP(Session Description Protocol)

SIP 通常与 SDP 结合使用来描述会话中的媒体信息。SDP 包含会议中的音频、视频流的具体编码格式、传输地址和端口等信息。

SDP 示例:

v=0
o=alice 2890844526 2890844526 IN IP4 192.0.2.1
s=Conference Call
c=IN IP4 192.0.2.1
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
m=video 51372 RTP/AVP 31
a=rtpmap:31 H261/90000
SDP 的几个重要字段:
  • v=: SDP 版本。
  • o=: 会话创建者的身份信息。
  • s=: 会话名称(这里是“Conference Call”)。
  • c=: 媒体流的连接信息,包括IP地址和传输类型。
  • m=: 媒体类型和传输端口(如音频和视频的 RTP 端口)。
  • a=: 媒体属性,如媒体编码格式(PCMU 和 H261)。

SIP 会议的工作流程

  1. 会议创建: 一个 UA 通过向会议服务器发送 INVITE 请求,邀请其他用户加入。服务器响应 INVITE,并发送 200 OK 消息,确认会话的建立。
  2. 用户加入会议: 每个新的 UA 可以通过发送 INVITE 请求加入会议。会议服务器会协调和转发 INVITE 到其他参与者。
  3. 媒体协商: SIP 使用 SDP 协商会议中的音频、视频编码格式和网络传输参数。
  4. 会议管理: SIP 使用 REFER 和 NOTIFY 来管理会议中的用户邀请、状态更新和媒体改变。
  5. 会议终止: 当会议结束时,会议服务器或参与方发送 BYE 请求终止会话。

SIP 会议信令的示例流程

假设 Alice 邀请 Bob 和 Charlie 参加一个 SIP 会议:

  1. Alice 发起会议: Alice 向会议服务器发送 INVITE 请求,创建会议会话。

    INVITE sip:conference-server@example.com SIP/2.0
    
  2. Bob 加入会议: 会议服务器向 Bob 发送 INVITE 请求,邀请 Bob 加入会议。

    INVITE sip:bob@example.com SIP/2.0
    

    Bob 发送 200 OK 响应,然后 Alice 发送 ACK 确认,Bob 加入会议。

  3. Charlie 加入会议: Alice 使用 REFER 请求让 Charlie 加入会议。会议服务器向 Charlie 发送 INVITE 请求。

    REFER sip:charlie@example.com SIP/2.0
    
  4. 会议结束: Alice 发送 BYE 请求,终止会议。

总结

SIP 是一个强大的协议,广泛应用于语音、视频通话及会议通信中。在 SIP 会议中,涉及 INVITE、ACK、BYE、REFER、NOTIFY 等核心信令,通过这些信令的交互,用户可以发起、加入、管理和终止会议。SIP 的灵活性使其可以适应复杂的多媒体应用场景,并且它与 SDP 协作实现了对媒体流的协商和管理。

相关文章:

  • Android studio安装问题及解决方案
  • TypeScript高级内容
  • vue中使用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)
  • 解压视频素材下载网站推荐
  • python用两类循环嵌套打印正置九九乘法口诀表和倒置九九乘法口诀表
  • PPT 快捷键使用、技巧
  • Python知识点:如何使用Hadoop与Python进行大数据处理
  • 数据结构-3.6.队列的链式实现
  • 集合框架 - Collection单列集合
  • WeChat_DevTools 断点调试方法总结
  • 0x09 瑞友 应用虚拟化系统 GetBSAppUrl SQL注入漏洞 - 复现
  • 图像超分辨率(SR)
  • linux系统的常用命令
  • GPIO端口的使用
  • 牛客周赛 Round 61(思维、组合数)
  • 2017前端实习生面试总结
  • Git 使用集
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • python大佬养成计划----difflib模块
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 前端面试之CSS3新特性
  • 如何用vue打造一个移动端音乐播放器
  • 实习面试笔记
  • 微服务框架lagom
  • 一个SAP顾问在美国的这些年
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ‌Excel VBA进行间比法设计
  • #Linux(权限管理)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $.ajax()方法详解
  • (35)远程识别(又称无人机识别)(二)
  • (day6) 319. 灯泡开关
  • (done) 声音信号处理基础知识(4) (Understanding Audio Signals for ML)
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Python) SOAP Web Service (HTTP POST)
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (八)Flink Join 连接
  • (二)springcloud实战之config配置中心
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (规划)24届春招和25届暑假实习路线准备规划
  • (七)c52学习之旅-中断
  • (七)Java对象在Hibernate持久化层的状态
  • (十八)Flink CEP 详解
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)Linux下编译安装log4cxx
  • (转)Sublime Text3配置Lua运行环境
  • ..回顾17,展望18
  • .net 提取注释生成API文档 帮助文档