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

news2024/10/5 13:01:01

哈工大计算机网络课程网络层协议详解之:网络地址转换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内部的客户与中继服务器建立连接。

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

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K 个一组翻转链表

反转链表是比较常出的一种题目,我们有简单难度的一整个链表翻转: private ListNode reverse(ListNode head){ListNode pre null;ListNode cur head;while(cur ! null){ListNode next cur.next;cur.next pre;pre cur;cur next;}return pre;}从第一…

GC说明与介绍,GC的垃圾回收算法有哪些

1、GC是什么 2、GC算法概述 JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。 因此GC按照回收的区域又分了两种类型,一种是普通GC(minor GC),一种是全局GC&#xff0…

【算法】行星碰撞机器人碰撞(栈的使用)

文章目录 行星碰撞机器人碰撞参考资料 本文记录了两个使用栈来处理碰撞问题的算法题目。 行星碰撞 https://leetcode.cn/problems/asteroid-collision/ 对于这种题目,各个元素分别会向左或向右移动,可以使用栈模拟碰撞的过程。 由于从左往右进行遍历…

Argis通过Python的Arcpy第三方库进行字段计算、批量将mxd导出为jpg图片、合并数据库

前言 近来公司有开发Arcgis脚本工具的需求,我就去学了一下用Arcpy来操作Arcgis的数据,今天学习了字段计算,将学习成果记录如下。 arcpy帮助文档传送门:https://resources.arcgis.com/zh-cn/help/main/10.2/ 一、字段计算 1、…

Linux学习之内核升级

wget --no-check-certificate https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.1.14.tar.xz下载源代码。 yum install -y gcc gcc-c make ncurses-devel openssl-devel elfutils-libelf-devel安装必要的依赖包。 完成之后,显示如下: …

openEuler操作系统和openGauss数据库

文章目录 1. openEuler操作系统2. openGauss数据库2.1 系统自带库2.1.1 允许所有地址访问端口2.1.2 创建远程登录用户 2.2 安装5.0 版本2.2.1 下载2.2.2 安装2.2.3 测试 1. openEuler操作系统 镜像下载地址 https://www.openeuler.org/zh/download 选一个下载 安装 按提示安…

【kubernetes系列】Kubernetes中的重要概念(三)

在实际的工作中,我们使用Kubernetes 通常不会直接创建 Pod,而是通过 各种 Controller 来管理 Pod 的。Controller 中定义了 Pod 的部署特性,比如有几个副本,在什么样的 Node 上运行等。为了满足不同的业务场景,Kuberne…

VMware Workstation 17 的安装

一、简介 VMware Workstation 17.0是一款功能非常强大的虚拟机,可以帮助用户在Windows系统上同时开启多个系统,不仅能在虚拟机上安装上不同的操作系统,比如Mac、Linux以及Windows10/11等,还能与云技术和容器技术(如 D…

【金融量化】ETF基金是什么?有什么特点?

1 含义 ETF(交易型开放式指数基金)是以某一选定的指数所包含的成分证券或商品为投资对象,依据构成指数的证券或商品的种类和比例,采取完全复制或抽样复制,进行被动投资的指数基金。ETF不但具有传统指数基金的全部特色…

vue导出excle单sheet文字居中表头加粗显示

效果图: 首先下载依赖 npm install xlsx --save npm install xlsx-style --save在需要导出excle的vue文件中导入依赖 import XLSX from "xlsx" import XLSXStyle from xlsx-style在method中定义 methods:{// 格式化formatJson(filterVal, jsonData)…

月近万次发布,故障率<4‰如何做到?去哪儿测试左移重难点揭秘!

一分钟精华速览 去哪儿发布的数据显示,在过去一年中,其发布故障率始终保持在 4‰ 以下并不断降低。作为一家出行旅游服务平台,去哪儿网如何在复杂的业务场景下,仍能保持如此低的故障率?其中功能测试左移功不可没。 本…

高质量编程-编码规范之代码格式和注释

前言: \textcolor{Green}{前言:} 前言: 💞这个专栏就专门来记录一下寒假参加的第五期字节跳动训练营 💞从这个专栏里面可以迅速获得Go的知识 本次文章不仅仅是在 go 中主要注意,在编写其他语言中也同样重要…

单片机介绍选型(嵌入式学习)

单片机介绍&选型 单片机介绍常见的单片机单片机如何选型 单片机介绍 单片机(Microcontroller)是一种集成电路芯片,具有处理器核心、存储器、输入/输出接口和各种外设的功能。 单片机是单片微型计算机的简称,MCU是Microcontro…

15. WebGPU 相机

在上一篇文章中,我们必须将 F 移到视锥体前面,因为 mat4.perspective 函数 将眼睛放在原点 (0, 0, 0) 并且把对象 放到 位于眼前 -zNear 到 -zFar 之间的视锥体中。这意味着,任何想要显示的东西,都需要放在这个空间里。 在现实世…

对英雄联盟英雄属性数据的预处理及相似度矩阵计算

目录 一、引言 二、任务1 1、填充缺失值 2、用中位数填充“生命值”属性列缺失值 3、 用均值填充“生命值”属性列缺失值 三、任务2 注:英雄联盟英雄属性数据资源可在博客资源中自行获取。 一、引言 英雄联盟作为一款古早的刀塔游戏,可谓之刀塔游…

jumpserver-v2.2.2【部署教程】

目录 什么是 跳板机 跳板机的缺点 使用堡垒机的优势 jumpserver的组件 【1】时间同步 【2】安装依赖 【3】修改数据库字符集、创建远程用户 【4】创建python的虚拟环境,用于专门运行jumpserver的环境 【5】获取jumpserver的代码 【6】安装编译环境依赖 …

【管理系列-09】软件成本怎么评估,知己知彼才能做软件造价

项目来了,总要叫来几个人,讨论一下成本是多少,能不能接,作为研发经理,能够较为合理的评估成本是一项必备技能,如何科学合理的评估,达到对内对外都满意,我想这是每个研发经理的必修课…

管理类联考——逻辑——知识篇——分析推理——四、数字——haimian

数字 题型识别 与数字相关的分析推理题在逻辑科目中扮演着非常重要的角色,可能涉及方程、不等式、分子与分母比值关系、百分比、概率、集合运算等,可结合数学方法或利用数字规律进行解题。 思维导图 常用公式 从某种意义上说,数学本身就是…

五、浅析[ElasticSearch]底层原理与分组聚合查询

目录 一、ElasticSearch文档分值_score计算底层原理1.boolean model2.relevance score算法2、分析一个document上的_score是如何被计算出来的 二、分词器工作流程1.character filter、tokenizer、token filter2、内置分词器的简单介绍3、定制分词器3.1默认的分词器--standard3.…

《教我兄弟学Android逆向13 xpose改机开发01-环境设置》

上一篇 《教我兄弟学Android逆向12 编写xposed模块》 我们了解了xpose的基本原理并一起搭建了xpose的hook环境,你也很好的完成了课后作业,但是通过后面的测试练习你发现xpose在不同系统环境的安装方法是不一样的,在我们之前的低系统手机上面直接安装就能…