哈工大计算机网络课程网络层协议详解之:网络地址转换NAT

哈工大计算机网络课程网络层协议详解之:网络地址转换NAT

文章目录

  • 哈工大计算机网络课程网络层协议详解之:网络地址转换NAT
    • 网络地址转换(NAT)
    • NAT实现原理
    • NAT穿透问题
    • NAT穿透问题的解决方案

上一节中,我们在DHCP协议中介绍了主机如何配置自己的IP地址,可以通过手动静态配置的方式,或者是利用DHCP协议动态配置的方式。在本节中,我们继续深入探究另一个问题,即:IP地址从哪里来? DHCP协议中我们知道了主机如何配置自己的IP地址,但是这个DHCP服务器返回的IP地址从哪里来?

实际上,是从我们子网对应的ISP(Internet Service Provider)互联网服务提供商,也就是移动、联通、电信这些运营商中来的。

但是这些运营商的IP地址又从哪儿来呢?最终,层层向上追溯来看,IP地址会通过一个国际组织:ICANN(The Internet Corporation for Assigned Names and Numbers)来进行分配。

百度百科

ICANN(The Internet Corporation for Assigned Names and Numbers)互联网名称与数字地址分配机构是一个非营利性的国际组织,成立于1998年10月,是一个集合了全球网络界商业、技术及学术各领域专家的非营利性国际组织,负责在全球范围内对互联网唯一标识符系统及其安全稳定的运营进行协调,包括互联网协议(IP)地址的空间分配、协议标识符的指派、通用顶级域名(gTLD)以及国家和地区顶级域名(ccTLD)系统的管理、以及根服务器系统的管理。这些服务最初是在美国政府合同下由互联网号码分配当局(Internet Assigned Numbers Authority,IANA)以及其它一些组织提供。ICANN行使IANA的职能。

遗憾的是,随着近些年互联网的急速发展,对于IPv4的32位地址空间来说,可用于公共互联网的地址已经几乎分配殆尽了。此时,在我们实际的网络通信中,经常会有一些主机所使用的地址是私有地址,这些私有地址在通信过程中,是不能在公共互联网出现的。要保证这些私有地址能够在公共互联网中出现并被识别,就需要一些特殊的协议来支持,这里最典型的协议就是NAT(Network Address Translation)网络地址转换。

网络地址转换(NAT)

假设有下面一个网络结构,左侧是公共互联网Internet,右侧是一个本地网络,比如家庭网络,使用的是10.0.0/24,使用的是一个私有地址,这些主机要在公共互联网上通信的时候就必须要求路由器在将数据报转发到公共网络之前,进行地址转换。

作为这个路由器首先必须具备地址转换的功能,同时必须拥有至少一个公共IP地址(也就是俗称的合法IP地址),这样才能将私有地址进行转换成该公共IP地址。

有了地址转换功能后,此时所有离开本地网络的数据报的源IP地址都会替换成相同的NAT IP地址,也就是图中的路由器公共IP地址:138.76.29.7。

但是,如果所有的数据报都换成同一个源IP地址后,上层应用比如传输层,就无法区分这些请求究竟来源于具体哪一台主机。同时,数据报返回时,该路由器也无法识别应该返回给哪一台主机。此时就需要借助于TCP/IP协议传输时,携带的源端口号和目的端口号来区分。利用端口号记录每次转换时的对应关系,进而根据返回数据报的端口,还原出源主机地址信息。

在这里插入图片描述

NAT协议提供的动机:

  1. 只需/能从ISP申请一个IP地址。比如一个本地网络只需要分配一个公共IP地址,其余的私有地址可以内部进行分配,并支持网络内部的通信。此时一个公共IP可以对应若干个主机,而原先的方式一个公共IP只能对应一个主机。

    因为IPv4地址逐渐耗尽,需要利用这种方法,减少公共IP地址的分配和浪费。

  2. 本地网络设备IP地址的变更,无需通告外界网络。

    因为内部都是私有内置,对外只有一个公共IP地址,内部网络设备IP地址的变更,无需通告外界。

  3. 变更ISP时,无需修改内部网络设备IP地址。

    比如原先本地网络的ISP是借助于联通接入,后来更换成移动。此时只需要变更ISP提供的公网地址,而不用修改本地网络设备的IP地址。

  4. 内部网络设备对外界网络不可见,即不可直接寻址(安全)。

NAT实现原理

目前NAT实现最典型的方式是一次替换,一次记录,再一次替换来完成的。

  • 第一次替换:把要离开内部网络去到公共网路的数据报(源IP地址,源端口号),利用NAT地址转换替换成外出IP数据报(NAT IP地址,新端口号)。
  • 记录:将每对(NAT IP地址,新端口号)与(源IP地址,源端口号)的替换信息存储到NAT转换表中。
  • 第二次替换:根据上述记录的NAT转换表,利用(源IP地址,源端口号)替换每个进入内网IP数据报的(目的IP地址,目的端口号),即(NAT IP地址,新端口号)。实际上就是把替换成的公共IP地址和端口号,还原成本地网络中的IP地址和源端口,从而被内网的主机进行接收。

示例性过程如下图所示:

在这里插入图片描述

  • 路由器的公共IP地址为138.76.29.7,并包含NAT转换表来记录私有地址—>公网地址的转换记录。
  • 假设此时内网中的主机10.0.0.1,端口号为3345的应用进程,要与公网的主机128.119.40.186,端口号为80的应用进程通信,发送数据报。
  • 数据报到达路由器后,会进行一次替换,将源IP地址,替换成路由器公网IP地址,因此出口IP变成:128.119.40.186,新的源端口号更新为5001。
  • 记录本次NAT转换,WAN端地址为138.75.29.7,端口号5001。LAN端地址为10.0.0.1,端口号3345。
  • 目的主机应用进程返回响应报文,到达路由器后,数据报的目的IP地址就是该路由器的公网IP地址:138.76.29.7,端口号5001
  • 路由器检索NAT转换表,进行第二次替换,将该目的地址转换成内部网络的主机IP地址与端口号,即重新转换成:10.0.0.1,端口号334
  • 最后,根据转换后的目的IP地址和端口号,向内网的目的主机上转发。

在NAT的地址转换中,需要根据端口号来区分私有网络中不同主机应用进程的请求,而端口号是16bit,表示的范围在0~65535之间。因此,一个公共IP地址可以对应区分的端口号为65536个,相当于可以同时支持60000多并行连接。

NAT主要争议:

  • NAT目前主要嵌入到路由器中来实现,而路由器作为标准第三层设备,实现的应该是第三层的功能,而不应该把第三层中的IP数据段中的内容还拿出来进行修改,违背了网络层次关系。
  • 违背了端到端通信原则。我们知道端口号是传输层持有的,传输层是端到端的通信。既然是端到端的通信,那么通信链路中的路由器等网络设备,都不应该对其进行修改。
  • 地址匮乏问题不应该由NAT来解决,应该由下一代IP地址 IPv6来解决。

尽管NAT的引入带了了一些问题和争议,但不可否认的是,NAT技术的出现很好的解决了IPv4地址溃泛等问题,是一项值得肯定的技术。

NAT穿透问题

假设内部网络运行着一个服务器,IP地址为10.0.0.1,而外部网络希望访问这个服务器的话,该怎么做呢?

显然,外部网络的用户是无法直接通过私有IP地址10.0.0.1来访问的。对于外部用户,所能看到访问的,是NAT路由器的公共IPi地址:138.76.29.7。

此时,为了让外部用户能够访问私有网络的主机,就需要进行NAT穿透,相当于穿透NAT,访问NAT路由器后面连接的私有网络。

在这里插入图片描述

NAT穿透问题的解决方案

方案一:静态配置NAT,将特定端口的连接请求转发给服务器。

该方案利用NAT路由器的NAT转换表,配置特定的端口号,将该特定的端口号映射为私有网络服务器的IP地址。此时,外部网络客户端的请求携带上该特定目的端口,就可以利用NAT转换表,转换成访问私有网络服务器的请求,实现NAT穿透。

e.g. 配置特定端口号2500,记录转发表的映射关系:(138.76.29.7, 2500) -> (10.0.0.1, 25000)。

方案二:利用UPnP(Universal Plug and Play)互联网网关设备协议(IGD-Internet Gateway Device)自动配置:

这种方案是方案一中实现的目的是一样的,最终都是在NAT转换表中记录到私有网络主机IP地址的转换关系,只是实现的技术不同。

作为NAT路由器,要支持UPnP协议,这个协议使得内部的主机可以自动地获取到NAT公共IP地址,并且通过这个协议,可以实现在NAT转换表中添加/删除端口映射。

完成这样的转发表配置后,内部网络服务器提供的服务就可以借助公共IP地址和端口号,向外发布它所提供的服务,并注册在NAT转发表中。这样外部网络的请求就可以借助NAT地址转换,利用注册端口号转发到对应内部网络的主机中,实现NAT穿透。

在这里插入图片描述

方案三:中继(如Skype)

NAT内部的客户与中继服务器建立连接。

外部客户也与中继服务器建立连接。

由中继服务器实现外部客户请求的转发到内部客户。中继服务器桥接两个连接的分组。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【人脸检测——基于机器学习4】HOG特征

前言 HOG特征的全称是Histograms of Oriented Gradients,基于HOG特征的人脸识别算法主要包括HOG特征提取和目标检测,该算法的流程图如下图所示。本文主要讲HOG特征提取。 HOG特征的组成 Cell:将一幅图片划分为若干个cell(如上图绿色框所示),每个cell为8*8像素 Block:选…

【力扣刷题 | 第十四天】

目录 前言: 7. 整数反转 - 力扣(LeetCode) 面试题 16.05. 阶乘尾数 - 力扣(LeetCode) 总结; 前言: 今天仍然是无固定类型刷题, 7. 整数反转 - 力扣(LeetCode) 给你…

Android大图加载优化方案,避免程序OOM

我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如微博长图,海报等等。所以我们就要对图片进行局部显示。 大图加载基本需求…

Redis入门(5)-set

Redis中set的元素具有无序性与不可重复性 1.sadd key member[member] 添加元素,若元素存在返回0若不存在则添加 sadd DB mysql oracle sadd DB mysql sadd DB db22.smembers key 查看set中所有元素 smembers DB3.sismember key member 判断元素在set中是否存…

GIS 功能模块实现

文章目录 1. GIS 模块流程图2. 网页端地图缓存的实现3. GIS 图形操作功能实现1 )地图漫游2 )对象删除3 )选择复制属性查看 GIS 基本功能模块主要是在表现层开发的,是在OpenLayers 开发框架提供的接口上,通过Geo Server…

智芯MCU软件开发环境搭建

智芯MCU软件开发环境搭建 目录 智芯MCU软件开发环境搭建前言1 软件安装2 编译环境3 烧录环境4 新建工程结束语 前言 智芯科技的MCU主要应用于汽车行业,属于车规级的MCU,目前上市的MCU型号较少,相关资料也不多,所以这里出一期开发…

uniapp实现tab切换可以滚动的效果

实现效果 当 tab 切换的内容很多时,需要用到滚动,希望在点击 tab 的时候可以自动滑动到对应的tab下 知识点 scrollIntoView:该scrollIntoView()方法将调用它的元素滚动到浏览器窗口的可见区域。 语法 element.scrollIntoView&#xff08…

【kubernetes】部署controller-manager与kube-scheduler

前言:二进制部署kubernetes集群在企业应用中扮演着非常重要的角色。无论是集群升级,还是证书设置有效期都非常方便,也是从事云原生相关工作从入门到精通不得不迈过的坎。通过本系列文章,你将从虚拟机准备开始,到使用二进制方式从零到一搭建起安全稳定的高可用kubernetes集…

记录正式环境测试环境【RedHat7编译升级redis7.0.9】--有关报错及解决

记录正式环境&测试环境【RedHat7 编译升级redis7.0.9】--有关报错及解决 🔻 一、报错详情1.1 ⛳ 写在前面1.2 ⛳ 报错11.3 ⛳ 报错21.4 ⛳ 安装redis1.5 ⛳ 版本检查 🔻 二、⛳ 总结 🔻 一、报错详情 1.1 ⛳ 写在前面 🍁 升级…

王道计算机网络学习笔记(3)——数据链路层

前言 文章中的内容来自B站王道考研计算机网络课程,想要完整学习的可以到B站官方看完整版。 三:数据链路层 3.1:数据链路层功能概述 结点:主机、路由器 链路:网络中两个结点之间的物理通道,链路的传输介…

【DeepLearning】Ubuntu中深度学习环境配置完整流程

Ubuntu中深度学习环境配置完整流程 1 显卡驱动2 cuda3 cuDNN4 torch5 torchvision 1 显卡驱动 支持 cuda 的所有显卡型号: Link 查询显卡型号 lspci -nn | grep VGA即 Vendor ID:Device ID 为 10de:21c4,在浏览器或者 Link 中搜索。 填写显卡信息: Link 选择要下载…

数据结构——快速排序的介绍

快速排序 快速排序是霍尔(Hoare)于1962年提出的一种二叉树结构的交换排序方法。快速排序是一种常用的排序算法,其基本思想是通过选择一个元素作为"基准值",将待排序序列分割成两个子序列,其中一个子序列的元素都小于等于基准值&am…

SpringBoot集成WebSocket实现消息实时推送(提供Gitee源码)

前言:在最近的工作当中,客户反应需要实时接收消息提醒,这个功能虽然不大,但不过也用到了一些新的技术,于是我这边写一个关于我如何实现这个功能、编写、测试到部署服务器,归纳到这篇博客中进行总结。 目录 …

【计算机网络自顶向下】计算机网络期末自测题(一)

前言 “(学不懂一点) (阴暗的爬行)(尖叫)(扭曲)(阴暗的爬行)(尖叫)(扭曲)(阴暗的爬行)(尖叫&#…

LeetCode·1262. 可被三整除的最大和·贪心

作者:小迅 链接:https://leetcode.cn/problems/greatest-sum-divisible-by-three/solutions/2314049/tan-xin-zhu-shi-chao-ji-xiang-xi-by-xun-r0n76/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得…

vscode 调试

目录 准备 GDB 调试方法 问题 准备 然后点击 文件-打开文件夹,找到创建的代码路径,确定后,在左侧的资源管理器可以看到代码文件。 第一次运行需要安装 c 的扩展,在扩展页面中,安装 C/C 编译注意一定要加上 -g 指令…

Linux tar.xz 格式的文件正确的解压命令

Linux tar.xz 最近下载 Linux kernel,好像最近流行 tar.xz 格式的后缀 对于 xz 后缀的压缩文件,我之前的解压方式是分为两步: xz -d xxx.tar.xz 解压成 xxx.tar 格式文件,然后再 tar xf xxx.tar 解压文件。 这样的操作不仅比较的…

跳槽过去,刚工作三天就被裁是一种怎样的体验

前言 还有谁?刚上三天班就被公司公司的工作不适合我,叫我先提升一下。 后面我也向公司那边讨要了一个说法,我只能说他们那边的说辞让我有些不服气。 现在之所以把这件事在csdn上记录一下,一是记录一下自己的成长轨迹&#xff0…

使用STM32F103的串口实现IAP程序升级功能

使用STM32F103的串口实现IAP程序升级功能 🎬IAP程序烧录全过程演示: ✨这几天折腾IAP升级功能,狂补了很多相关BootLoader相关的知识。本来最想实现IAP升级程序的方式是,基于SPI通讯的SD卡,借助挂载的FatFS文件系统&am…

【计网】第一章 计算机网络概述

文章目录 计算机网络概述一、计算机网络在信息时代中的作用二、互联网概述2.1 互连网概念2.2 网络的网络2.3 互连网基础结构发展的三个阶段2.4 互连网的标准化工作 三、互联网的组成3.1 互联网的边缘部分3.2 互联网的核心部分3.2.1 基础概念3.2.2 电路交换3.2.3 报文交换3.2.4 …