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

WebRTC通话原理(SDP、STUN、 TURN、 信令服务器)

文章目录

    • 1.媒体协商
      • SDP简介
    • 2.网络协商
      • STUN的工作原理
      • TURN工作原理
    • 3.信令服务器
      • 信令服务器的主要功能
      • 信令服务器的实现方式

1.媒体协商

比如下面这个例子 A端与B端要想通信

在这里插入图片描述

  • A端视频采用VP8做解码,然后发送给B端,B端怎么解码?

  • B端视频采用VP9做解码,然后发送给A端,A端怎么解码?

所以要协商媒体信息

所以A端和B端要同时采用对方都支持的编码方式,如上图—使用H264进行解码

有一个专门的协议叫做信令服务器交换会话描述协议(SDP),用于交换连接信息和协调两个端点之间的通信。会话描述协议(SDP)是WebRTC信令过程中的核心部分,它描述了多媒体会话的细节。以下是关于SDP及其在信令过程中的作用的介绍:

SDP简介

SDP(Session Description Protocol)是一种用于描述多媒体会话的格式。它包含了会话的媒体类型、格式、传输协议和网络信息等。SDP在WebRTC中用于协商音视频通话的各种参数,确保两个端点可以兼容并顺利进行通信。

以协商编码格式为例:

媒体描述(m=): 描述媒体类型(如音频、视频)、传输端口、传输协议和格式列表

m=audio 49170 RTP/AVP 0
m=video 51372 RTP/AVP 31

2.网络协商

彼此要了解对方的网络信息,这样才有可能找到一条相互通讯的链路

理想情况下:两台通信的电脑都有自己的私有公网地址,可以直接点对点通信

在这里插入图片描述

实际情况。我们的电脑都是在一个大的局域网里面,需要NAT(网络地址转换),如下所示,图画的比较简陋,实际情况往往不止一层NAT,可能是多层NAT

在这里插入图片描述

为了解决上述问题,需要用到STUN 和 TURN

STUN(Session Traversal Utilities for NAT)是一种用于解决NAT(Network Address Translation)穿越问题的网络协议。NAT通常在局域网和互联网之间进行IP地址转换,从而保护局域网的设备,但它也会导致直接P2P(点对点)通信的困难。STUN协议帮助WebRTC客户端发现其公网IP地址及其在NAT后的端口,从而使P2P通信得以实现。

STUN的工作原理

STUN服务器位于公网上,客户端通过它来确定自己的公网IP地址和端口。STUN的基本工作流程如下:

  1. 客户端发送请求: 客户端向STUN服务器发送一个STUN请求包,通常是通过UDP协议。
  2. STUN服务器响应: STUN服务器收到请求后,提取请求包中的源IP地址和端口,并将其返回给客户端作为响应。
  3. 客户端接收响应: 客户端接收到响应后,解析出其在公网中的IP地址和端口。这些信息可以用于P2P连接的建立。

通过STUN,WebRTC客户端能够知道自己的公网IP地址和端口,从而使得对端能够直接与其通信。

但是STUN并不是每次都能成为得为需要NAT的通话设备分配IP地址,打洞可能打不通,或者带宽不足以支撑发送媒体数据,这个时候就可以使用TURN来做数据转发

TURN工作原理

与STUN不同,TURN不仅用于发现客户端的公网IP地址和端口,还实际参与数据传输。TURN服务器接收客户端的数据,并将其转发到目标客户端。这种方式确保了即使在最复杂的NAT和防火墙环境中,WebRTC通信仍然可以进行。这种方式的带宽由服务器承担

在这里插入图片描述

基本工作流程如下:

  1. 客户端发送请求: 客户端向STUN服务器发送一个STUN请求包,通常是通过UDP协议。
  2. STUN服务器响应: STUN服务器收到请求后,提取请求包中的源IP地址和端口,并将其返回给客户端作为响应。
  3. 客户端接收响应: 客户端接收到响应后,解析出其在公网中的IP地址和端口。这些信息可以用于P2P连接的建立。

通过STUN,WebRTC客户端能够知道自己的公网IP地址和端口,从而使得对端能够直接与其通信。

3.信令服务器

信令服务器在WebRTC中是一个关键组件,它负责在两个端点(如浏览器或应用程序)之间交换必要的连接信息(媒体协商信息,网络连接信息等等),以建立和维护实时通信会话。尽管信令服务器不参与实际的媒体数据传输,但它在连接建立过程中的作用至关重要。

信令服务器的主要功能

  1. 交换SDP(Session Description Protocol)
    • Offer/Answer:当一个端点想要与另一个端点建立连接时,它会创建一个SDP offer,并通过信令服务器发送给另一个端点。另一个端点接收到offer后,生成一个SDP answer,并通过信令服务器返回给第一个端点。这些SDP消息包含了媒体类型、编解码器、带宽等信息,确保两端能够兼容通信。
  2. 交换ICE候选者
    • ICE候选者(Interactive Connectivity Establishment Candidates):为了建立P2P连接,双方需要交换多个网络候选者,以确定最佳的通信路径。信令服务器在这个过程中传递这些候选者信息。
  3. 传递控制消息
    • 通话控制:信令服务器也用于传递其他控制消息,如挂断、静音、解除静音等操作。

信令服务器的实现方式

信令服务器的实现并没有固定的标准,可以使用多种协议和技术。常见的实现方式包括:

  • WebSocket:一种全双工通信协议,特别适合用于实时应用。WebRTC通常使用WebSocket来传递信令消息,因为它能够提供低延迟的双向通信。
  • HTTP/HTTPS:虽然不如WebSocket实时,但可以用于简单的信令实现,特别是当实时性要求不高时。
  • SIP(Session Initiation Protocol):一种用于启动、维护和终止实时会话的协议,常用于VoIP(网络电话)系统中。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Git_基础命令
  • 【ESP32 idf Uart串口通信】
  • 遇到not allow unquoted fieldName怎么办
  • Leetcode 721.账户合并(hash+dfs)☆
  • [MySQL]02 存储引擎与索引,锁机制,SQL优化
  • Python:Flask自定义URL路由参数过滤器
  • 电缆故障精准定位系统
  • 在CentOS中配置三个节点之间相互SSH免密登陆
  • 极狐GitLab如何启用和配置PlantUML?
  • 【Django】在vscode中运行调试Django项目(命令及图形方式)
  • 观成科技:活跃窃密木马TriStealer加密通信分析
  • setsockopt选项对tcp速度
  • HTTP 协议浅析
  • k8s 公共服务
  • 问题处理--No such file or directory
  • 【Linux系统编程】快速查找errno错误码信息
  • Apache Spark Streaming 使用实例
  • ES6 ...操作符
  • IndexedDB
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Web Storage相关
  • 力扣(LeetCode)965
  • 你真的知道 == 和 equals 的区别吗?
  • 前端自动化解决方案
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • Python 之网络式编程
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (C++哈希表01)
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (算法)区间调度问题
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)大道至简,职场上做人做事做管理
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • 、写入Shellcode到注册表上线
  • ... 是什么 ?... 有什么用处?
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .Net Core 中间件与过滤器
  • .NET 材料检测系统崩溃分析
  • ;号自动换行
  • @RequestBody与@RequestParam:Spring MVC中的参数接收差异解析
  • @软考考生,这份软考高分攻略你须知道
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [GN] 设计模式——面向对象设计原则概述
  • [go-zero] 简单微服务调用
  • [idea]关于idea开发乱码的配置
  • [java刷算法]牛客—剑指offer链表有环的入口、反转链表、合并排序链表
  • [json]定义、读写
  • [Linux安全运维] Nginx安装部署以及LNMP框架搭建保姆级教程
  • [Meachines] [Easy] Sense PFSense防火墙RCE
  • [MICROSAR Adaptive] --- autosar官方文档阅读建议