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

ICE/TURN/STUN/Coturn服务器搭建

ICE

当我们想要实现在公网环境下的语音/视频通话功能时,就需要用到ICE交互式连接建立。ICE不是一种协议,整合了 STUN 和 TURN 两种协议(用于 NAT 穿透)的框架。

ICE的主要目标是解决NAT(网络地址转换)穿越问题,使得即使在复杂的网络环境下,如防火墙和NAT路由器后面,两个对等体也能够发现彼此并建立连接。

ICE的操作过程如下:

  1. 收集 Candidate
  2. 交换 Cadidate
  3. 按优先级尝试连接

Candidate

在WebRTC中,Candidate(候选) 是指用于在两个对等体(peers)之间建立连接的所有可能的网络地址和传输方式。这些候选包括了本地IP地址、端口号以及可能需要的中继服务器信息。候选的目的是提供一个或多个路径,以便在因网络限制(如NAT、防火墙)而无法直接连接的请款下,仍能够建立通信。

STUN

STUN是一种网络协议,主要目的是解决因NAT(网络地址转换)导致的端到端直接通信问题。STUN提供了一种方法,允许位于NAT后面的设备发现他们在公共互连网上的IP地址和端口号,以及NAT设备的类型。这样,这些设备可以被其他互连网上的设备发现和链接。

简单点说就是获取主机公网IP的

STUN的工作流程如下:

  1. 客户端请求:位于NAT后面的客户端向STUN服务器发送一个请求。
  2. 服务器响应:STUN服务器收到请求后,会将请求的源IP地址和端口号(即客户端在公共互连网上的地址)作为响应的一部分发送回客户端。
  3. 客户端发现:客户端通过STUN服务器的响应知道了自己在公网上的IP和端口
  4. 交换信息:客户端之前可以交换这些信息,尝试直接连接。

交换信息是通过信令通道实现的,STUN主要任务是前两步

在这里插入图片描述

STUN服务器通常是一个简单的服务,它监听UDP端口(通常是3478),并响应发往该端口的STUN请求。

客户端通过STUN服务器建立连接成功时,用户之间是直接连接的。

在这里插入图片描述

STUN协议的局限性在于,它只能帮助设备发现自己的公网地址,但并不能保证两个设备能够直接通信。如果NAT设备不允许未经初始化的外部连接,即使知道了对方的公网地址,直接连接仍可能失败。在这种情况下,可能需要使用TURN协议,它通过中继流量来实现通信。

TURN

TURN协议是一个用于解决NAT穿透问题的协议,它是STUN协议的一个扩展。TURN协议通过在服务器上设置中继服务器,允许NAT后面的客户端之间进行通信。当两个客户端直接建立连接时,例如由于严格的NAT策略,TURN服务器会介入,接收来自一个客户端的数据并转发给另一个客户端。

在WebRTC中,TURN服务器提供了一个中继点,用于在对等体(peers)之间转发数据包。如果STUN协议无法实现直接连接,TURN协议就会作为备选方案,确保通信的建立。

客户端通过TURN建立连接成功时:

在这里插入图片描述

Coturn服务器搭建

下载地址:coturn/coturn: coturn TURN server project (github.com)

官网提供了包管理器和 docker 两种方式。

在这里插入图片描述

apt

apt install coturn
turnserver --log-file stdout

docker

docker run -d -p 3478:3478 -p 3478:3478/udp -p 5349:5349 -p 5349:5349/udp -p 49152-65535:49152-65535/udp coturn/coturn

由于我使用的阿里云ecs配置为2核2G,使用docker启动容器会直接卡死,下面采用包管理器进行安装。

下载 coturn

centos 可以使用 yum 下载 coturn

sudo yum install coturn

使用 openssl 生成 cert 和 pkey 配置的自签名证书

openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes 

生成的证书默认位于/etc/turn_server_cert.pem、/etc/turn_server_pkey.pem

修改配置

修改 coturn 配置

vim /etc/coturn/turnserver.conf 

可以通过ifconfig命令查看内网IP,也可以在实例首页查看

在这里插入图片描述

修改为自己的内网、公网IP,用户名和密码可以自定义。

# 网卡名
relay-device=eth0
#内网IP
listening-ip=172.24.65.118
listening-port=3478
#内网IP
relay-ip=172.24.65.118
tls-listening-port=5349
# 外网IP
external-ip=47.121.25.229
relay-threads=500
#打开密码验证
lt-cred-mech
cert=/etc/turn_server_cert.pem
pkey=/etc/turn_server_pkey.pem
#设置用户名和密码,创建IceServer时使用
user=hhh:123456
# 外网IP绑定的域名
realm=47.121.25.229
# 服务器名称,用于OAuth认证,默认和realm相同,部分浏览器本段不设可能会引发cors错误。
server-name=47.121.25.229
# 认证密码,和前面设置的密码保持一致
cli-password=123456

udp 3478 用于STUN服务,tcp 3478 用于TURN服务,默认 udp 49152-65535 用于媒体中继,需要为这些端口配置安全组。

在这里插入图片描述

启动 coturn

turnserver -o -a -f

测试:Trickle ICE (webrtc.github.io)

If you test a STUN server, it works if you can gather a candidate with type “srflx”. If you test a TURN server, it works if you can gather a candidate with type “relay”.

如果您测试一个STUN服务器,如果您可以收集类型为“srflx”的候选服务器,它就可以工作。如果您测试一个TURN服务器,如果您可以收集类型为“relay”的候选服务器,它就可以工作

填写自己的服务器信息,并点击“Add Server”

在这里插入图片描述

点击下方的“Gather candidates”。若收集到了srflxrelay 类型的候选服务器,表示STUN和TURN可以工作。

在这里插入图片描述

要在JavaScript中使用TURN服务器,你需要在你的WebRTC代码中配置PTCPeerConnection对象,以包含TURN服务器的信息,例如:

const peerConnection = new RTCPeerConnection({iceServers: [{urls: 'turn:ip:3478', // 你的TURN服务器地址和端口username: '',  // 如果需要,填入你的TURN用户名credential: '', // 如果需要,填入你的TURN密码}]
});

相关文章:

ICE/TURN/STUN/Coturn服务器搭建

ICE 当我们想要实现在公网环境下的语音/视频通话功能时,就需要用到ICE交互式连接建立。ICE不是一种协议,整合了 STUN 和 TURN 两种协议(用于 NAT 穿透)的框架。 ICE的主要目标是解决NAT(网络地址转换)穿越…...

ctf.bugku-eval

题目来源&#xff1a;eval - Bugku CTF 访问页面&#xff0c; 代码解释 <?phpinclude "flag.php"; //包含"flag.php"文件$a $_REQUEST[hello]; //从请求参数hello中获取值并赋给变量$a。 eval( "var_dump($a);"); //…...

Extreme Compression of Large Language Models via Additive Quantization阅读

文章目录 Abstract1. Introduction2. Background & Related Work2.1. LLM量化2.2. 最近邻搜索的量化 3.AQLM:Additive Quantization for LLMs3.1. 概述3.1.0 补充**步骤说明****举例说明** 3.2. 阶段1&#xff1a;代码的波束搜索3.3. 阶段2&#xff1a;码本更新3.4. 阶段3&…...

【虚拟化】内核级虚拟化技术KVM介绍,全/半虚拟化的区别,使用libvirt搭建虚拟化平台(go/java/c++)

【虚拟化】内核级虚拟化技术KVM介绍&#xff0c;全/半虚拟化的区别&#xff0c;使用libvirt搭建虚拟化平台&#xff08;go/java/c&#xff09; 文章目录 1、虚拟化技术分类与架构&#xff08;KVM&#xff0c;Xen&#xff09;&#xff0c;全/半虚拟化的区别2、libvirt介绍3、使用…...

C++类成员变量的初始化

1、优先使用或{} 类的非静态数据成员在声明时&#xff0c;使用或{}进行初始化执行默认初始化&#xff0c;构造函数只处理一些特殊成员。 2、直接初始化 使用()进行初始化、new运算符和类构造函数的初始化列表。 3、拷贝初始化 使用进行初始化、函数传参、函数返回值。 隐式调用…...

Golang 中的强大 TUI 库 ——tview

在命令行界面下创建丰富的用户交互界面是许多开发者的需求&#xff0c;而 Golang 语言中有一个非常出色的 TUI&#xff08;文本用户界面&#xff09;库 ——tview。本文将详细介绍 tview 库&#xff0c;并与其他流行的 TUI 库进行对比&#xff0c;最后进行总结。 一、tview 库介…...

电层相关 -- 支路板与线路板

华为OTN产品系列支持 支路板、线路板分离架构 。支路/线路板和集中交叉单板配合使用&#xff0c;除了可以完成OTU单板功能外&#xff0c;还可通过集中交叉单板进行各级别ODUk颗粒业务调度&#xff0c; 实现更加灵活的电层信号调度及更高的带宽利用率。 支路板 功能 实现客户…...

leetcode 93.复原ip地址

1.题目要求&#xff1a; 2.题目代码: class Solution { public:vector<string> result;// 记录结果// startIndex: 搜索的起始位置&#xff0c;pointNum:添加逗点的数量void backtracking(string& s, int startIndex, int pointNum) {if (pointNum 3) { // 逗点数…...

AI+视频监控:EasyCVR安防平台赋能火电制造行业的视频智能管理方案

随着信息技术的飞速发展和智能制造的深入推进&#xff0c;火电制造行业作为国民经济的重要组成部分&#xff0c;正面临着智能化转型的迫切需求。为了提升生产效率、保障设备安全、优化管理流程&#xff0c;火电制造企业迫切需要引入先进的视频监控与人工智能技术。EasyCVR安防监…...

UIP协议栈 TCP Server Client通信成功案例

文章目录 这里边有相当好的 [UIP 文档资料&#xff0c;文档位置在仓库的UIP/uip doc &#xff0c;括号内是仓库地址&#xff08;https://gitee.com/free-people-in-time-and-space/net-work-learn-note.git &#xff09;TCP Server1.main循环里做的事2.以下是main循环里相关函数…...

Android Studio Koala Feature Drop 稳定版现已推出

作者 / Android Studio 产品经理 Sandhya Mohan Android Studio Koala Feature Drop (2024.1.2) 现已推出&#xff01;&#x1f428; &#x1f517; Android Studio https://developer.android.google.cn/studio 今年早些时候&#xff0c;我们宣布每个 Android Studio 动物版本…...

胤娲科技:AI评估新纪元——LightEval引领透明化与定制化浪潮

AI评估的迷雾&#xff0c;LightEval能否拨云见日&#xff1f; 想象一下&#xff0c;你是一位AI模型的开发者&#xff0c;精心打造了一个智能助手&#xff0c;却在最终评估阶段遭遇了意外的“滑铁卢”。 问题出在哪里&#xff1f;是模型本身不够聪明&#xff0c;还是评估标准太过…...

Python安装|PyCharm Professional 下载安装教程。2024最新版,亲测使用!

一、下载地址&#xff1a; 二、Python的下载及安装&#xff1a; 1、从上面网址进入Python官网 2、安装流程图&#xff1a; 双击已经下载好的python-*.*.*-amd64.exe文件&#xff0c;开始安装 最后就等它自己安装完成就好了 3、检验是否安装完成&#xff1a; windowsR快捷键…...

JavaSwitch控制流语句

在Java中&#xff0c;switch语句是一种控制流语句&#xff0c;用于根据变量的不同值执行不同的代码块。它提供了一种替代if-else语句的方式&#xff0c;使代码更简洁和易于阅读。以下是switch语句的基本语法和使用示例。 基本语法 switch (expression) {case value1:// 执行代码…...

PCL 3D-SIFT关键点检测(Z方向梯度约束

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 SIFT关键点检测 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#…...

肺结节分割与提取系统(基于传统图像处理方法)

Matlab肺结节分割(肺结节提取)源程序&#xff0c;GUI人机界面版本。使用传统图像分割方法&#xff0c;非深度学习方法。使用LIDC-IDRI数据集。 工作如下&#xff1a; 1、读取图像。读取原始dicom格式的CT图像&#xff0c;并显示&#xff0c;绘制灰度直方图&#xff1b; 2、图像…...

ESP32 COAP 客户端观察者模式下,GET服务器的例程

目录 环境准备 示例代码 代码解释 初始化: CoAP 上下文和会话: 注册响应处理函数: 创建和发送 GET 请求: 处理响应: 主循环: 注意事项 ESP32 是一款功能强大的微控制器,支持多种通信协议,包括 CoAP(Constrained Application Protocol)。CoAP 是一种专为物联…...

【Kubernetes】常见面试题汇总(五十七)

目录 125. K8S 创建服务 status 为 ErrlmagePull&#xff1f; 126.不能进入指定容器内部&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 …...

Java 设计模式 构建者模式

文章目录 1 概念2 使用方法1 创建步骤&#xff1a;2 使用步骤&#xff1a; 参考 1 概念 builder模式又叫建造者模式&#xff0c;属于创建型模式 作用&#xff1a;将一个复杂对象的构建与他的表示分离&#xff0c;可以一步一步构建对象&#xff0c;而不是使用构造函数构造一次…...

建设企业网站如何建

首先&#xff0c;企业网站是企业数字化转型的重要组成部分。在数字化浪潮的冲击下&#xff0c;企业需要通过建设网站来实现信息化管理&#xff0c;提高工作效率。通过企业网站&#xff0c;企业可以便捷地发布最新产品信息、公司新闻、招聘信息等&#xff0c;极大地提升了信息传…...

对比直接使用厂商API体验Taotoken聚合调用在延迟上的优化感受

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比直接使用厂商API体验Taotoken聚合调用在延迟上的优化感受 作为一名长期直接调用单一模型API的开发者&#xff0c;我的日常工作…...

多VM同时启动卡爆?2种方法设置启动延迟,避免启动风暴

在虚拟化运维中&#xff0c;多台虚拟机&#xff08;VM&#xff09;同时启动时&#xff0c;很容易引发“启动风暴”——CPU、内存、存储IO瞬间被占满&#xff0c;导致所有虚拟机启动缓慢、卡顿&#xff0c;甚至部分VM启动失败&#xff0c;严重影响业务正常运行。其实解决方法很简…...

终极SQLite数据库管理指南:DB Browser for SQLite完整使用手册

终极SQLite数据库管理指南&#xff1a;DB Browser for SQLite完整使用手册 【免费下载链接】sqlitebrowser Official home of the DB Browser for SQLite (DB4S) project. Previously known as "SQLite Database Browser" and "Database Browser for SQLite&quo…...

深入解析OpenWrt启动流程:从Bootloader到procd的完整指南

1. 项目概述与核心价值搞OpenWrt开发&#xff0c;尤其是涉及到系统定制、驱动适配或者故障排查&#xff0c;你迟早会碰到一个绕不开的核心问题&#xff1a;这玩意儿到底是怎么启动的&#xff1f;很多人可能觉得&#xff0c;启动流程嘛&#xff0c;不就是上电、加载内核、跑起来…...

如何实现GitHub下载10倍加速:免费插件完整配置终极指南

如何实现GitHub下载10倍加速&#xff1a;免费插件完整配置终极指南 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 对于国内开发者…...

别再只盯着业务代码了!SpringBoot应用层安全之Tomcat连接管理实战

SpringBoot应用层安全实战&#xff1a;Tomcat连接管理的三驾马车 当我们在讨论SpringBoot应用安全时&#xff0c;业务代码的漏洞修复往往占据了大部分注意力。然而&#xff0c;真正的安全防线远不止于此——应用层基础设施的配置与优化同样至关重要。想象一下&#xff0c;你的应…...

从CLIP到多模态:对比学习驱动的视觉-语言模型演进与实战

1. 对比学习&#xff1a;CLIP的基石与多模态革命 我第一次接触CLIP模型是在2021年初&#xff0c;当时OpenAI发布的这篇论文彻底颠覆了我对视觉模型训练方式的认知。传统计算机视觉任务总是离不开人工标注的海量数据&#xff0c;而CLIP却另辟蹊径&#xff0c;用自然语言作为监督…...

Taotoken的API Key分级管理与访问控制功能实测

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken的API Key分级管理与访问控制功能实测 1. 功能定位与实际价值 在团队协作或项目集成的场景中&#xff0c;直接使用一个具…...

【DBC专题】-12-基于Cantools的CAN/CANFD DBC文件自动化C代码生成实战指南

1. 环境准备与工具链搭建 第一次接触CAN总线开发时&#xff0c;我被DBC文件到C代码的手动转换折磨得够呛。直到发现Cantools这个神器&#xff0c;才真正体会到什么叫"一劳永逸"。这个Python工具链能自动将DBC描述文件转换为可直接编译的C代码&#xff0c;特别适合需要…...

IC设计五大典型Bug剖析:从CDC到软硬件协同的防御性设计

1. 项目概述&#xff1a;IC设计中的那些“老朋友”在芯片设计的江湖里混迹多年&#xff0c;我越来越觉得&#xff0c;我们这些IC工程师&#xff08;ICer&#xff09;的日常&#xff0c;与其说是在创造&#xff0c;不如说是在与各种层出不穷的“老朋友”——也就是bug——斗智斗…...