STUN工作原理

news2024/11/16 23:40:43

目录

一. 前言

二. STUN报文格式

STUN Header

RFC3489

RFC5389

STUN Message Body

RFC3489

RFC5389

三. WebRTC对STUN协议的支持

四. STUN工作流程

1. 使用STUN获取NAT映射后的地址

五. 参考资料


一. 前言

        现实网络环境中绝大多数主机都是处于 NAT 之后,对于两个处于同一内网环境的主机,它们只要知道对端的内网地址就能进行通信,而对于不在同一内网的主机,如果它们想通信,要么借助带有公网地址的主机转发,要么通过一定的手段进行 NAT 穿越。

        STUN 协议是用来 NAT 穿越的工具,它允许位于 NAT 之后的主机查找到自己 NAT 映射后的公网地址,需要通信的双方交换映射后的公网地址再进行连通性检测。

        STUN 最先在 RFC3489 中定义,英文全称是 Simple Traversal of UDP Through NAT,即用 UDP 进行 NAT 穿越,而新的 RFC5389 把 STUN 定义为 Session Traversal Utilities for NAT,即 NAT 会话传输工具,RFC3489 与 RFC5389 相比,最大的区别是后者支持 TCP 穿越。

        STUN 协议是一个 C/S 模型的协议,即一端发送请求,另一端进行响应,此外还有指示类型的消息,一端发送指示消息后,另一端不必响应。

二. STUN报文格式

RFC3489 和 RFC5389 定义的报文格式有些许差别,因此下面会分开说明。

STUN Header

RFC3489

        STUN 报文以 20 个字节的头部开始,后面跟着若干属性。

        RFC3489 STUN Header 包含三个字段(2 个字节的 STUN Message Type,2 个字节的 Message Length,16 个字节的 Transaction ID)。

STUN Message Type 的取值和对应的含义如下。

Message Type含义
0x0001绑定请求
0x0101绑定响应
0x0111绑定错误响应
0x0002共享私密请求
0x0102共享私密响应
0x0112共享私密错误响应

Message Length:STUN 报文长度(不包括固定的 20 字节的头部)。

Transaction ID:事务 ID,用于关联请求和对应的响应,同一事务的请求和响应事务 ID 相同。

RFC5389

         RFC5389 的 STUN Header 也是 20 个字节,只是 STUN Message Type 从 16bit 变成 14bit,开头的 2bit 固定为 00,Transaction ID 从 128bit 变成 96bit,减少的 32bit 变成 Magic Cookie,其值固定为 0x2112A442,使用 Magic Cookie 可以区分 STUN RFC3489 还是 RFC5389。Message Length 含义与 RFC3489 一样,表示 STUN 报文除去头部后的长度。

RFC5389 的 STUN Message Type (14bit) 可以进一步分解成以下结构。

        M11~M0 用来表示方法,RFC 规范目前只定义了一个方法:Binding,其他方法可以由使用者自行扩展。

        C1C0 表示方法的类型,对于 C1C0=0b00 表示这是一个请求,C1C0=0b01 表示指示,C1C0=0b10 表示请求成功的响应,C1C0=0b11 表示请求失败的响应。

        方法与方法的类型是正交的,即对于每一种方法,其请求,指示,请求成功响应,请求失败响应都是可能的。

STUN Message Body

        STUN 报文头部之后有 0 或多个属性,每个属性使用 TLV 编码(Type, Length, Value)。

RFC3489

Type名称说明
0x0001MAPPED-ADDRESS返回客户端NAT映射过的IP和端口
0x0002RESPONSE-ADDRESS指明对于MAPPED-ADDRESS的响应应该发送至哪里
0x0003CHANGE-REQUEST请求服务端使用不同的IP和端口发送响应
0x0004SOURCE-ADDRESS指示服务端的IP和端口
0x0005CHANGED-ADDRESSCHANGE-REQUEST的响应
0x0006USERNAME用户名,用于安全认证
0x0007PASSWORD密码,用于安全认证
0x0008MESSAGE-INTEGRITY用于消息完整性验证
0x0009ERROR-CODE错误码
0x000aUNKNOWN-ATTRIBUTES未知属性
0x000bREFLECTED-FROM拒绝

        上图表示的意思是 MAPPED-ADDRESS 这个属性一定不出现在 Binding Req 中,必须出现在 Binding Resp 中,而 RESPONSE-ADDRESS 属性可以出现在 Binding Req 中,一定不出现在其他类型的方法中。

        N/A 表示不,M 表示必须,O 表示可选,其他类型的属性以此类推。

RFC5389

Type名称说明
0x0020XOR-MAPPED-ADDRESS异或地址
0x8028FINGERPRINT 消息指纹

        RFC5389 的属性与 RFC3489 有些许不同,大部分 RFC3489 的属性在 RFC5389 中仍然能使用,此外 RFC5389 还扩展了一些属性,例如 XOR-MAPPED-ADDRESS 获取异或后的地址, FINGERPRINT 防止消息被篡改等,其他属性可查阅 RFC5389 文档,此处不过多介绍。

三. WebRTC对STUN协议的支持

        WebRTC 支持的 STUN 消息类型除了 RFC 规范提及的之外,还扩展了 GOOG Ping 的请求/响应消息。

Message Type含义
0x0001请求消息
0x0011指示消息
0x0101成功响应消息
0x0111错误响应消息
0x0200GOOG Ping 请求消息
0x0300GOOG Ping 响应消息
0x0310GOOG Ping 错误响应消息

        对于属性值,WebRTC 并没有支持 RFC 规范中提到的所有属性,支持的属性如下所示。

Type名称
0x0001MAPPED-ADDRESS
0x0006USERNAME
0x0008MESSAGE-INTEGRITY
0x0009ERROR-CODE
0x000aUNKNOWN-ATTRIBUTES
0x0014REALM
0x0015NONCE
0x0020XOR-MAPPED-ADDRESS
0x8022SOFTWARE
0x8023ALTERNATE-SERVER
0x8028FINGERPRINT
0x802FORIGIN
0xFF00RETRANSMIT-COUNT

四. STUN工作流程

1. 使用STUN获取NAT映射后的地址

        现实网络环境中大部分主机是处于 NAT 之后,即通过 ifconfig/ipconfig 查看到的是内网地址,主机访问外网时 NAT 设备会将其内网地址映射成公网地址,主机本身是无法查看某次访问外网地址 NAT 映射后的地址是多少的,但是通过 STUN 协议,主机发送 STUN binding request, 再由 STUN 服务器回复 STUN binding reponse 即可从属性拿到映射后的地址。

        webrtc.github.io 提供了一个获取服务器反射地址的页面工具,如下所示,输入 STUN 服务地址后,点击 Gather candidates 开始收集地址,type srflx 表示该地址候选项是服务器反射地址类型,即 NAT 映射后公网地址。type host 表示主机地址候选项,跟 ifconfig/ipconfig 查看到的内网地址是一样的。



        我们通过 Wireshark 抓包分析上述流程,可以看到我主机发送的是一个 RFC5389 的 STUN binding request 消息,没有携带任何属性,而 stun1.l.google.com STUN 服务器回复的是一个 RFC5389 标准的 STUN binding success reponse 消息,消息携带了一个 XOR-MAPPED-ADDRESS 属性值,属性值中包含了映射后的地址信息。

五. 参考资料

RFC 3489 - STUN - Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)

RFC 5389 - Session Traversal Utilities for NAT (STUN)

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

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

相关文章

华为数通HCIP-VPN技术-mpls vpn

VPN(虚拟专线网络 作用:实现广域互联(不同地域局域网之间跨越公网进行互通); MPLS VPN 设备角色: PE(运营商边界设备): CE:VPN用户企业的边界设备 P:运营商 VPN实例…

平均列顺序对列排斥能的影响

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,AB训练集各由5张二值化的图片组成,让A有6个1,B有4个1,并且让这10个1的位置没有重合。比较迭代次数的顺序。 其中有9组数据 差值结构 A-B 迭代次数 构造平均列 …

CentOS系统启动过程

CentOS系统启动流程图 (1) 加载 BIOS 计算机电源加电质检,首先加载基本输入输出系统(Basic Input Output System,BIOS),BIOS 中包含硬件 CPU、内存、硬盘等相关信息,包含设备启动顺序…

JMM概述

JMM指的是Java内存模型,它是一个抽象的概念,并不真实存在,定义了对数据访问的规则,每个JVM都必须执行这样的规则,这样使得并发程序运行在不同的JVM上时,运行的结果才是准确、安全的。JMM抽象出主内存和本地…

JSP 中的隐式对象预定义变量详解

JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。 JSP所支持的九大隐式对象: request对象 request对象是javax.servlet.http.HttpServletRequest 类的示例。每当客户端请求一个J…

1.Ansible

文章目录 Ansible概念作用特性总结 部署AnsibleAnsible模块commandshellcronusergroupcopyfilehostnamepingyumserice/systemdscriptmountarchiveunarchivereplacesetup inventory主机清单主机变量组变量组嵌套 Ansible 概念 Ansible是一个基于Python开发的配置管理和应用部署…

TCP网络通信编程之字符流

【案例1】 【题目描述】 【 注意事项】 (3条消息) 节点流和处理流 字符处理流BufferedReader、BufferedWriter,字节处理流-BufferedInputStream和BufferedOutputStream (代码均正确且可运行_Studying~的博客-CSDN博客 1。这里需要使用字符处理流,来将…

FPGA设计时序分析三、恢复/去除时间

目录 一、背景说明 二、工程设计 2.1 工程代码 2.2 综合结果 一、背景说明 ​恢复时间recovery和去除时间removal和setup、holdup类型,不同点是数据信号为控制信号,如复位,清零,使能信号,更多的是异步的复位信号&a…

Merge the squares! 2023牛客暑期多校训练营4-H

登录—专业IT笔试面试备考平台_牛客网 题目大意:有n*n个边长为1的小正方形摆放在边长为n的大正方形中,每次可以选择不超过50个正方形,将其合并为一个更大的正方形,求一种可行的操作使所有小正方形都被合并成一个n*n的大正方形 1…

硬件-8-操作系统的历史

操作系统的最强入门科普(Unix/Linux篇) 操作系统的发展史(DOS/Windows篇) Mac操作系统进化史 手机操作系统的沉浮往事(上) 手机操作系统的沉浮往事(下) 1 操作系统种类 我们天天都…

flex 弹性布局学习

一.Flex布局: Flex是Flexible Box 缩写“弹性布局”,用来为盒状模型提供最大得灵活性。 任何一个容器都可以指定为 Flex 布局。 .box{display: flex; } 行内元素也可以使用 Flex 布局。 .box{display: inline-flex; } Webkit 内核的浏览器,必须加上-webkit前缀。…

CAS中ABA问题

在线程1最后需要写入比较时,发现预估值与内存值都为1是相同的,就会误以为之前没有其他线程操作,其时之前线程2将1->2,又将2->1,称为ABA。 4.4.1解决方法 添加类的版本号,来避免ABA问题,如原来内存值…

代码随想录训练营day4

问题一: 面试题 02.07. 链表相交 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交: 输入 输出 intersectVal 8, list…

无涯教程-jQuery - Fold方法函数

Fold 效果可以与show/hide/toggle一起使用。这样可以像折叠纸一样折叠元素。 Fold - 语法 selector.hide|show|toggle( "fold", {arguments}, speed ); 这是所有参数的描述- horizFirst - 是否先水平折叠。可以是true或false。默认值为false。model - 效果…

数字光源控制器报警说明

Revision Sheet: Rev Data Author Description 1.0 20230729 Shuangyi 数字光源控制器报警说明 V1.0 一.报警说明 当我们所连接的光源负载超出光源控制器本身驱动能力的时候,我们会对控制器进行保护,从以下方式可知道过流的情况,如…

ScheduledThreadPoolExecutor 及 ThreadPoolExecutor的基本使用及说明

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览2.1 为什么不推荐使用Executors去创建线程池 三、…

C# 快速写入日志 不卡线程 生产者 消费者模式

有这样一种场景需求,就是某个方法,对耗时要求很高,但是又要记录日志到数据库便于分析,由于访问数据库基本都要几十毫秒,可在方法里写入BlockingCollection,由另外的线程写入数据库。 可以看到,在…

abp vnext4.3版本托管到iis同时支持http和https协议

在项目上本来一直使用的是http协议,后来因为安全和一些其他原因需要上https协议,如果发布项目之后想同时兼容http和https协议需要更改一下配置信息,下面一起看一下: 1.安装服务器证书 首先你需要先申请一张服务器证书,申请后将证书安装到服务器上(也可以在iis中选择服务器…

第27天-熔断,降级,限流,网关流控,服务链路追踪

1.熔断/降级/限流 1.1.简介 1.1.1.熔断 A服务调用B服务某个功能,由于网络不稳定问题,或者B服务卡机,导致功能时间超长。如果这样的次数太多,我们就可以直接将B服务断路(A不再请求B接口),凡是…

OJ练习第145题——并行课程 III

力扣链接:2050. 并行课程 III 题目描述 给你一个整数 n ,表示有 n 节课,课程编号从 1 到 n 。同时给你一个二维整数数组 relations ,其中 relations[j] [prevCoursej, nextCoursej] ,表示课程 prevCoursej 必须在课…