NAT网关和NAT穿越原理

2023-11-14

转自:https://blog.csdn.net/chance_yin/article/details/37913963


一、原理图

1、背景信息:

 (1)我们模拟的情形是位于网络A下的内网主机UserA 想要和位于网络B下的内网主机UserB进行点对点通信,刚开始的时候UserA和UserB都不知道对方的公网和内网IP地址及端口号,所以必须要再公网上搭建一个服务器C,服务器C主要的任务就是维护一张用户名到(主机的公网IP+端口号)的映射表,这样用户就可以从服务器C上获取UserB的公网IP和地址

 (2)UserA在局域网内发的IP包源地址是192.168.1.100:3000,该IP包经过路由器A后会被路由器A修改成能够在公网传输的公网IP地址和公网端口号:125.71.229.217:4001。UserB向公网发送报文路由器B也会对它做同样处理。


2、NAT穿越:

 STEP1:  假设UserA想要给UserB发送消息,那么UserA就会让服务器C通知UserB先进行打洞操作。

 STEP2: UserB收到打洞通知后,就发送IP包(目地址:125.71.229.217:4001,源地址:202.108.22.5:6002)给路由器A。路由器A收到该IP包后会查看源地址(202.108.22.5:6002),路由器发现局域网之前没有请求过该源地址,所以路由器会过滤掉此包。(这一步就相当于打了个洞)

STEP3: 现在到了最后UserA给UserB发送消息的一步,UserA通过路由器A发出IP数据包(目地址:202.108.22.5:6002,源地址:125.71.229.217:4001)给路由器B,同样路由器B要查看该IP包的源地址(125.71.229.217:4001),因为在STEP2中路由器B给路由器A发送过对此地址的请求(最后被丢掉的那个包),所以路由器B不会丢掉该包。接下来路由器B会读取IP包的目的地址202.108.22.5:6002,然后通过映射表转换成内网IP地址和端口号:192.168.1.100:3000,这样就可以发送报文给主机UserB了。


3、其他:

(1)对称路由器和非对称路由器

实际上上面的NAT穿越技术只适合锥形路由器(非对称路由器),说道这就要讲一下什么是对称路由器和非对称路由器了:

非对称路由器:将同一内网IP  (比如:192.168.1.100:3000) 访问不同外网地址比如百度和谷歌时映射成的公网IP和公网端口是相同的(比如都是:202.108.22.5:6002)。

反之,对称路由器就是:将同一内网IP(比如192.168.1.100:3000)访问不同网络地址比如百度和谷歌时映射成的公网IP和公网端口是不同的(比如访问百度时映射成:202.108.22.5:6002,访问谷歌时映射成:125.71.229.217:4001)


回到2中讲的NAT穿越技术,显然,UserA想给UserB发送消息,前提是:UserB 给UserA发送消息(打洞操作)和UserB给服务器C发送消息(注册自己的公网IP)用的公网IP地址和端口号是相同的。所以NAT穿越只适合非对称路由器。


(2)不能用TCP做NAT穿越,只能用UDP做NAT穿越。


因为:tcp是基于连接的通信,而路由器会把来自同一主机的同一端口号上的不同tcp连接映射成不同的公网端口号。反之,UDP不是基于连接的传输协议,所以使用UDP就可以将不同的网络请求映射成同一公网源地址和公网端口号。体现到实际编程中就是:同一文件描述符通过路由器可以映射成同一公网IP地址和端口号。不同文件描述符通过路由器要被映射成同一公网地址和不同的公网端口号。


UserA 和 服务器C通信(注册自己的公网IP)时,需要创建一个文件描述符 fd1;UserA  和 UserB通信时还要再创建一个描述符 fd2。 路由器对不同描述符做映射时,会把不同的描述符映射到不同的公网端口号上。

比如:UserA  的文件描述符fd1 绑定到了端口3000上,文件描述符 fd 通过端口复用也绑定到了端口3000上;但路由器在做映射时,会将这两个文件描述符代表的tcp连接映射成如下格式(eg:) 192.168.1.100:3000 <->202.108.22.5:6002;   192.168.1.100:3000 <-> 202.108.22.5:6003

使用UDP可以完成NAT穿越:

因为UserA 通过文件描述符fd1 和 服务器C通信,然后UserA可以继续用此fd1和UserB通信,这样路由器就会把同一内网地址上的同一端口号发出的请求映射成同一公网地址。
---------------------
作者:向浅
来源:CSDN
原文:https://blog.csdn.net/chance_yin/article/details/37913963
版权声明:本文为博主原创文章,转载请附上博文链接!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NAT网关和NAT穿越原理 的相关文章

  • BLE 和 Zigbee 肉眼读数(更新ing)

    BLE1M 画相位图 可以读出preamble 01010101 同步码 01101011 通过向下向上的轨迹来肉眼读 原理是需要看如何进行调制的 toolbox中是GMSK调制 所以反着推回去 就知道画相位图能直接肉眼读数了 同理Zigb
  • KNX协议入门

    KNX协议入门 转自 https wenku baidu com view 65b0a25a55270722182ef706 html 如有侵权 请联系qq 2453419889 我将立即删除 一 KNX技术简介 KNX通过一条总线将各个分
  • android中跨进程通讯的4种方式

    android中跨进程通讯的4种方式 转自 http www androidsdn com article show 137 由于android系统中应用程序之间不能共享内存 因此 在不同应用程序之间交互数据 跨进程通讯 就稍微麻烦一些 在
  • 拥塞控制域流量控制

    流量控制 也就是管理两端的流量 以免任一方向上因发送过块导致接收端溢出 或者因接收端处理太快而浪费时间的状态 具体包括 1 发送端的进程产生数据很慢 时不时的来个1字节数据 那么TCP就会1字节1字节的发送 效率很低 解决办法是建立一个时基
  • 电脑连接西门子S7-200CPU的步骤

    用电脑连接S7 200CPU非常简单 先给CPU供电 然后用PPI通信电缆连接PLC和电脑即可 1 给S7 200CPU供电 下图给出了两种给S7 200供电的方式 直流供电和交流供电 2 连接RS 232 PPI电缆 注意 可以用USB转
  • QTcpSocket 发送数据心得

    遇到不会用的函数前 最好还是看看手册QAQ 今天居然吃了这个大亏 先交代一下背景 在做TCP客户端的发送数据功能 要和服务器程序进行TCP IP通信 且根据通信协议要发送数组或者结构体 并且数组的每一个位都是有效数据位 因此不能像大多数人一
  • Deep learning-based CSI Feedback for Beamforming 1

    1 Abstract The potentials of massive multiple input multipleoutput MIMO are all based on the available instantaneous cha
  • RFID系统信号通信过程

    如图
  • 通信原理(一) 通信原理概述

    文章目录 0 通信系统 1 通信方式 单工 双工与半双工 并行传输与串行传输 2 性能指标 2 1 有效性指标 2 2 可靠性指标 3 码 3 1 码字 码元 码长 3 2 码的分类 4 抽样与抽样定理 4 1 理想抽样和实际抽样 4 2
  • JAVA socket编程实例

    转载文章 原作者无从考证 感谢作者的无私奉献 事实上网络编程简单的理解就是两台计算机相互通讯数据而已 对于程序员而言 去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了 Java SDK提供一些相对简单的Api来完成这些工作 Soc
  • 自协商功能原理及工作过程

    自协商原理 自协商是通过一种叫做快速连接脉冲 Fast Link Pulse 的信号实现的 简称FLP 自协商的双方通过FLP来交换数据 在具备自协商能力的端口没有Link的情况下 端口一直发送FLP 在FLP中包含着自己的连接能力信息 包
  • 如何在 NAT 后面实现 CORBA 客户端

    我有以下接口 interface Server void subscribe in Client client interface Client void ping void pong 初始化时 客户端将连接到服务器并调用 subscrib
  • 防火墙后面的 WCF 服务 – 如何设置端口转发?

    我刚刚开始接触 WCF 编程 我在我的工作计算机上设置了一个自托管测试 Web 服务 该计算机位于防火墙后面 它在http localhost 8000 MyTestService 我可以通过浏览器访问服务页面 一切正常 现在我想从位于不同
  • NAT 后面的 UDP 打洞

    我正在尝试用 Java 实现 UDP Holepunching 的简单草图来测试它的概念 并稍后在我的 C C 应用程序中使用它 Concept 根据维基百科 我对这个概念的理解是这样的 假设 A 和 B 是未定义网络结构后面的客户端 C
  • UDP/TCP 打洞 vs UPnP vs STUN vs?

    我尝试制作一个 P2P 程序 需要帮助来穿越客户端的 NAT 我在 stackoverflow 上读过很多问题 但我从来不知道通过 NAT 的所有方法的缺点和优点是什么 有多少路由器支持哪些方法 大公司常用哪些方法 BitTorrent T
  • NAT 后面的 HTTP 服务器

    我正在尝试在多层 NAT 后面创建一个 apache 服务器 以便可以从 Internet 访问 限制 避免中继 有一个公共服务器 我们称他为OldMan 用于登录 眩晕 但其带宽太差 无法承载中继数据 我无权手动配置 NAT 3 用户无需
  • 使用 ECS 时保护来自 EC2 实例的出站流量规则

    即使我在私有子网中创建 EC2 实例 如果我想将它们注册到 ECS 集群 它们也必须能够将流量发送到 Internet 我正在使用 NAT 网关来执行此操作 但我仍然感到不安全 因为实例可以在被接管时将私人信息发送到任何地方 我可以用于实例
  • TCP打孔(NAT穿越)库什么的?

    我想用 C 进行 TCP 打洞 NAT 穿越 如果需要 可以使用集合服务器来完成 我发现http sharpstunt codeplex com http sharpstunt codeplex com 但无法让它发挥作用 理想情况下 我需
  • NAT 穿越和 IPv6

    我很好奇一旦 IPv6 的部署和使用增加 NAT 和 NAT 穿越机制的用处 我们有很多 NAT 遍历机制 包括专有的 主要用于某种住宅或企业 NAT 背后的 IPv4 设备 客户端 鉴于 NAT 的出现是因为 IPv4 缺乏可用地址 那么
  • 使用 STUN 打孔

    我目前正在尝试通过 Internet 发送 UDP 消息 并且必须为端点 A 和 B 都位于 NAT 后面 设置防火墙 为此 我想使用 STUN 服务器进行打孔 当 A 创建对 STUN 服务器的请求 例如 私有 85 1 1 12 600

随机推荐

  • java中的集合基础

    集合介绍 集合类的特点 提供一种存储空间可变的存储模型 存储的数据容量可以发生改变 集合和数组的区别 共同点 都是存储数据的容器 不同点 数组的容量是固定的 集合的容量是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型
  • 【Android进阶篇】WebView显示网页详解

    概述 WebView是Android用于显示网页的控件 通过WebView 我们可以查看本地的网页 也可以查看网络资源 本文内容如下 一 加载本地网页 二 加载网络资源 三 在WebView中使用JavaScript和CSS 四 WebCh
  • 多线程案例(1) - 单例模式

    目录 单例模式 饿汉模式 懒汉模式 前言 多线程中有许多非常经典的设计模式 这就类似于围棋的棋谱 这是用来解决我们在开发中遇到很多 经典场景 简单来说 设计模式就是一份模板 可以套用 单例模式 顾名思义 就是一个程序只能含有一个实例 有的场
  • Permission denied

    Permission denied 出现的原因的是 没有权限进行读 写 创建文件 删除文件等操作 解决方法 输入命令 sudo chmod R 777 工作目录 例如 sudo chmode R 777 home HDD 此时就可以在该路径
  • poium测试库介绍

    poium测试库前身为selenium page objects测试库 我在以前的文章中也有介绍过 这可能是最简单的Page Object库 项目的核心是基于Page Objects实现元素定位的封装 该项目由我个人在维护 目前在公司项目中
  • 使用ChatGPT的方式与在其他地方使用它的方式基本相同。以下是一些步骤:

    在中国使用ChatGPT的方式与在其他地方使用它的方式基本相同 以下是一些步骤 访问OpenAI的官方网站 OpenAI 在网站上找到GPT 3或ChatGPT的相关信息 OpenAI提供了详细的API文档 可以帮助你理解如何使用它们 你需
  • mysql数据库之跨表复制

    背景说明 目标库 target db 目标数据表 target tb 将目标库的制定表复制到当前数据库中 包括一下几个方面 一 表结构复制 仅仅复制了表的结构 没有数据 create table current db new tb like
  • Logitech G系鼠标脚本编程,实现鼠标自动定位控制

    利用罗技官方提供的API来写一个鼠标自动定位移动脚本 点击脚本编辑器中的帮助选项 查看罗技官方提供的API说明 有很多实现好的鼠标功能 G series Lua API V8 45 Overview and Reference 下面是我写的
  • 深入解析SpringBoot启动原理

    1 启动类中的SpringApplication run方法会创建一个SpringApplication的实例 并做一些初始化工作 SpringBootApplication Slf4j public class HuotuUserServ
  • Linux C编程基础:获取时间

    1 前言 对于linux下的编程 无论是用户态还是内核态 时间获取都是经常需要使用到的 以下分别从用户态和内核态整理了几个常用的时间获取接口 供编写代码时快速查阅 linux时间子系统的发展历史及详细介绍 可以参考 深入理解Linux时间子
  • stm32 机械周期_STM32定时器周期计算

    STM32定时器周期计算 公式是 1 TIM Prescaler 时钟 1 TIM Period F103配置生成1ms的时钟 1 35 36M 1 999 1MS TIM TimeBaseInitTypeDef TIM TimeBaseS
  • LeNet-5识别数字

    LeNet识别数字 前言 环境 实现 结果 前言 实现经典卷积神经网络LeNet LeNet 5 识别数字 这里将激活函数从sigmoid换成ReLU 参考资料 动手学深度学习 环境 python pytorch 实现 import tor
  • 设计模式八大原则知多少

    设计模式是一种通用的解决问题的经验 可以帮助我们设计出可重用 可维护和可扩展的软件 在设计模式中 有八个常见的原则 它们是 单一职责原则 SRP Single Responsibility Principle 一个类应该只有一个引起变化的原
  • AlexNet(深度学习模型)详解

    AlexNet是一种深度卷积神经网络 由Alex Krizhevsky Ilya Sutskever和Geoffrey Hinton于2012年在ImageNet图像分类竞赛中首次引入 这项竞赛是一个庞大的数据集 其中包含超过100万张图像
  • TP5学习(十三):其他

    一 缓存 设置 缓存支持采用驱动方式 所以缓存在使用之前 需要进行连接操作 也就是缓存初始化操作 options 缓存类型为File type gt File 缓存有效期为永久有效 expire gt 0 缓存前缀 prefix gt th
  • 快速排序和快速选择

    用同样的划分 完成不同的目的 快速排序在 的平均时间复杂度完成排序 快速选择在 的平均时间复杂度找出第 k 大的元素 因为 quickSelect 只需要对划分的其中一边递归 int partition int a int l int r
  • 如何在visio2010的框图中插入公式?

    如何在visio2010的框图中插入公式 其实很简单 也没必要下载Mathtype 先在world中用自带的公式编辑器将公式写好 如下图 此时选中公式 博文已经迁移到个人主页https guangmujun cn archives 143
  • SpringAOP+自定义注解模拟shiro框架实现

    一 概念 权限管理就是管理用户对于资源的操作 本 CRM 系统的权限 也称作资源 是基于角色操作权限来实现的 即RBAC Role Based Access Control 基于角色的访问控制 就是用户通过角色与权限进行关联 简单地说 一个
  • iOSWebview与js交互之调整字体大小

    先看效果图 iOS开发经常会跟Webview交互 主要调用的就是stringByEvaluatingJavaScriptFromString这个方法 也可以在 BOOL webView UIWebView webView shouldSta
  • NAT网关和NAT穿越原理

    转自 https blog csdn net chance yin article details 37913963 一 原理图 1 背景信息 1 我们模拟的情形是位于网络A下的内网主机UserA 想要和位于网络B下的内网主机UserB进行