15. STUN协议和ICE工作原理
NET介绍
NAT是一种地址转换技术,它可以将IP数据报文头中的IP地址转换为另一个IP地址,并通过转换端口号达到地址重用的目的。
在大多数网络环境中,我们都需要通过 NAT 来访问 Internet。
NAT作为一种缓解IPv4公网地址枯竭的过渡技术,由于实现简单,得到了广泛应用。
NAT解决了什么问题?
随着网络应用的增多,IPv4地址枯竭的问题越来越严重。
尽管IPv6可以从根本上解决IPv4地址空间不足问题,但目前众多网络设备和网络应用大多是基于IPv4的;
因此,在IPv6广泛应用之前,使用一些过渡技术(如CIDR、私网地址等)是解决这个问题的主要方式,NAT就是这众多过渡技术中的一种。
当私网用户访问公网的报文到达网关设备后,如果网关设备上部署了NAT功能,设备会将收到的IP数据报文头中的IP地址转换为另一个IP地址,端口号转换为另一个端口号之后转发给公网。
在这个过程中,设备可以用同一个公网地址来转换多个私网用户发过来的报文,并通过端口号来区分不同的私网用户,从而达到地址复用的目的。
早期的NAT是指Basic NAT,Basic NAT在技术上实现比较简单,只支持地址转换,不支持端口转换。
因此,Basic NAT只能解决私网主机访问公网问题,无法解决IPv4地址短缺问题。
后期的NAT主要是指网络地址端口转换NAPT(Network Address Port Translation),NAPT既支持地址转换也支持端口转换,允许多台私网主机共享一个公网IP地址访问公网,因此NAPT才可以真正改善IP地址短缺问题。

NAT的实现方式(三种)
1、静态转换(Static Nat)

内部每台电脑一对一转换成公有IP地址,是固定不变得。相当于每一台电脑都绑定了一个ip地址,即使这个地址没有被使用,其他的电脑也不能拿来转换使用。一般是用于在内网中对外提供服务的特定设备的访问。
2、动态转换(Dynamic Nat)

是指内部每台电脑的IP地址转换为公有IP地址时,是动态的,不是固定的,随机分配。只要在这个IP资源池内,都可以随机使用。
3、端口多路复用(OverLoad)
是指改变外出数据包的源端口并进行端口转换,采用端口多路复用方式。也就是说,内部电脑都可以使用一个合法的IP地址实现对因特网的访问,可以节省大量的IP资源。目前使用最多的就是这种方式。

内容概述
在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet。很多时候,我们希望网络中的两台主机能够直接进行通信,即所谓的P2P通信,而不需要其他公共服务器的中转。由于主机可能位于防火墙或NAT之后,在进行P2P通信之前,我们需要进行检测以确认它们之间能否进行P2P通信以及如何通信。这种技术通常称为NAT穿透(NAT Traversal)。最常见的NAT穿透是基于UDP的技术,如RFC3489中定义的STUN协议。
STUN,首先在RFC3489中定义,作为一个完整的NAT穿透解决方案,英文全称是Simple Traversal of UDP Through NATs,即简单的用UDP穿透NAT。
在新的RFC5389修订中把STUN协议定位于为穿透NAT提供工具,而不是一个完整的解决方案,英文全称是Session Traversal Utilities for NAT,即NAT会话穿透效用。RFC5389与RFC3489除了名称变化外,最大的区别是支持TCP穿透。
TURN,首先在RFC5766中定义,英文全称是Traversal Using Relays around NAT:Relay Extensions to Session Traversal Utilities for NAT,即使用中继穿透NAT:STUN的扩展。简单的说,TURN与STURN的共同点都是通过修改应用层中的私网地址达到NAT穿透的效果,异同点是TURN是通过两方通讯的“中间人”方式实现穿透。
ICE跟STUN和TURN不一样,ICE不是一种协议,而是一个框架(Framework),它整合了STUN和TURN。
STUN协议介绍
STUN(session traversal utilities for NAT),一种处理NAT传输的协议,即简单的用UDP穿透NAT,是个轻量级的协议,是基于UDP的完整的穿透NAT的解决方案,主要作为工具来服务其他协议。它允许位于NAT(或多重NAT后的客户端找出自己的公网地址,查出自己位于那种类型的NAT之后以及NAT为某一个本地端口所绑定的internet端口),这些信息被用来两个同时处于NAT路由器之后的主机之间建立UDP通信。目的就是找到外界连接内部地址所需的信息。
- STUN存在的目的就是进行NAT穿越
- STUN是典型的客户端/服务器模式。客户端发送请求,服务端进行响应。
STUN是一种Client/Server的协议,也是一种Request/Response的协议,默认端口号是3478。
STUN协议架构
1.请求/响应(request/response)类型,由客户端给服务器发送请求,并等待服务端返回响应,用于确定一个NAT给客户端分配的具体绑定。客户端通过事务ID将请求响应连接起来。
2.指示类型(indication transaction),由服务器或者客户端发送指示,另一方不产生响应,用于保持绑定的激活状态。事务ID通常作为debugging aid使用。
所有的STUN报文信息都包含有一个固定头部,包含了方法,类和事务ID。方法表示是具体哪一种传输类型。STUN中只定义了一种方法,即binding(绑定),其他方法可以由使用者自行扩展;Binding方法可以用于请求/响应类型和指示类型。
STUN基于客户机-服务器协议。如一个VoIP电话或者软件可能会包含一个STUN客户端。这个客户端向STUN服务器发送请求,之后,服务器就会向STUN客户端报告NAT路由器的公网IP地址以及NAT为允许传入流量传回内网而开通的端口。同时还使得STUN客户端能够确定正在使用的NAT类型——因为不同的NAT类型处理传入的UDP分组的方式不同。
STUN报文格式
- 包括20字节的STUN header
- BODY中可以有0个或多个attribute
STUN header格式

-
最高两位:为0,在STUN协议与其他协议端口复用时,用于区分STUN和其他数据包,如RTP数据包。
-
STUN Message Type(16bits):消息类型。定义消息类型如下:
0x0001:捆绑请求
0x0101:捆绑响应
0x0111:捆绑错误响应
0x0002:共享私密请求
0x0102:共享私密响应
0x0112:共享私密错误响应 -
Message Length:(16bits),消息长度,不包含STUN Header的20个字节。所有的STUN属性都是20字节对齐的。
-
Magic Cookie:(32bits),固定值0x2112A442,用于反射地址的异或(XOR)运算。
-
Transaction ID:(96bits),事务ID标识符,请求对应的响应具有相同的标识符。
STUN Message Type
- 前两位必须是00,以区分复用同一端口时STUN协议
- 2位用于分类,即C0和C1
- 12位用于定义请求/指示

一共14位。C0和C1用于分类的。并且不是挨着的。


- C1-C0两位表示类编码
0b00:request
0b01:indication
0b10:success response
0b11:error response

- M11-M0表示方法
STUN目前定义了一个绑定方法,Binding方法可以用于请求/响应类型和指示类型。method=0b000000000001 (Binding)
大小端模式
- 大端模式:数据的高字节保存在内存的低地址中
就是比如说,15中10是高字节,保存在内存的低地址中 - 小端模式:数据的高字节保存在内存的高地址中
跟上面相反
网络字节顺序∶采用大端排序方式
然后对于Message Type

这个可以分成4段。

这个也符合低字节放在高地址。
Transaction ID

STUN Message Body
上面介绍了消息头,下面是消息体
- 消息头后有0或多个属性
- 每个属性进行TLV编码:Type, Length, Value


0x0014: REALM
0x0015:NONCE
0x0020:XOR-MAPPED-ADDRESS
0x8022:SOFTWARE
0X8023:ALTERNATE-SERVER
0X8024:FINGERPRINT
在ICE中,包含STUN中用到的几个属性,具体如下所示:
0x0024 PRIORITY
0x0025 USE-CANDIDATE
0x8029 ICE-CONTROLLED
0x802A ICE-CONTROLLING
6 和 7 是最关键的用于验证
接下来看看怎么使用的:

ICE框架
简介
ICE的全称Interactive Connectivity Establishment(互动式连接建立),由IETF的MMUSIC工作组开发出来的,它所提供的是一种框架,使各种NAT穿透技术可以实现统一。ICE跟STUN和TURN不一样,ICE不是一种协议,而是一个框架(Framework),它整合了STUN和TURN。
ICE ,Interactive Connectivity Establishment
- 需要两端进行交互才能创建连接

就是上面那一个信令服务器,如果两人想要进行音视频的话,就用这个信令服务器建立连接然后交换各自的IP地址和端口号。

Candidate类型
主机候选者
反射候选者
中继候选者



参考:链接
相关文章:
15. STUN协议和ICE工作原理
NET介绍 NAT是一种地址转换技术,它可以将IP数据报文头中的IP地址转换为另一个IP地址,并通过转换端口号达到地址重用的目的。 在大多数网络环境中,我们都需要通过 NAT 来访问 Internet。 NAT作为一种缓解IPv4公网地址枯竭的过渡技术ÿ…...
JVM (一)内存模型
一。内存结构 1,JVM内存结构 堆内存:是JVM中最大的一块,由新生代和老年代组成。默认情况下新生代按照8:1:1的比例来分配; 方法区:存储类信息、常量、静态变量等数据,是线程共享的区域; 栈&#…...
Web前端职业描述:编织数字世界的绚丽画卷
Web前端职业描述:编织数字世界的绚丽画卷 在数字化浪潮席卷而来的今天,Web前端职业日益成为技术领域的璀璨明星。他们不仅是数字世界的建筑师,更是用户体验的缔造者。那么,Web前端职业究竟是怎样的呢?接下来ÿ…...
负氧离子监测站:打造健康生态的守护者
TH-FZ5随着人们对生活质量和健康水平的要求日益提高,空气质量成为了公众关注的焦点。其中,负氧离子作为空气中的一种重要成分,对人体健康有着显著的影响。负氧离子监测站作为监测空气中负氧离子浓度的专业设备,在现代环境监测和生…...
在调用接口上map与forEach的区别
在场景:一个表格数据需要上传,每行表格需要上传图片->这就需要在提交时对数据也就是数组进行处理(先将每个元素图片上传拿到图片id 这种情况我刚开始就用的map处理,然后问题来了,提交的接口调用了,但是…...
最短路:spfa算法
最短路:spfa算法 题目描述参考代码 题目描述 参考代码 输入示例 3 3 1 2 5 2 3 -3 1 3 4输出示例 2#include <iostream> #include <cstring> #inc…...
算法笔记 图论和优先级队列的笔记
图论 DFS stack O(h) 不具有最短性 BFS queue O(2^h) 最短路 迪杰斯特拉算法 初始化: 将起始节点 A 的距离设为 0。将其他所有节点的距离设为无穷大。创建一个优先队列,并将起始节点 A 加入优先队列。 处理队列: …...
6.每日LeetCode-数组类,找到所有数组中消失的数字
题目 448找到所有数组中消失的数字.go 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。 示例 1: 输入:nums [4,3,2,7,8,2,…...
【Three.js】知识梳理十:Three.js纹理贴图
1. 纹理贴图 在Three.js中,纹理贴图是一种将二维图像贴到三维物体表面的技术,以增强物体的视觉表现。纹理贴图可以使物体表面更加真实、细腻,为场景增色不少。 在Three.js中,纹理贴图的加载主要通过THREE.TextureLoader类实现。…...
mysql order by后跟case when
在SQL中,ORDER BY子句用于对查询结果进行排序。当在ORDER BY后面使用CASE语句时,它的原理是:根据CASE语句中定义的条件和结果,为查询结果集中的每一行生成一个临时的排序值。然后,根据这些排序值对结果集进行排序。 具…...
数字孪生赋能的智慧园区物联网云平台建设方案(97页PPT)
方案介绍: 本方案通过数字孪生技术赋能智慧园区物联网云平台,实现了园区的智能化管理、优化资源配置、提高运营效率等目标。同时提升园区的安全性、环保性和可持续性。最后,该方案还充分考虑了系统的可扩展性、安全性和可靠性,为…...
TikTok小店运营策略
TikTok,作为一款全球知名的短视频社交平台,其用户基数庞大且日活跃用户持续增长,为商家提供了巨大的商机。欧洲作为TikTok的重要市场之一,其小店功能为商家提供了一个展示和销售产品的新渠道。本文将探讨如何有效地运营TikTok小店…...
Docker面试整理-如何查看和管理Docker容器的日志?
管理和查看 Docker 容器的日志是 Docker 容器管理的重要部分,有助于监控应用的行为和诊断问题。Docker 提供了几种方法来查看和管理容器日志。 查看容器日志 要查看 Docker 容器的日志,你可以使用 docker logs 命令。这个命令会打印容器的 STDOUT 和 STDERR 输出,这是大多数…...
Java从放弃到继续放弃
并发编程 为什么需要多线程? 由于硬件的发展,CPU的核数增多,如果仍然使用单线程对CPU资源会造成浪费。同时,单线程也会出现阻塞的问题。所以,选择向多线程转变。 多线程的使用使得程序能够并行计算,提高计…...
上传文件生成聊天机器人,实现客服、办公自动化智能体 | Chatopera
从谈论聊天机器人,到谈论智能体,是目前人工智能最炙手可热的话题,这两年最大的变化是大语言模型的应用。聊天机器人曾经很难定制,往往局限于个别行业,同时也只有行业内的领导者、头部企业能定制。比如银行、金融证券、…...
SD3303A 大功率高亮度LED驱动芯片IC
一般描述 SD3303A是一款大功率高亮度LED驱动芯片,可以提供1A的电流驱动3W的LED。具有高效率,低功耗等特点,适用于电池供电的LED照明设备。 SD3303A具有开路保护和过温保护。 SD3303A需要使用两颗10uF(或者更大)的瓷片电容,来保…...
站易WordPress
站易WordPress是一家专业提供网站建设和运营服务的公司。他们提供的服务包括企业官方网站建设、网站运营维护、网站托管、网站优化、跨境独立站建站、外贸网站建设以及海外多语言网站建设等。 此外,站易还提供使用现成的WordPress模板,这样可以快速且低…...
windows下JDK1.8安装
windows下JDK1.8安装 本文假设你知道了解基本的windows系统操作。 在Windows系统下安装JDK 1.8(Java Development Kit)的步骤如下: 步骤1:下载JDK 1.8 打开浏览器并访问Oracle JDK下载页面。https://www.oracle.com/java/technol…...
怎么修改Visual Studio Code中现在github账号
git config --global user.name “你的用户名” git config --global user.email “你的邮箱” git config --global --list git push -u origin your_branch_name git remote add origin...
戴尔R720服务器(3)组RAID
今天收到7块硬盘,现在共有8块硬盘了,找了个视频学习了怎么使用阵列卡组RAID并记录。 视频参考:【戴尔服务器添加RAID5热备盘hotspare】 阵列卡组RAID5 开始 连接iDRAC控制台服务器开机按F2进入BIOS选择Device Settings …...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...
