NAT是如何工作的?

news2024/11/19 23:15:46

广域网是由很多的局域网组成的,比如公司网络、家庭网络、校园网络等。我们到微观层面,看看局域网是如何工作的。IPv4 的地址不够,因此需要设计子网。当一个公司申请得到一个公网 IP 后,会在自己的公司内部设计一个局域网。这个局域网所有设备的 IP 地址,通常会以 192.168 开头。这个时候,假设你的职工小明,上班时间玩王者荣耀。当他用 UDP 协议向王者荣耀的服务器发送信息时,消息的源 IP 地址是一个内网 IP 地址,而王者荣耀的服务,是一个外网 IP 地址。这里我先向你提一个问题,数据到王者荣耀服务器可以通过寻址和路由找到目的地,但是数据从王者荣耀服务器回来的时候,王者荣耀服务器如何知道192.168开头的地址应该如何寻址呢?要想回答这个问题,就涉及网络地址转换协议(NAT 协议)。

内部网络和外部网络

对一个组织、机构、家庭来说,我们通常把内部网络称为局域网,外部网络就叫作外网。下图是一个公司多个部门的网络架构。
在这里插入图片描述
到外网通过路由器接入整个公司的局域网,和路由器关联的是三台交换机,代表公司的三个部门。交换机,或者称为链路层交换机,通常工作在链路层;而路由器通常也具有交换机的能力,工作在网络层和链路层。
光纤是一种透明的导光介质,多束光可以在一个介质中并行传播,不仅信号容量大,重量轻,并行度高而且传播距离远。当然,光纤不能弯曲,因此办公室里用来连接交换机和个人电脑的线路肯定不能是光纤,光线通常都用于主干网络。

局域网数据交换(MAC 地址)

同一个局域网中的设备如何交换消息。
首先,我们先明确一个概念,设备间通信的本质其实是设备拥有的网络接口(网卡)间的通信。为了区别每个网络接口,互联网工程任务组(IETF)要求每个设备拥有一个唯一的编号,这个就是 MAC 地址。你可能会问:IP 地址不也是唯一的吗?其实不然,一旦设备更换位置,比如你把你的电脑从北京邮寄到广州,那么 IP 地址就变了,而电脑网卡的 MAC 地址不会发生变化。总的来说,IP地址更像现实生活中的地址,而 MAC 地址更像你的身份证号。然后,我们再明确另一个基本的概念。在一个局域网中,我们不可以将消息从一个接口(网卡)发送到另一个接口(网卡),而是要通过交换机。为什么是这样呢?因为两个网卡间没有线啊!所以数据交换,必须经过交换机,毕竟线路都是由网卡连接交换机的。
在这里插入图片描述
总结下,数据的发送方,将自己的 MAC 地址、目的地 MAC 地址,以及数据作为一个分组(Packet),也称作 Frame 或者封包,发送给交换机。交换机再根据目的地 MAC 地址,将数据转发到目的地的网络接口(网卡)。
最后一个问题,你可能问,这个分组或者 Frame,是不是 IP 协议的分组呢?——不是,这里提到的是链路层的数据交换,它支持 IP 协议工作,是网络层的底层。所以,如果 IP 协议要传输数据,就要将数据转换成为链路层的分组,然后才可以在链路层传输。链路层分组大小受限于链路层的网络设备、线路以及使用了链路层协议的设计。你有时候可能会看到 MTU 这个缩写词,它指的是 Maximun Transmission Unit,最大传输单元,意思是链路层网络允许的最大传输数据分组的大小。因此 IP 协议要根据 MTU 拆分封包。
MSS(Maximun Segment Size,最大段大小)是 TCP 段,或者称为 TCP 分组(TCP Packet)的最大大小。MSS 是传输层概念,MTU 是链路层概念。
MTU = MSS + TCP Header + IP Header
这个思路有一定道理,但是不对。先说说这个思路怎么来的,你可能会这么思考:TCP 传输数据大于 MSS,就拆包。每个封包加上 TCP Header ,之后经过 IP 协议,再加上 IP Header。于是这个加上 IP 头的分组(Packet)不能超过 MTU。固然这个思路很有道理,可惜是错的。因为 TCP 解决的是广域网的问题,MTU 是一个链路层的概念,要知道不同网络 MTU 是不同的,所以二者不可能产生关联。这也是为什么 IP 协议还可能会再拆包的原因。

地址解析协议(ARP)

讨论了 MAC 地址,链路层通过 MAC 地址定位网络接口(网卡)。在一个网络接口向另一个网络接口发送数据的时候,至少要提供这样 3 个字段:
1.
源 MAC 地址
2.
目标 MAC 地址
3.
数据
对于一个网络接口,它如何能知道目标接口的 MAC 地址呢?我们在使用传输层协议的时候,清楚地知道目的地的 IP 地址,但是我们不知道 MAC 地址。这个时候,就需要一个中间服务帮助根据 IP 地址找到 MAC 地址——这就是地址解析协议(Address Resolution Protocol,ARP)。整个工作过程和 DNS 非常类似,如果一个网络接口已经知道目标 IP 地址对应的 MAC 地址了,它会将数据直接发送给交换机,交换机将数据转发给目的地,这个过程如下图所示:
在这里插入图片描述
那么如果网络接口不知道目的地地址呢?这个时候,地址解析协议就开始工作了。发送接口会发送一个广播查询给到交换机,交换机将查询转发给所有接口
在这里插入图片描述
如果某个接口发现自己就是对方要查询的接口,则会将自己的 MAC 地址回传。接下来,会在交换机和发送接口的 ARP 表中,增加一个缓存条目。也就是说,接下来发送接口再次向 IP 地址 2.2.2.2 发送数据时,不需要再广播一次查询了。
在这里插入图片描述
前面提到这个过程和 DNS 非常相似,采用的是逐级缓存的设计减少 ARP 请求。发送接口先查询本地的 ARP 表,如果本地没有数据,然后广播 ARP 查询。这个时候如果交换机中有数据,那么查询交换机的 ARP 表;如果交换机中没有数据,才去广播消息给其他接口。注意,ARP表是一种缓存,也要考虑缓存的设计。通常缓存的设计要考虑缓存的失效时间、更新策略、数据结构等。比如可以考虑用 TTL(Time To Live)的设计,为每个缓存条目增加一个失效时间。另外,更新策略可以考虑利用老化(Aging)算法模拟 LRU。
总的来说,家用的路由器,也具备交换机的功能。但是当 ARP 表很大的时候,就需要专门的、能够承载大量网络接口的交换设备。就好比,如果用数组实现 ARP 表,数据量小的时候,遍历即可;但如果数据量大的话,就需要设计更高效的查询结构和设计缓存。

连接内网

有时候,公司内部有多个子网。这个时候一个子网如果要访问另一个子网,就需要通过路由器。
在这里插入图片描述
也就是说,图中的路由器,其实充当了两个子网通信的桥梁。在上述过程中,发送接口不能直接通过 MAC 地址发送数据到接收接口,因为子网 1 的交换机不知道子网 2 的接口。这个时候,发送接口需要通过 IP 协议,将数据发送到路由器,再由路由器转发信息到子网 2 的交换机。这里提一个问题,子网 2 的交换机如何根据 IP 地址找到接收接口呢?答案是通过查询ARP 表。

连接外网(网络地址转换技术,NAT)

Pv4 协议因为存在网络地址耗尽的问题,不能为一个公司提供足够的地址,因此内网 IP 可能会和外网重复。比如内网 IP 地址192.168.0.1发送信息给22.22.22.22,这个时候,其实是跨着网络的。
在这里插入图片描述
跨网络必然会通过多次路由,最终将消息转发到目的地。但是这里存在一个问题,寻找的目标IP 地址22.22.22.22是一个公网 IP,可以通过正常的寻址 + 路由算法定位。当22.22.22.22寻找192.168.0.1的时候,是寻找一个私网 IP,这个时候是找不到的。解决方案就是网络地址转换技术(Network Address Translation)。
NAT 技术转换的是 IP 地址,私有 IP 通过 NAT 转换为公网 IP 发送到服务器。服务器的响应,通过 NAT 转换为私有 IP,返回给客户端。通过这种方式,就解决了内网和外网的通信问题。

总结

总结一下,链路层发送数据靠的是 MAC 地址,MAC 地址就好像人的身份证一样。局域网中,数据不可能从一个终端直达另一个终端,而是必须经过交换机交换。交换机也叫作链路层交换机,它的工作就是不断接收数据,然后转发数据。通常意义上,交换机不具有路由功能,路由器往往具有交换功能。但是往往路由器交换的效率,不如交换机。已知 IP 地址,找到 MAC 地址的协议,叫作地址解析协议(ARP)。网络和网络的衔接,必须有路由器(或者等价的设备)。一个网络的设备不能直接发送链路层分组给另一个网络的设备,而是需要通过 IP 协议让路由器转发。
网络地址解析协议(NAT)解决的是内外网通信的问题。NAT 通常发生在内网和外网衔接的路由器中,由路由器中的 NAT 模块提供网络地址转换能力。从设计上看,NAT 最核心的能力,就是能够将内网中某个 IP 地址映射到外网 IP,然后再把数据发送给外网的服务器。当服务器返回数据的时候,NAT 又能够准确地判断外网服务器的数据返回给哪个内网
IP。

NAT 是如何做到这点的呢?需要做两件事。

NAT 需要作为一个中间层替换 IP 地址。 发送的时候,NAT 替换源 IP 地址(也就是将
内网 IP 替换为出口 IP);接收的时候,NAT 替换目标 IP 地址(也就是将出口 IP 替换
回内网 IP 地址)。
2.
NAT 需要缓存内网 IP 地址和出口 IP 地址 + 端口的对应关系。也就是说,发送的时候,
NAT 要为每个替换的内网 IP 地址分配不同的端口,确保出口 IP 地址+ 端口的唯一性,
这样当服务器返回数据的时候,就可以根据出口 IP 地址 + 端口找到内网 IP。

IPv6 NAT是必要的主要原因有4条:1)重编号,一个用户换ISP重编号的解决方案,“草根”技术NAT目前是最好的,IETF推荐的“贵族”技术PI技术不敢真正使用(主要是路由扩展性问题)。2)Multihoming,IETF同样无解,NAT目前最佳;3)内部拓扑的隐藏,别的一些技术可能可以做到,NAT也可以;4)计算主机的数量,有了NAT后就不
太好计算了。

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

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

相关文章

8自由度串联四足机器人实现前进功能

1. 功能说明 本文示例将实现R253样机8自由度串联四足机器人前进的功能,该机构是由4个 2自由度串联仿生腿 组成。 2. 串联关节型机器人运动算法 8自由度串联四足机器人的前进步态是将机器人四足分成两组腿(身体一侧的前足与另一侧的后足)分别进…

集群时间同步

集群时间同步 时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。 1.配置时间同步具体实操: 1.1)时间服务器配…

中国20强(上市)游戏公司2022年财报分析:营收结构优化,市场竞争进入白热化

易观:受全球经济增速下行的消极影响,2022年国内外游戏市场规模普遍下滑。但中国游戏公司凭借处于全球领先水平的研发、发行和运营的能力与经验,继续加大海外市场布局,推动高质量发展迈上新台阶。 风险提示:本文内容仅代…

lvm分区扩容

1.前言 此试验对root目录扩容20GB,使用lvm模式扩容,需要先声明,搭建centos主机的时候要把分区模式改成lvm模式,这样后期扩容的时候就比较好处理,如果使用了默认的part模式的话,扩容分区需要将数据先迁移备…

k8s架构了解

Kubernetes(k8s)是用于自动部署、扩展和管理“容器化应用程序”的开源系统 k8s由control plane以及cluster nodes构成 control plane control plane是维护所有k8s对象记录的系统,持续管理着对象状态,并且对集群的变化做出响应,并使状态匹…

2022年美国大学生数学建模竞赛B题水和水力发电分配解题全过程文档及程序

2022年美国大学生数学建模竞赛 B题 水和水力发电分配 原题再现: 背景:   几个世纪以来,人们在河流和溪流.上修建水坝来蓄水建造水库,以此作为管理供水的方式。这些水库储存各种用途的水(如农业、工业、住宅),提供休闲和娱乐场…

git可视化管理工具SourceTree安装教程

一、背景 本文主要写给,不熟悉git命令或者不喜欢使用git命令的开发者使用,SourceTree可视化见面可以清晰操作git,管理项目方便,可追溯代码编写者及日期。轻松完成项目的dev、sit、线上环境代码管理与合并。无需使用git命令,彻底释…

北京筑龙参编的《国有企业采购操作规范(2023版)》发布

近日,中国物流与采购联合会发布《国有企业采购操作规范(2023版)》团体标准,北京筑龙作为起草单位之一参与编写。新版团体标准为国有企业编制采购管理制度、规范采购行为提供了参照和依据,有助于进一步提高国企采购的规…

【腾讯云 Finops Crane 集训营】深入了解 Crane 开源项目,集训营实验操作指南,体验过程总结

前言 最近有幸参与了腾讯云举办的Finops Crane的集训营。在这个过程中,老师认真指导,让我受益非浅,也让我真正理解了这一产品所带来的意义。 在听了老师们的介绍和讲解后,我马不停蹄地开始了自己摸索。首先是跟着视频和官方教程…

7.100ASK_V853-PRO开发板支持人形检测和人脸识别

1.前言 ​ V853 芯片内置一颗 NPU核,其处理性能为最大 1 TOPS 并有 128KB 内部高速缓存用于高速数据交换,支持 OpenCL、OpenVX、android NN 与 ONNX 的 API 调用,同时也支持导入大量常用的深度学习模型。本章提供一个例程,展示如…

银医一站式服务终端

01 发卡/充值/挂号业务 ●发卡就诊 ●预约挂号 ●当日挂号 ●自助充值 ●医保关联 ●预约取号 ●现金充值 ●核酸预约 02 打印业务 ●打印检验报告 ●打印检查报告 ●打印费用清单 ●打印病历报告 ●打印住院病历 ●打印检验条码 03 缴费结算业务 ●支付宝支付…

AttributeError: module ‘lib‘ has no attribute ‘X509_V_FLAG_CB_ISSUER_CHECK‘

terminal运行报错AttributeError: module lib has no attribute X509_V_FLAG_CB_ISSUER_CHECK 解决: pip install pyOpenSSL --upgrade

Log4j2远程命令执行(CVE-2021-44228)

漏洞原理 该漏洞是由于,在JNDI客户端的lookup()函数参数外部可控或Reference类构造方法的classFactoryLocation参数外部可控时,会使用户的JNDI客户端访问RMI注册表中绑定的恶意Reference类,从而加载远程服务器上的恶意class文件在客户端本地…

实现微信打开App功能

效果 要求 文档 开发标签文档 android接入指南 android实现 1.接入openSDK dependencies { api ‘com.tencent.mm.opensdk:wechat-sdk-android:6.8.0’ } 2.注册 需要在包名为(applicationId)wxapi的包下加入以上几个类。 类名功能AppRegister是一…

heic如何转换jpg格式?

heic如何转换jpg格式?HEIC是苹果推出的一种新型图片格式,它可以在保证高质量图像的同时减小图像文件的大小。虽然HEIC格式在iOS设备上使用广泛,但在其他操作系统或平台上,特别是Windows系统中,其兼容性和支持程度较差。…

蓝牙单连接和多连接知识

蓝牙单连接和多连接知识 生活中蓝牙连接多路蓝牙的情况越来越多&#xff0c;下面介绍下单连接和多连接的知识&#xff0c;供大家参考 一&#xff1a;蓝牙单连接 蓝牙单连接也称为Point-to-Point 点对点连接&#xff0c;是最常见的蓝牙连接场景,如手机<–>车载蓝牙。&…

〖Web全栈开发①〗—网络编程基础(上)

网络编程基础 网络编程网络编程概述TCP/IP协议IP地址什么是IPIP组成IP 地址使用过程查看IPIp地址分类&#xff1a;子网掩码 端口 socketSocket原理&#xff11;.什么是Socket2.创建一个tcp socket&#xff08;tcp套接字&#xff09; tcp 介绍 &#x1f3d8;️&#x1f3d8;️个…

安卓卡死,卡屏,死机,黑屏

(662条消息) 黑屏定屏那些事 - 系统机制&#xff0c;分析套路和实战&#xff08;系统篇&#xff09;_android黑屏问题分析_内核工匠的博客-CSDN博客

Java 是如何实现双亲委托加载机制的

Java 是一种面向对象的编程语言&#xff0c;它有一套独特的类加载机制。其中&#xff0c;双亲委托加载机制是 Java 类加载机制中的一个重要概念。本文将介绍 Java 的双亲委托加载机制是如何实现的&#xff0c;并解释其作用和优点。 Java 类加载机制 在 Java 中&#xff0c;类的…

树脂可以吸收水里的硝酸盐吗,饮用水矿泉水除硝酸盐,食品级树脂

使用常规的离子交换树脂处理含硫酸盐水中的硝酸盐是困难的。因为树脂几乎交换了水中的所有的硫酸盐后&#xff0c;才与水中的硝酸盐交换。也就是说&#xff0c;硫酸盐的存在会降低树脂对硝酸盐的去除能力。采用Tulsimer A-62MP除硝酸盐树脂优先交换硝酸盐&#xff0c;对硝酸盐的…