STUN/TURN/ICE

news2025/2/3 15:55:27

RFC 5389 - Session Traversal Utilities for NAT (STUN)

https://www.cnblogs.com/pannengzhi/p/5041546.html

https://www.cnblogs.com/pannengzhi/p/5048965.html

STUN : Session Traversal Utilities for NAT, 一个协助穿越NAT的工具,运行在UDP和TCP之上。

NAT(Network Address Translation)

STUN by itself is not a solution to the NAT traversal problem. Rather, STUN defines a tool that can be used inside a larger solution. 

STUN 作用:位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于 NAT路由器之后的主机之间建立UDP通信。同时可以检测端点间的连接性,也可以作为一种保活(keep-alive)协议来维持NAT的绑定。

STUN is a client-server protocol.

 

It supports two types of transactions. 

request/response transaction (请求/响应):  a  client sends a request to a server, and the server returns a  response.

indication transaction(指示): either  agent -- client or server -- sends an indication that generates no response.

 

消息格式:(采用大端编码(big-endian),即最高有效位在左边)

STUN消息头:20字节

All STUN messages start with a fixed header that includes a method, a  class, and the transaction ID.

1)最高的2位必须置零,这可以在当STUN和其他协议复用端口的时候,用来区分STUN包和其他数据包。

2)STUN Message Type:

Method (方法): 如 Binding

Class(类别):如 a request  / a success response / an error response /  an indication

3)Message Length:不包括20字节头的STUN消息长度

4)Magic Cookie: 固定为RFC 3489 0x2112A442,这是为了前向兼容classic STUN,因为在classic STUN(RFC 3489 )中,这一区域是Transaction ID的一部分。

5)Transaction ID(事务ID):a randomly selected 96-bit number  

对于request/response传输,Transaction ID由客户端选择,服务器收到后以同样的Transaction ID返回response;

对于indication则由发送方自行选择。

Transaction ID的主要功能是把request和response联系起来,同时也在防止攻击方面有一定作用。服务端也把Transaction ID当作一个Key来识别不同的STUN客户端,因此必须格式化且随机在0~2^(96-1)之间。

重发同样的request请求时可以重用相同的Transaction ID,但是客户端进行新的传输时,必须选择一个新的Transaction ID。

  

STUN消息体:0个或者多个TLV属性

Following the fixed header comes zero or more attributes, which are Type-Length-Value extensions that convey additional information for the specific message.(紧跟固定头部的是0个或者多个TLV属性)

其中Type字段和Length字段占用16位,Value字段为32位表示(STUN属性以32bit边界对齐),即属性内容不足4字节的都会以padding bit进行补齐。

Length:不包含补齐(padding bit)的Value长度,以字节为单位。

Type:字为属性的类型。任何属性类型都有可能在一个STUN报文中出现超过一次。除非特殊指定,否则其出现的顺序是有意义的:即只有第一次出现的属性会被接收端解析,而其余的将被忽略。

属性区域被分为两个部分:

Type值在0x0000-0x7FFF之间的属性被指定为强制理解,意思是STUN终端必须要理解此属性,否则将返回错误信息;

而0x8000-0xFFFF之间的属性为选择性理解,即如果STUN终端不识别此属性则将其忽略。

常见的属性:

FINGERPRINT:CRC校验。放在属性列表的最后,即若存在的话应当是最后一个属性。多个协议复用一个端口时,可以用来区分是否是STUN消息。

Wireshark抓包示例:

 

TURN: 在STUN的基础上增加relay功能。在有些情况下,有可能终端无法和其对等端(peer)进行直接的通信,这时就需要公网的服务器作为一个中继,对来往的数据进行转发。这个转发的协议就被定义为TURN。

ICE状态

The RTCIceConnectionState enum defines the string constants used to describe the current state of the ICE agent and its connection to the ICE server (that is, the STUN or TURN server).

Constant

Description

"new"

The ICE agent is gathering addresses or is waiting to be given remote candidates through calls to RTCPeerConnection.addIceCandidate() (or both).

"checking"

The ICE agent has been given one or more remote candidates and is checking pairs of local and remote candidates against one another to try to find a compatible match, but has not yet found a pair which will allow the peer connection to be made. It's possible that gathering of candidates is also still underway.

"connected"

A usable pairing of local and remote candidates has been found for all components of the connection, and the connection has been established. It's possible that gathering is still underway, and it's also possible that the ICE agent is still checking candidates against one another looking for a better connection to use.

"completed"

The ICE agent has finished gathering candidates, has checked all pairs against one another, and has found a connection for all components.

"failed"

The ICE candidate has checked all candidates pairs against one another and has failed to find compatible matches for all components of the connection. It is, however, possible that the ICE agent did find compatible connections for some components.

"disconnected"

Checks to ensure that components are still connected failed for at least one component of the RTCPeerConnection. This is a less stringent test than "failed" and may trigger intermittently and resolve just as spontaneously on less reliable networks, or during temporary disconnections. When the problem resolves, the connection may return to the "connected" state.

"closed"

The ICE agent for this RTCPeerConnection has shut down and is no longer handling requests.

一旦收到ICE候选者,我们应该期望对等连接的状态最终将变为已连接状态。为了检测到这一点,我们在RTCPeerConnection中添加了一个侦听器,在此我们侦听connectionstatechange事件。

// Listen for connectionstatechange on the local RTCPeerConnection

peerConnection.addEventListener('connectionstatechange', event => {

    if (peerConnection.connectionState === 'connected') {

        // Peers connected!

    }

});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

yolov5(v7.0)网络修改实践一:集成YOLOX的backbone(CSPDarknet和Pafpn)到yolov5(v7.0)框架中

yolov5太好用了,无论是实际做工程还是学习研究,yolov5都比较好上手,而且现在工业界yolov5也应用广泛。但是,作为学习研究,有不少在yolov5之后提出的涨点算法,还是有价值进行研究的,也便于跟进当…

高效管理物流:利用批量查询申通物流信息的技巧

随着电子商务的飞速发展,快递已经成为了现代人生活中不可或缺的一部分。作为国内一家领先的快递公司,申通快递服务广泛,覆盖全国各地。在使用申通快递服务时,我们通过申通快递单号可以方便地查询物流信息。然而,许多人…

python开发项目基于语音识别的智能垃圾分类系统的设计与实现

博主介绍:擅长Java、微信小程序、Python、Android等,专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案例…

Ae 效果:CC Mr. Smoothie

风格化/CC Mr. Smoothie Stylize/CC Mr. Smoothie CC Mr. Smoothie(平滑先生)效果可以从一个图层上的两个点进行颜色采样,并将这个两点之间的颜色重映射到另一个图层上,可通过控制重映射的平滑度从而创建迷幻的外观效果。 ◆ ◆ …

图像处理之高斯滤波

文章目录 高斯函数1.一维高斯函数2. 二维高斯函数 高斯滤波1.高斯核生成2.滤波过程 高斯函数 高斯函数广泛应用于统计学领域,用于表述正态分布,在信号处理领域,用于定义高斯滤波器,在图像处理领域,二维高斯核函数常用…

创建一个类Person的简单实例

创建一个类Person的简单实例 创建一个类Person,包含以下属性:姓名(name)、年龄(age)、朋友(friends数组)、问候(sayhi方法,输出问候语,例如&#…

将TXT转化为PDF的软件,分享两个简单的方法!

在数字化时代,文档的传递和共享已经成为我们日常工作中的一部分。然而,有时我们可能需要将文本文件(如TXT格式)转换为PDF格式,以便更方便地共享、打印或存档。PDF格式的文件具有普遍的兼容性,可以在不同的设…

ESP32-C3 VSCode开发环境搭建

之前的文章 ESP32MicroPython开发环境的搭建 介绍了ESP32 MicroPython开发环境的搭建,此次计划采用ESP32-C3做小飞机主控,不太适合用MicroPython,要用ESP-IDF原生框架,因为平时一直用vs code编辑器,所以就选了vs code做…

数据库的扩展策略

了解不同的数据库扩展技术可以帮助我们选择适合我们需求和目的的合适策略。 因此,在本文中,我们将展示不同的解决方案和技术,用于扩展数据库服务器。它们分为读取和写入策略。 读取/加载 有时我们的应用程序承受着巨大的负载。为了解决这个…

1.1基于stc89c51系例单片机的空气温湿度检测报警系统

基于STC89C51系列单片机的空气温湿度检测报警系统 文章目录 基于STC89C51系列单片机的空气温湿度检测报警系统概述项目背景硬件设计1. STC89C51单片机2. DHT11温湿度模块3. LCD1602显示模块4. 人机交互模块5. 电源模块 软件设计1. 硬件初始化2. DHT11数据读取3. 数据显示4. 报警…

浅读-《深入浅出Nodejs》

这次算是重读 深入浅出Nodejs,了解到很多之前忽略的细节,收获蛮多,这次顺便将其记录分享,对学习和了解Nodejs有及其大的帮助。 1.Nodejs 事件驱动、非阻塞IO,一个开源和跨平台的 JavaScript 运行时环境;异…

手机直播app源码部署搭建:带货潮流,商城功能!

随着互联网时代的迅猛发展,手机直播app源码平台早已成为了人们获取资讯、娱乐放松等方式的主要载体,手机直播app源码平台的日益火爆,也让商人们有了一个新兴的想法出现:直播app平台如此火爆,平台的用户也如此庞大&…

perl输出中文乱码【win10】

perl输出中文乱码 运行的时候输出的内容变成了中文乱码,原因首先来查找一下自己的perl的模块里面是否有Encode-CN。请运行打开你的cmd并输入perldoc -l Encode::CN 如果出现了地址 则就是有,如果没有需要进行该模块的安装。 安装方式有很多种&#xff0…

Three.js——十二、MeshPhysicalMaterial清漆层、粗糙度、物理材质透光率以及折射率(结尾附代码)

环境贴图作用测试 MeshPhysicalMaterial清漆层 MeshPhysicalMaterial和MeshStandarMaterial都是拥有金属度metalness、粗糙度roughness属性的PBR材质,MeshPhysicalMaterial是MeshStandarMaterial的子集,除了继承了他的这些属性以外,还新增了…

NDK OpenGL实现美颜功能

NDK​系列之OpenGL实现美颜特效,本节主要是在上一节大眼萌的特效视上增加美颜特效。 OpenGL视频特效系列: NDK OpenGL渲染画面效果 NDK OpenGL离屏渲染与工程代码整合 NDK OpenGL仿抖音极快极慢录制特效视频 NDK OpenGL与OpenCV实现大眼萌特效 NDK…

java并发编程 11:JUC之ReentrantLock使用与原理

目录 使用可重入可打断锁超时公平锁条件变量 原理非公平锁实现原理源码流程 锁重入原理可打断原理与不可打断原理公平锁原理条件变量原理await流程signal流程 使用 ReentrantLock是可冲入锁,与 synchronized 一样,都支持可重入。但是相对于 synchronize…

kafka第三课-可视化工具、生产环境问题总结以及性能优化

一、可视化工具 https://pan.baidu.com/s/1qYifoa4 密码:el4o 下载解压之后,编辑该文件,修改zookeeper地址,也就是kafka注册的zookeeper的地址,如果是zookeeper集群,以逗号分开 vi conf/application.conf 启…

如何刻录光盘

如何刻录光盘 1 、将光盘放入光驱,选择“用于CD/DVD播放机” ,该模式下,刻录在光盘的文件无法进行编辑和删除 2 、将需要刻录的文件拷贝至光盘内,则会在“准备好写入光盘中的文件”下显示拷贝进去的文件,此时文件还没…

EDI 工作流操作指南

一个完整的EDI工作流中,起始端为通常为文件传输端口:如AS2、OFTP等,末端为数据库端口。此前的文章中我们对AS2端口以及数据库端口已做了详细介绍,本文主要介绍 EDI 文件的格式转换以及映射。 如下图所示,工作流界面中…

安装blissOS重启后无法进入图形化界面

重启blissOS 重启时,按e键两下 进入 上图是一个可编辑页面,不要删除修改前面的内容,移动光标前往quiet,然后删除quiet输入“ nomodeset xforceseva ”,然后按下回车 然后按回车,按b键进入系统 在set-…