NAT类型发现

news/2024/7/7 14:21:24/文章来源:https://www.cnblogs.com/bluntwu2022/p/18277639

一、前言

之前一篇文章中,提出了一个判断NAT类型的方案。该方案是自己研究设计的,比较粗糙。近期研读了关于STUN的一些协议标准,其中RFC3489中就包含了判断NAT类型的标准方案。

与自己设计的方案相比,标准方案有以下优点:

1,利用了STUN协议中定义的一些属性,如CHANGE-REQUEST/MAPPED-ADDRESS/RESPONSE-ADDRESS/CHANGED-ADDRESS等;

2,使用单台服务器就可以完成(需要服务器上至少配置2个IP地址);

3,步骤更精简;

注意:RFC3489已被RFC5389废弃,且RFC5389也已被RFC8489废弃。在最新的STUN协议标准中,上面提到的属性都已被废弃。

下面介绍一下RFC3489中的NAT类型发现方案。

二、名词解释

首先介绍一下方案中用到的STUN协议中的一些属性。

CHANGE-REQUEST

此属性被客户端使用,请求服务器在发送响应时,使用不同的源IP地址或端口(与客户端请求的目的IP地址和端口不同)。此属性包含2个标志位:

“change IP”:指示服务器更换源IP

“change port”:指示服务器更换源端口

MAPPED-ADDRESS

此属性被包含在服务器的响应中,内容是服务器看到的客户端的源IP和端口信息(经过NAT映射后的)。

RESPONSE-ADDRESS

此属性由客户端使用,指示服务器应该将响应发往哪里。其内容包含地址和端口。

CHANGED-ADDRESS

此属性被包含在服务器的响应中,内容是IP地址和端口。其含义是若客户端在CHANGE-REQUEST中指定了任意的标志位后,服务器的响应将要使用的源IP和端口。

无论客户端是否设置了这些标志位,此属性总是被包含在响应中。

三、NAT类型发现流程

客户端执行3种测试来发现NAT类型。

测试I:

客户端发送一个请求给服务器。此请求中不设置CHANGE-REQUEST中的任何标志位,也不携带RESPONSE-ADDRESS属性。

测试II:

客户端发送一个请求给服务器。此请求中同时设置CHANGE-REQUEST中的两个标志位。

测试III:

客户端发送一个请求给服务器。此请求中设置CHANGE-REQUEST中的“change port”标志位。

客户端首先执行测试I

有以下几种情况:

1,没有收到响应;则客户端会立即知道它无法发起UDP连接;

2,收到响应,客户端检查MAPPED-ADDRESS属性;

  (1) 若属性中的地址和端口与发送请求时使用的一致,则客户端知道自己不在NAT之后。继续执行测试II

    ① 若收到响应,则客户端知道它可以访问互联网(或者,至少客户端位于行为类似完全锥形NAT的防火墙之后,且没有地址转换)。

    ② 若未收到响应,则客户端知道它位于对称UDP防火墙之后。

    上述2种情况,都可以认定客户端位于公网上。

  (2) 若不一致,则客户端知道它位于NAT之后。继续执行测试II。

    ① 若收到响应,则客户端知道它位于完全锥形NAT之后。------测试II中,服务器使用不同的源IP地址和端口进行响应,若能收到,则表面是完全锥形NAT,这种NAT不检查下行报文的源IP和端口。

    ② 若未收到响应,则客户端重复执行测试I,但使用不同的目的IP地址和端口(这些信息可以从首次执行测试I的响应中获取,包含在CHANGED-ADDRESS属性中)

      1) 若此次响应中包含的MAPPED-ADDRESS属性中的IP地址和端口和第一次时不一致,则客户端知道它位于对称NAT之后。

      2) 若两次结果一致,则客户端位于限制锥形NAT或端口限制锥形NAT之后。为了确定是哪一种NAT,需要执行测试III。

        执行测试III后,若收到响应,则客户端位于限制锥形NAT之后。

        执行测试III后,若未收到响应,则客户端位于端口限制锥形NAT之后。

上述过程的流程图总结如下:

IMG_256

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全网最适合入门的面向对象编程教程:06 类和对象的Python实现-自定义类的数据封装

本文我们主要介绍了数据封装的基本概念和特性,如何设置自定义类的私有属性和私有方法,protect属性的概念和特点。全网最适合入门的面向对象编程教程:06 类和对象的 Python 实现-自定义类的数据封装 摘要: 本文我们主要介绍了数据封装的基本概念和特性,如何设置自定义类的私…

MOS管

MOS管 MOS 管是金属-氧化物半导体场效应晶体管的缩写,是一种重要的半导体器件。它具有以下特点和应用:特点:高输入阻抗:MOS 管的输入阻抗很高,可以减少对前级电路的影响。 开关速度快:MOS 管的导通和截止速度很快,适用于高频电路。 噪声低:MOS 管的噪声较低,适用于对噪…

三极管的作用和原理

目录 目录三极管的类型、作用和工作原理三极管的作用NPN三极管结构和工作原理:PNP三极管结构和工作原理:区别和应用场景三极管的类型、作用和工作原理三极管是一种重要的半导体器件,主要有两种类型:NPN和PNP。它们在结构、工作原理和应用上有显著的区别。三极管的作用 三极…

【Oracle】匹配一个字符中是否存在空格以及回车

【Oracle】匹配一个字符中是否存在空格以及回车 使用REGEXP_LIKE,然后使用[[:space:]] [[:space:]] 是一个 POSIX 字符类,匹配任何空白字符,包括空格、制表符、回车和换行 例子如下 SELECT R1, R2 FROM dual WHERE REGEXP_LIKE(R1, R2, [[:space:]]);您能读到这儿,我呢是发…

[淘宝/天猫/1688/京东]API接口数据采集分享

主流电商平台大数据采集API接口。在当今时代,从数据中挖掘价值的重要性愈发凸显,远超以往任何时期。现代企业渴望在任意设备上,无论身处何地,都能实时获取最新的相关信息。这正是数字化转型的核心所在,它同样适用于供应链的每一个环节。在当今时代,从数据中挖掘价值的重要…

@RequestMapping中的name属性解释

在Spring MVC中,@RequestMapping注解用于映射web请求到特定的处理方法。这个注解有多个属性,其中之一就是name。name属性通常用于为映射提供一个名称,这个名称可以在日志、文档或其他需要引用这个映射的地方使用。 在Spring MVC的上下文中,这允许你为特定的@RequestMapping…

6种Win10关闭自动更新方法介绍!

Win10自动更新 想寻找Win10关闭自动更新方法?Windows 10自动更新功能旨在确保您的系统始终运行最新的安全补丁和功能更新。然而,对于某些用户来说,频繁的更新可能带来不便。有时选择拒绝更新,系统会一直不停的提示系统更新;选择更新了,更新后一些软件或网络打印机等相关设…

【动画进阶】类 ChatGpt 多行文本打字效果

今天我们来学习一个有意思的多行文本输入打字效果,像是这样:这个效果其实本身并非特别困难,实现的方式也很多,在本文中,我们更多的会聚焦于整个多行打字效果最后的动态光标的实现。 也就是如何在文本不断变长,在不确定行数的情况下,让文字的最末行右侧处,一直有一个不断…

解决卡顿发热,超帧技术焕发中重载游戏动力

近几年,中国手游市场规模不断扩大,开发者通过在画面、玩法等方面的持续创新和打磨,推出更加精品化的产品。然而愈发精美的画质和复杂的玩法,也给硬件带来超高的负载,导致玩家在游戏过程中,频繁出现掉帧卡顿、发烫、续航差等体验降低的现象。HarmonyOS SDK 图形加速服务(…

ArchiMate 3 学习

目录ArchiMate 3 学习什么是ArchiMateArchiMate 3.1 规范关系动机元素策略元素业务层应用层技术层物理元素实施和迁移元素复合元素 ArchiMate 3 学习 ArchiMate 3 中文版 什么是ArchiMate ArchiMate 是 The Open Group 为企业架构提供的开放和独立的建模语言,由不同的工具供应…

如何找到并快速上手一个开源项目

以前有写过两篇文章来简单聊过如何做开源的事情,最近我自己组了一个社区里面也有不少朋友对开源感兴趣,于是我便根据自己的经验系统的梳理了一些关于开源的事情。新手如何快速参与开源项目 手把手教你为开源项目贡献代码有兴趣的可以先看看之前这两篇。🔎如何找到自己感兴趣…

WPF在.NET9中的重大更新:Windows 11 主题

WPF在.NET9中的重大更新:Windows 11 主题在2023年的2月20日,在WPF的讨论区,WPF团队对路线的优先级发起了一次讨论。对三个事项发起了投票。 第一个是Windows 11 主题第二个是更新的控件第三个是可空性注释最终Windows 11 主题得票最高,WPF团队2023-2024的工作优先级就是Win…

配置 Swagger + 注释

打开Xml文件生成,右键项目进入属性设置: 取消未进行注释而进行提示的警告: 然后Program.cs增加代码: 代码:builder.Services.AddSwaggerGen(s => {//获取xml文件名称var xmlFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";//包含注释,…

C#winform如何在窗体实现视频播放

1.在Form窗体设计中的左侧工具箱列表中右击鼠标,单击选择项。2.在弹出的对话框中点击COM组件,选择Windows Media Player,点击确定3.接着在工具箱选择Windows Media Player控件,将控件添加到窗体中,并且添加一个OpenFileDialog控件4.接着在工具箱的对话框中将OpenFileDialog…

AI引导学习前端开发

假设你是一位前端技术开发专家,我有几个JavaScript的问题想向你咨询 我想用JavaScript来做微信小程序开发,请以表格的方式输出知识要点 请叙述JavaScript操作浏览器对象的常用接口和方法 把上述表格按照访问对象归类 将上述文字制作一个表格来呈现,要求逻辑清晰描述信息简明…

Codeforces Round 894 (Div. 3) A-E cd 894 div3

A. Gift Carpet 每道题都是伸缩代码框有ac代码请不要漏掉 --------------------------题解----------------------------- 按先行便然后列再变循环 设置jud每满足一个条件就让jud++ 只有jud==相应值的时候才让其++点击查看代码 #include<bits/stdc++.h> using namespace …

网络隔离后 用这种安全U盘可实现数据安全传输

在网络隔离的环境下,尤其是物理隔离环境下,使用安全U盘进行数据传输可以被视为一种安全的方法。不过前提是要确保以下几点: 1、来源可信性:确保U盘的来源是可信的,没有被感染或篡改过的风险。最好使用自己的U盘,或者来自于安全可靠的来源。 2、扫描病毒:在使用U盘之前,…

AI引到学习前端开发

假设你是一位前端技术开发专家,我有几个JavaScript的问题想向你咨询 我想用JavaScript来做微信小程序开发,请以表格的方式输出知识要点 请叙述JavaScript操作浏览器对象的常用接口和方法 把上述表格按照访问对象归类 将上述文字制作一个表格来呈现,要求逻辑清晰描述信息简明…

U-KAN环境搭建推理测试

​引子 U-Net的鼎鼎大名,我觉得无需我多言了。图像分割和扩散概率模型的基石。作者探索了KANs在改进视觉任务 Backbone 网络方面的未开发潜力。作者研究、修改并重新设计已建立的U-Net Pipeline ,通过在标记化的中间表示上整合专用的KAN层,称之为U-KAN。严格的医学图像分割基…