当前位置: 首页 > article >正文

NAT网络工作原理和NAT类型

NAT基本工作流程

通常情况下,某个局域网中,只有路由器的ip是公网的,局域网中的设备都是内网ip,内网ip不具备直接与外部应用通信的能力。

处于内网的设备如何借助NAT来实现访问外网的应用?

对于开启了NAT功能的局域网,其内部设备访问公网的流程大致是这样的:

  1. 内网设备向公网应用发起应用时,会在报文中携带目的ip+目的端口,同时也会带上自己的局域网ip+端口
  2. 设备的请求报文首先来到路由器,路由器开启了NAT功能
  3. 此时NAT程序会改写报文中源ip+源端口为当前路由器自己的ip+端口,同时将这组映射关系写到NAT映射表中,继续发送给公网设备
  4. 通过NAT映射表来记录这个映射关系,常规情况下,映射表是由设备局域网ip+局域网设备端口+路由器IP+路由器端口组成的
  5. 当外部应用的响应或请求来到路由器时,NAT程序会根据报文中的目的ip+目的端口,在映射表找到对应的局域网设备,将这个报文继续转发给局域网设备
  6. 一次完成的网络请求结束

在这里插入图片描述

NAT表的映射关系是由内网设备主动向公网设备发起请求而生成的。

公网设备无法主动访问内网设备,因此此时NAT表中不存在映射关系。

NAT打洞

在局域网中p2p设备同样是借助路由器的公网ip来完成数据传输的。

在p2p的通信模式下,每个peer需要知道对方peer的公网ip+端口,因此需要借助外部的服务来完成peer网络信息的交换,这个过程就是NAT打洞。

大致的流程:

  1. 每个peer向一个公共的服务器发送一个请求
  2. 服务器会记录下每个peer对应的公网ip,并把对方的公网ip发送给另一方
  3. 双方peer获取到对应的公网ip+端口,接下来进行p2p通信

在这里插入图片描述

NAT类型

现实情况中,NAT并没有理想中的简单,NAT的规则存在不同的差异,因此可以大致可以将NAT的类型分为四种

再强调一遍:

NAT表的映射关系是由内网设备主动向公网设备发起请求而生成的。

公网设备无法主动访问内网设备,因此此时NAT表中不存在映射关系。

完全圆锥形

在NAT表中,每个局域网ip+端口都映射一个公网IP+端口,

当由局域网设备发起的任何请求,不区分目的ip,都会经过同一个公网ip+端口改写,同样,当NAT收到外网的请求或响应时,只要是对应的端口,就转发给对应的局域网设备。

在这里插入图片描述

只要外网的请求或响应的目的端口是同一个,那么就会根据NAT映射表转发给对应的局域网设备

即一个局域网设备在NAT映射表中只有一条记录

受限圆锥形

受限圆锥形NAT也叫ip受限型NAT,在NAT表中,处理局域网ip+局域网端口+公网ip+公网端口外,还记录了一条目的ip

因此只有特定的外网ip的请求才能转发给内部局域网设备。

即一个局域网设备每次请求不同的目的ip,都会有一条映射关系在NAT表中

在这里插入图片描述

端口受限圆锥形

对于局域网设备的请求的目的ip+端口进行限制,即使同一个目的ip,但端口不一致,也会在NAT中存在一条映射关系。

在这里插入图片描述

只有外网设备特定的ip+特定的端口,才能将请求转发给局域网设备。

对称形NAT

前面三种类型的NAT,无论局域网设备的目的ip+目的端口如何变化,都会被映射为同一个的外网ip+外网端口。

但对于对称形NAT,一旦目的ip+目的端口发生变化,那么映射到的公网端口也是不同的。

在这里插入图片描述

在对称形NAT网络下,peer设备是无法打洞成功的,因为每次请求不同的ip+不同的端口,都会产生一个新的公网port,peer设备无法准确获取到对方的网络信息。


http://www.kler.cn/a/385605.html

相关文章:

  • k8s集群安装(kubeadm)
  • gdb编译教程(支持linux下X86和ARM架构)
  • Python多进程间通讯(包含共享内存方式)
  • 10款PDF合并工具的使用体验与推荐!!!
  • 28.医院管理系统(基于springboot和vue)
  • 【LeetCode】【算法】55. 跳跃游戏
  • Maven(27)如何使用Maven进行依赖管理?
  • 【Axure高保真原型】PDF阅读器
  • Redis - 集群(Cluster)
  • RK3288 android7.1 适配 ilitek i2c接口TP
  • FET113i-S核心板已支持RISC-V,打造国产化降本的更优解 -飞凌嵌入式
  • Go-HTTP框架设计实现概述
  • Redis6:短信登录
  • 【Mysql NDB Cluster 集群(CentOS 7)安装笔记一】
  • 高级java每日一道面试题-2024年10月31日-RabbitMQ篇-RabbitMQ中vhost的作用是什么?
  • CSS:基础选择器,文字控制属性(HTML)
  • docker快速安装与配置mongoDB
  • 小型的网站服务器该如何选择配置?
  • java常用技术总结
  • vue3中利用路由信息渲染菜单栏
  • 动手学深度学习9.8. 束搜索-笔记练习(PyTorch)
  • 图像手动标注-labelme+yolo格式导出
  • 开源模型应用落地-glm模型小试-glm-4-9b-chat-压力测试(六)
  • 自动化测试工具Ranorex Studio(二十六)-对象库设置对话框
  • Python实战:调用淘宝API以抓取商品页面数据
  • 易考八股文之docker常用命令