15. STUN协议和ICE工作原理

news2024/10/5 19:14:38

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格式

在这里插入图片描述

  1. 最高两位:为0,在STUN协议与其他协议端口复用时,用于区分STUN和其他数据包,如RTP数据包。

  2. STUN Message Type(16bits):消息类型。定义消息类型如下:
    0x0001:捆绑请求
    0x0101:捆绑响应
    0x0111:捆绑错误响应
    0x0002:共享私密请求
    0x0102:共享私密响应
    0x0112:共享私密错误响应

  3. Message Length:(16bits),消息长度,不包含STUN Header的20个字节。所有的STUN属性都是20字节对齐的。

  4. Magic Cookie:(32bits),固定值0x2112A442,用于反射地址的异或(XOR)运算。

  5. 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类型
主机候选者
反射候选者
中继候选者
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考:链接

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

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

相关文章

UE4/UE5像素流送云推流|程序不稳定、弱网画面糊怎么办?

看到不少反馈说像素流送技术在实际的应用中,存在一些问题,比如程序崩溃、画面模糊等。本文将探讨这些问题,并介绍点量云流软件提供了哪些有效的解决方案。 常见的像素流送技术问题 画面质量问题: 当快速操作UE模型或初次启动像素…

Mongodb使用$pop删除数组中的元素

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第67篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关…

IDEA项目上传Github流程+常见问题解决

一、Github上创建仓库 项目创建好后如图所示 二、IDEA连接Github远程仓库 管理远程 复制远程地址 定义远程 登录Github 点击进入File->Settings->Version Control->Github登录自己的账号并勾上“√” 三、推送项目 点击推送 修改为main 点击确定,打开远程…

Kimichat使用案例014:用kimichat自动批量重命名三体字幕文件(零代码编程)

文章目录 一、介绍二、字幕文件三、kimi输入内容四、kimi输出内容五、运行程序一、介绍 网上下载了Netflix的三体电视剧,但没有字幕,又从字幕网站下载了字幕文件,由于字幕文件和视频文件标题有差异,需要全部进行重命名。 二、字幕文件 从字幕网站下载了字幕文件如下: 三、…

基于 Element UI 的高效前端表格模板开发

在前端开发中,表格展示和搜索功能是常见的需求之一。为了提高开发效率,我们可以通过创建一个可复用的表格模板来应对各种类似的场景。本文将分享一个基于 Element UI 的表格模板,它包含了搜索、分页和操作按钮等功能,可以作为未来…

基于zemax的圆孔、矩形衍射、双缝干涉与自定义孔径面型应用分析

自学案例节选自某乎 1:圆孔、矩形衍射、双缝干涉与自定义孔径面型应用分析 讨论一些基本的光学衍射、干涉现象,在加深对光学知识理解的同时,重点介绍一下自定义孔径的用法,主要是为了对软件的运用更为了解,并不针对某…

图说设计模式:单例模式

更多C学习笔记,关注 wx公众号:cpp读书笔记 5. 单例模式 单例模式 模式动机模式定义模式结构时序图代码分析模式分析实例优点缺点适用环境模式应用模式扩展总结 5.1. 模式动机 对于系统中的某些类来说,只有一个实例很重要,例如…

Linux:多线程的操作

多线程操作 进程与线程线程的创建 create_pthread创建线程池给线程传入对象的指针 线程等待 pthread_join退出线程 pthread_exit线程等待参数 retval 与 线程退出参数 retval 线程中断 pthread_cancel获取线程编号 pthread_self线程分离 pthread_detach 进程与线程 进程是资源…

【学习笔记】Kali

纯个人总结,有什么不对的地方欢迎指正。 笔记根据个人学习进度持续更新… 一、 认识Kali 基础了解 Kali是一套基于Debian发行版的一款操作系统。(这里讲一个误区,我以前一直以为kali就属于deepin下的操作系统,但是我知道deepin是…

记录一下:vue3+antd-vue a-form包含a-table实现表格行内校验, 清除 指定行 指定字段 的校验

问题描述下: 目标VLAN值可以输入, 也可以点击后面的按钮进行弹窗选择。由于检验原因,光标失焦但是没有填写就会校验爆红,然后点击选择之后由于没有失焦过程没有触发校验,依然还是红的。这个时候就需要清除 目标VLAN值 …

企业跨境文件传输的核心痛点,怎样保证稳定可靠的传输性能?

随着经济和国际贸易的发展,企业跨境文件传输日趋频繁,多个行业均存在高频且大量的跨境文件传输需求: 跨境电子商务: 跨境电商平台需要进行跨国的订单、支付和物流信息的传输,以便顺利完成交易和配送。涉及跨国企业的内…

Python爬虫实战(实战篇)—18获取【小红书】首页信息写入Excel(仅用于学习-附完整版代码)

文章目录 专栏导读背景1、分析首页页面2、分析获取信息2-1,获取:笔记类型2-2,获取:标题2-3,获取:用户信息2-4,获取:用户ID2-5,获取:用户头像2-6,获取:文章连接完整代码总结专栏导读 文章名称链接Python爬虫实战(实战篇)—16获取【百度热搜】数据—写入Ecel(附完整…

一篇文章看懂Redission原理

文章目录 ☃️可重入锁原理☃️锁重试和WatchDog机制☃️MutiLock原理 上一篇文章讲解了 Rediision的使用 ,这篇文章讲解其原理 ☃️可重入锁原理 在Lock锁中,他是借助于底层的一个voaltile的一个state变量来记录重入的状态的,比如当前没有人持有这把锁…

Vue配置项之生命周期(组件生命周期)

Lifecycle Hooks 首先说明一下,本人是前端小学生级别的菜鸡,吐槽的话请口下留情,在评论区指出错误或者补充不足,我会很喜欢,互喷不会进步,相互指点才会。。。。谢谢大家啦 目录 Lifecycle Hooks 目录创建…

指针的深入理解(3)(包括数组名的理解、一维数组传参的本质以及指针数组的相关知识及使用)

文章目录 1 数组名的理解2 使用指针访问数组3 一维数组传参的本质4 指针数组5 指针数组的使用 1 数组名的理解 当我们运行以下代码&#xff1a; #include <stdio.h> int main() {int arr[10] { 0 };printf("%p\n", &arr[0]);printf("%p\n", a…

踩坑!被node-sass折磨的一天

文章目录 被node-sass折磨的一天折磨过程了解原因注意事项 被node-sass折磨的一天 折磨过程 起因是要开发一个老项目&#xff0c;照常拉代码、下依赖、启动三步走 依赖开始下载不对了&#xff0c;以为是node版本问题&#xff0c;寻找node-sass对应的node版本 利用nvm&#…

IP地址乱成一团?用Shell一键搞定!

在日常的运维工作中&#xff0c;我们经常需要对各种数据进行处理和分析&#xff0c;其中包括对IP地址的管理和排序。排序后的IP地址列表可以帮助我们更好地进行日志分析、网络流量监控和故障排除。 本文将模拟一个运维场景&#xff0c;展示如何对IP地址进行排序&#xff0c;并探…

云原生应用开发培训,开启云计算时代的新征程

在云计算时代&#xff0c;云原生应用开发技术已经成为IT领域的热门话题。如果您想要转型至云原生领域&#xff0c;我们的云原生应用开发培训将帮助您开启新征程。 我们的课程内容涵盖了云原生技术的基础概念、容器技术、微服务架构、持续集成与持续发布&#xff08;CI/CD&#…

传统零售运营模式有什么缺点?新零售模式下的运营思维好在哪里?

随着科技的进步、消费者需求的多样化以及市场竞争的加剧&#xff0c;传统零售模式已逐渐难以满足现代消费者对购物体验的期待。新零售&#xff0c;作为一个创新的概念&#xff0c;应运而生&#xff0c;它不仅代表着零售行业的未来趋势&#xff0c;更是一种全新的商业思维和运营…

pytest中一个场景测试的demo

注意点1&#xff1a; allure.severity 是一个装饰器&#xff0c;用于设置测试用例的严重性级别。 allure.severity_level.CRITICAL 是Allure提供的严重性级别之一&#xff0c;表示这个测试用例极为重要。allure.severity_level.BLOCKER&#xff1a;阻塞级别的问题&#xff0c…