15. STUN协议和ICE工作原理

2024-06-12 15:52
文章标签 工作 15 协议 原理 ice stun

本文主要是介绍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资源。目前使用最多的就是这种方式。
在这里插入图片描述

STUN协议介绍

STUN(session traversal utilities for NAT),一种处理NAT传输的协议,主要作为工具来服务其他协议。它允许位于NAT(或多重NAT后的客户端找出自己的公网地址,查出自己位于那种类型的NAT之后以及NAT为某一个本地端口所绑定的internet端口),这些信息被用来两个同时处于NAT路由器之后的主机之间建立UDP通信。目的就是找到外界连接内部地址所需的信息。

  • STUN存在的目的就是进行NAT穿越
  • STUN是典型的客户端/服务器模式。客户端发送请求,服务端进行响应。

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

参考:链接

这篇关于15. STUN协议和ICE工作原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054659

相关文章

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

SpringBoot集成LiteFlow工作流引擎的完整指南

《SpringBoot集成LiteFlow工作流引擎的完整指南》LiteFlow作为一款国产轻量级规则引擎/流程引擎,以其零学习成本、高可扩展性和极致性能成为微服务架构下的理想选择,本文将详细讲解Sp... 目录一、LiteFlow核心优势二、SpringBoot集成实战三、高级特性应用1. 异步并行执行2