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

计算机网络:网络层 —— 网络地址转换 NAT

文章目录

    • 网络地址转换 NAT 概述
    • 最基本的 NAT 方法
      • NAT 转换表的作用
    • 网络地址与端口号转换 NAPT
    • NAT 和 NAPT 的缺陷

网络地址转换 NAT 概述

尽管因特网采用了无分类编址方法来减缓 IPv4 地址空间耗尽的速度,但由于因特网用户数量的急剧增长,特别是大量小型办公室和家庭网络接入因特网的需求不断增加,IPv4地址空间即将耗尽的危险仍然没有解除(实际上,因特网号码分配管理局 IANN 于 2011 年 2 月 3 日宣布,IPv4 地址已经分配完毕)。

网络地址转换(NetworkAddress Translation,NAT)技术于 1994 年被提出,用来缓解 IPv4 地址空间即将耗尽的问题。

NAT 能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源。

这种方法需要在专用网络连接到因特网的路由器上,安装 NAT 软件。装有 NAT 软件的路由器称为NAT路由器,它至少要有一个有效的外部全球地址 I P G IP_G IPG。所有使用内部专用地址的主机在和外部因特网通信时,都要在NAT路由器上将其内部专用地址转换成 I P G IP_G IPG

最基本的 NAT 方法

在这里插入图片描述

基本流程:

  1. 主机A 向 主机B 发起连接请求

    • 主机A 有一个专用地址 I P A IP_A IPA,它试图与具有全球地址 I P B IP_B IPB 的主机B建立连接。
    • 主机A 生成一个 IP 数据报,该数据报的源地址为 I P A IP_A IPA,目标地址为 I P B IP_B IPB
  2. NAT路由器修改源地址

    • 当IP数据报通过NAT路由器时,路由器将其源地址由 I P A IP_A IPA​ 修改为全局可访问的地址 I P G IP_G IPG

    • 修改后的IP数据报的源地址变为 I P G IP_G IPG,而目标地址仍然是 I P B IP_B IPB

  3. IP 数据报通过因特网到达 主机B:修改后的 IP 数据报通过因特网传递给主机B。

  4. 主机B 响应:主机B收到请求后,生成一个响应的IP数据报,源地址为 I P B IP_B IPB​,目标地址为 I P A IP_A IPA​。

  5. NAT路由器再次修改目标地址

    • 当响应的 IP 数据报返回并通过 NAT 路由器时,路由器将其目标地址由 I P A IP_A IPA​ 修改回 I P G IP_G IPG
    • 修改后的IP数据报的目标地址变为 I P G IP_G IPG,而源地址仍然是 I P B IP_B IPB
  6. IP 数据报返回至 主机A:修改后的 IP 数据报通过因特网返回至 主机A。

上述最基本的 NAT 方法有一个缺点:如果 NAT 路由器拥有 n(n比较小) 个全球 IP 地址,那么专用网内最多可以同时有 n 台主机接入因特网。若专用网内的主机数量大于 n,则需要轮流使用 NAT 路由器中数量较少的全球 IP 地址。

NAT 转换表的作用

  • NAT 路由器维护一张转换表,记录内网地址 I P A IP_A IPA​ 和外网地址 I P G IP_G IPG​ 的对应关系。
  • 当数据报通过 NAT 路由器时,路由器会查询此表来确定如何修改 源/目标地址

通过这种机制,NAT 允许多台拥有专用地址的计算机共享同一个全球可访问的 IP 地址,从而节省了公网 IP 资源,并且增加了内网的安全性,因为外部网络看不到内网的真实地址。

网络地址与端口号转换 NAPT

由于目前绝大多数基于 TCP/IP 协议栈的网络应用,都使用运输层的传输控制协议 TCP 或用户数据报协议 UDP,为了更加有效地利用NAT路由器中的全球 IP 地址,现在常将NAT转换和运输层端口号结合使用

这样就可以使内部专用网中使用专用地址的大量主机共用NAT路由器上的1个全球IP地址,因而可以同时与因特网中的不同主机进行通信。

NAT 和运输层端口号结合使用,称为网络地址与端口号转换(Network Address and Port Translation,NAPT

现在很多家用路由器将家中各种智能设备(手机、平板、笔记本电脑、台式电脑、物联网设备等)接入因特网,这种路由器实际上就是一个NAPT路由器,但往往并不运行路由选择协议。

主机A、主机B 向服务器发送 IP 数据报

![[网络地址与端口号转换1.png]]

  • 修改后的源端口号是由 NAPT 路由器动态分配的

  • 主机 B 与主机 A 选择的源端口号相同,这纯属巧合(端口号仅在本主机中才有意义)。特意这样举例,就是为了能更好地说明NAPT路由器还会对源端口号重新动态分配

  1. 设备A 和 设备B 分别尝试连接到 服务器C:

    • 设备A 的本地 IP 地址是 192.168.0.6,它尝试连接到 服务器C 的 IP 地址 218.75.230.30 上的端口 80。

    • 设备B 的 本地IP 地址是 192.168.0.9,也尝试连接到同一 服务器C 的相同端口80。

  2. NAPT 路由器修改源地址和源端口号:

    • 对于 设备A 的数据包,NAPT 路由器将其源地址从 192.168.0.6 修改为 113.218.175.235,并为其分配一个新的源端口号 50001

    • 对于 设备B 的数据包,NAPT 路由器同样将其源地址从 192.168.0.9 修改为 113.218.175.235,但为其分配不同的源端口号 50002

  3. 数据包通过因特网到达服务器C:修改后的数据包通过因特网传递给 服务器C。

![[网络地址与端口号转换2.png]]

  1. 服务器C 响应:服务器C 接收到请求后,生成响应的数据包,源地址为 218.75.230.30,目标地址为 113.218.175.235,目标端口号分别为 5000150002

  2. NAPT 路由器再次修改目标地址和目标端口号:当响应的数据包返回并通过 NAPT 路由器时,路由器会根据之前保存的映射表,将目标地址和目标端口号还原为各自的本地地址和端口号。

这样,NAPT 就完成了双向的地址和端口转换,使内网设备能够通过有限的公有IP地址访问互联网。

NAT 和 NAPT 的缺陷

尽管 NAT(和NAPT) 的出现在很大程度上缓解了 IPv4 地址资源紧张的局面,但 NAT(和NAPT) 对网络应用并不完全透明,会对某些网络应用产生影响

NAT(和NAPT) 的一个重要特点就是通信必须由专用网内部发起,因此拥有内部专用地址的主机不能直接充当因特网中的服务器

![[NAT和NAPT的缺陷.png]]

对于目前 P2P 这类需要外网主机主动与内网主机进行通信的网络应用,在通过 NAT 时会遇到问题,需要网络应用自身使用一些特殊的NAT穿透技术来解决。

相关文章:

计算机网络:网络层 —— 网络地址转换 NAT

文章目录 网络地址转换 NAT 概述最基本的 NAT 方法NAT 转换表的作用 网络地址与端口号转换 NAPTNAT 和 NAPT 的缺陷 网络地址转换 NAT 概述 尽管因特网采用了无分类编址方法来减缓 IPv4 地址空间耗尽的速度,但由于因特网用户数量的急剧增长,特别是大量小…...

【Pikachu靶场:XSS系列】xss之过滤,xss之htmlspecialchars,xss之herf输出,xss之js输出通关啦

一、xss之过滤 <svg onloadalert("过关啦")> 二、xss之htmlspecialchars javascript:alert(123) 原理&#xff1a;输入测试文本为herf的属性值和内容值&#xff0c;所以转换思路直接变为js代码OK了 三、xss之href输出 JavaScript:alert(假客套) 原理&#x…...

面向制造和装配的产品设计指南(二):面向装配的设计指南

参考引用 面向制造和装配的产品设计指南 1. 概述 1.1 装配的概念 装配是指把多个零件组装成产品&#xff0c;使得产品能够实现相应的功能并体现产品的质量&#xff0c;装配包含三层含义 把零件组装在一起实现相应的功能体现产品的质量 1.2 最好和最差的装配工序 1.3 面向装…...

Python中的PDF处理工具:PyPDF2和ReportLab使用指南

Python中的PDF处理工具&#xff1a;PyPDF2和ReportLab使用指南 在日常工作和项目中&#xff0c;PDF 文件处理是个常见需求&#xff0c;不论是合并报告、加密文档、填充表单&#xff0c;还是生成发票。Python 中有许多用于操作 PDF 文件的库&#xff0c;其中 PyPDF2 和 ReportL…...

【vxe-table】多选筛选项对列表的列进行动态的显示与隐藏

需求&#xff1a; 列表的组成部分由&#xff1a;一些固定的列&#xff0c;如:姓名&#xff0c;工号&#xff0c;以及 需要动态显示与隐藏的列&#xff0c;如&#xff1a;出勤、旷工、事假、病假等假勤类型 1、通过多选框多选&#xff0c;展示选中的列&#xff0c;未选中的不展示…...

微信小程序uniapp+vue飞机订票航空售票系统

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 对于小程序飞机订票信息管理所牵扯的信息管理及数据保存都是非常多的&#xff0c;举例像所有的管理员&#xff1b;管理员…...

如何取消Outlook中的循环会议

如何取消Outlook中的循环会议 参考链接&#xff1a;https://iknow.lenovo.com.cn/detail/195430 1、打开Outlook&#xff0c;进入 日历 视图界面&#xff1b; 2、 选择并双击要取消的循环会议&#xff1b; 3、 在 打开定期项目 对话框中选择整个序列&#xff0c;然后单击 确…...

Docker-- cgroups资源控制实战

上一篇&#xff1a;容器化和虚拟化 什么是cgroups&#xff1f; cgroups是Linux内核中的一项功能&#xff0c;最初由Google的工程师提出&#xff0c;后来被整合进Linux内核; 它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内&#xff0c;从而为系统…...

使用Python和Vosk库实现语音识别

使用Python和Vosk库实现语音识别 在人工智能和机器学习领域&#xff0c;语音识别技术正变得越来越重要。Python作为一种强大的编程语言&#xff0c;拥有丰富的库和框架&#xff0c;可以方便地实现语音识别功能。今天&#xff0c;我们将介绍如何使用Python中的SpeechRecognitio…...

stm32使用串口的轮询模式,实现数据的收发

------内容以b站博主keysking为原型&#xff0c;整理而来&#xff0c;用作个人学习记录。 首先在STM32CubeMX中配置 前期工作省略&#xff0c;只讲重点设置。 这里我配置的是USART2的模式。 会发现&#xff0c;PA2和PA3分别是TX与RX&#xff0c;在连接串口时需要TX对RX&…...

105. UE5 GAS RPG 搭建主菜单

在这一篇&#xff0c;我们将实现对打开游戏显示的主菜单进行搭建&#xff0c;主菜单将显示游戏主角&#xff0c;游戏名称和进入游戏和退出游戏两个按钮。 搭建菜单场景 我们将主菜单设置为一个单独的场景&#xff0c;前面可以显示对应的UI控件&#xff0c;用于玩家操作&#…...

基于 JAVASSM(Java + Spring + Spring MVC + MyBatis)框架开发一个医院挂号系统

基于 JAVASSM&#xff08;Java Spring Spring MVC MyBatis&#xff09;框架开发一个医院挂号系统是一个实用的项目。 步骤一&#xff1a;需求分析 明确系统需要实现的功能&#xff0c;比如&#xff1a; 用户注册和登录查看医生列表预约挂号查看预约记录取消预约管理员管…...

Golang | Leetcode Golang题解之第540题有序数组中的单一元素

题目&#xff1a; 题解&#xff1a; func singleNonDuplicate(nums []int) int {low, high : 0, len(nums)-1for low < high {mid : low (high-low)/2mid - mid & 1if nums[mid] nums[mid1] {low mid 2} else {high mid}}return nums[low] }...

影刀RPA实战:嵌入python,如虎添翼

1. 影刀RPA与Python的关系 影刀RPA与Python的关系可以从以下几个方面来理解&#xff1a; 技术互补&#xff1a;影刀RPA是一种自动化工具&#xff0c;它允许用户通过图形化界面创建自动化流程&#xff0c;而Python是一种编程语言&#xff0c;常用于编写自动化脚本。影刀RPA可以…...

es 数据清理delete_by_query

POST /索引名/_delete_by_query?conflictsproceed&scroll_size2000&wait_for_completionfalse&slices36 {"size": 2000, "query": {"bool": { "must": [{"terms": {"rule_id": [800007]}}]}} }slice…...

【每日 C/C++ 问题】

一、C 中类的三大特性是什么&#xff1f;请简要解释。 封装、继承、多态 封装&#xff1a;将事物的属性&#xff08;成员变量&#xff09;和行为&#xff08;成员函数&#xff09;封装在一起形成一个类。并且可以设置相应的访问权限&#xff08;私有的 受保护的 公有的&#…...

stm32学习4

学习目录 一.流水灯1.创建文件2.编写相关代码 一.流水灯 1.创建文件 将方法进行分类保存在不同的 .c 文件中&#xff0c;方便复用和寻找&#xff1b; 创建Hardware\LED文件&#xff0c;其中有led.c和led.h文件&#xff0c;用于存放有关LED灯操作的方法&#xff1b; 在User文…...

Midjourney国内直登

Midjourney确实是一个强大的AI绘画工具&#xff0c;能够根据用户输入的文本生成高质量的图像。然而&#xff0c;由于国内的网络限制&#xff0c;直接访问Midjourney可能会遇到障碍。 目前&#xff0c;已经有一些国内代理或中转平台可以帮助用户更方便地使用Midjourney&#xf…...

【双目视觉标定】——3面结构光相机标定实践(获取相机内参)~未完待续

相机标定基本原理及双目相机内参解析 相机标定是计算机视觉中的一个重要步骤&#xff0c;旨在确定相机的内部和外部参数&#xff0c;以便在图像处理中进行准确的三维重建、物体识别等任务。本文将重点讲解双目相机的内参和外参原理&#xff0c;并结合实际参数进行分析。 一、…...

Python常用脚本集锦

收集了一些常用Python脚本&#xff0c;作为平时练手使用&#xff0c;也可以作为自己的笔记&#xff0c;用到哪个功能可以自己查询一下即可。 文件和目录管理 复制文件 import shutil# 复制源文件到目标文件 shutil.copy(source.txt, destination.txt)移动文件 import shuti…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...