要理解网络,其实不就是理解这三张表吗
我们如果要理解数据是如果在网络世界中穿梭的,那其实只要了解其中的三张表就可以了。这三张表分别为路由表、转发表、ARP 表。
假设我们用聊天工具聊天的时候,我在北京,你在广东,当我给你发送一条消息的时候。搭载这这条消息的数据包需要从我的设备(电脑或手机)出发,跨域千上万水,趟过万里光纤,在不出意外的情况下才能到达你的设备。在这个过程中数据包要经过大致流程如下:
1、数据在我的设备上从应用层向下层层封装,最后发送到路由设备上;
2、路由设备对数据包进行转发,可能经过不止一个路由器和交换机;
3、终于到达你的设备所在的子网路由器,你所在的子网路由器转发给局域网内所有的直接相连的主机或交换机,如果是转发给交换机的话,交换机再次转发给交换机上连接的设备;
4、当你的设备发现这个数据包的目的主机是自己,就开始对数据包进行自链路层向上的一层一层的解封装,最终由对应的应用程序拿到消息;
主要的流程就是这样,但是中间每一种设备的转发都有对应的规则,主要涉及的设备就是终端、交换机、路由器,接下来我们具体来梳理一下一个数据包这一路上是怎么跋山涉水才呈现到你的屏幕上的。
跋山涉水来找你
看下图,假设现在「子网A的主机A」要发一条消息给「子网B的主机x-1」,这两个主机分别在不同的子网,也就是说并不是局域网内的传输,中间经过了路由器A、路由器B、子网B的顶层交换机、交换机X,最终才到达了目标主机X-1。
主机A封装数据包并发送
如果你已经掌握了传输层、网络层、链路层的各个协议,那这个过程就相对来说非常简单了。
应用层某聊天工具发送消息,消息内容被处理之后,也就是上图中的用户数据。
经过传输层,使用 TCP 协议传输,TCP 将用户数据封装上 TCP 首部信息,形成一个 TCP 段。注意了,TCP 首部中含有源端口号和目标端口号,应用层会根据端口号决定哪个应用程序使用这个包。比如我们自己开发的聊天程序,端口用的是 18888,那这个包到达主机X-1之后,发现 TCP 协议头中的端口号是 18888,那就知道要把这个包交给我们开发的聊天工具处理了。
经过网络层,搭载IP协议,在TCP段的基础上,加上IP首部信息,形成IP数据报。注意了,IP首部含有源IP地址和目的IP地址,要不然网海茫茫,谁来接收它,它又回复谁呢。在这个 IP 数据报中,源IP就是主机A的IP,目的 IP 地址就是主机X-1的IP。
最后经过链路层,在IP数据报的基础上,加上以太网帧首部,形成以太网帧数据包。在以太网上,只有以太网帧能顺利通行。注意了,以太网帧首部包含源MAC地址和目的MAC地址,链路层只认MAC地址,有了它才能找到对应的终端。
经过层层包装后,真正跑到以太网上的数据最终必须是一个完整的以太网帧,而以太网帧中必须要有目的端的 MAC 地址。接下来就是怎么拿到目的端的 MAC地址了。
当发送端开始组装数据的时候,首先会检查目的IP 和自身的IP 是否处在同一个网络中。计算方式很简单,就是用 IP 地址和子网掩码进行「与运算」。
如果目的端在局域网内
如果得到的网络地址是一致的,说明在同一个网络中。
这时,ARP表就要上场了。
ARP 表记录着 IP 地址和 MAC 地址的映射关系。可以根据 IP 地址查到对应的 MAC 地址,然后放到以太网帧中,如果有的话。
发送端检查自己的 ARP 表中是否有目的 IP 对应的 MAC 地址。如果有的话,直接将 MAC 地址组装到以太网数据帧中,发送数据帧,数据就能被目的端顺利接收。如果ARP 表中不存在目的IP对应的 MAC 地址,则向本网络广播发送 ARP 请求,ARP 请求会带着目的IP地址,意思就是询问“谁的IP地址是这个,请回复你的MAC地址给我”,网络中的主机看到后,如果IP是自己的,就返回给发送端一个ARP回复,回复中带着自己的MAC地址,发送端拿到MAC地址后,先存入本地的ARP表,然后组装以太网帧,将数据发送。
如果目的端不在局域网内
如果得到的网络地址不一致,说明目的端不在本网络中。那这样的话,查询 ARP表是不可能查到对应的 MAC 地址的,因为 ARP 表只存储局域网内的 IP 和 MAC 地址的映射记录。
既然查不到那怎么办,总得发出去才行啊。
如果 ARP 表中查不到记录,那只能走默认网关了。我们的设备都是知道默认网关的 IP地址的,这时候再去 ARP 表查询是否有网关地址对应的 MAC 地址,如果有直接将网关的 MAC 地址封装到以太网帧的目的地址中。如果没有的话,仍然要像上面那样,广播发送 ARP 请求,获取网关设备的 MAC 地址,然后存入 ARP 表中。对应到上图就是路由器A的端口1的网卡地址。
那将网关的 MAC 地址当做目的 MAC 地址,还怎么找到最终的目的端啊,最终的消息也不是想发给网关啊。
没办法,就是这样的,这只是第一步,在后面经过每一个非最终目的端设备的时候,都要将目的 MAC 地址设置为下一跳设备的 MAC 地址,因为以太网帧就是这样设计的。所以说,在整个传输过程中,以太网帧会不断的解析然后重新封装,目的就是把下一跳的 MAC地址封装进去。直到最终到达了目的设备所在的网络。
目的MAC 地址是一跳一跳变化的,但是 IP 头中的目的 IP 地址是绝对不能变的,要不然就真的找不到了。
路由器A如何路由的
当数据包到达路由器A之后,就要走出子网A,奔向更广阔的网络世界了。还是结合上面的图来看,这个拓扑结构还是很简单的,真实情况下,可能要经过十几二十个路由设备。
数据包来到路由器之后,路由器要怎么处理呢,路由器会进行路由操作,也就是将这个包安排一条最合适的路径发出去。
这就要提到路由表了。
路由器中维护着一张路由表,主要存放网络、主机与下一跳的对应关系。例如下表这样:
目标 | 子网掩码 | 下一跳 | 网络接口 |
---|---|---|---|
192.168.8.0 | 255.255.255.0 | 0.0.0.0 | en0 |
114.21.1.0 | 255.255.255.0 | 114.21.1.100 | en0 |
0.0.0.0 | 0.0.0.0 | 192.168.8.1 | en1 |
大致的意思就是如果收到一个数据报,在当前路由器的路由表中寻找,一般目标都是一个网络地址(标明一个子网),把具体数据包的IP地址和当前路由表的子网掩码进行与操作,如果得到的结果和路由表目标栏一直,就转发给这条记录中的下一跳地址,从网络接口栏所记录的接口发出(也就是路由器上的网口或者叫端口)。
如果下一跳地址是0.0.0.0 ,表示这个目的IP地址就在当前网络中。那就不用路由器转发了,拿到目的IP的MAC地址,就可以直接发送了(获取MAC地址的方法,前面说过了,先查ARP表,没有的话,再用ARP广播请求获取)。
如果下一跳不是0.0.0.0,表示目的IP不是本网络的地址,就发给下一跳的地址。
如果在路由表中都没有找到匹配的目标网络,那就看有没有配置默认条目了,默认条目也就是目标是0.0.0.0的条目,表示任意的IP都可以通过此条目的下一跳(也就是默认网关)地址转发出去。
如果在路由表中没有找到任何匹配的目标网络,并且没有设置默认条目,那就直接将数据包丢弃,并返回一个 主机不可达的 ICMP 请求。
路由表分为静态路由和动态路由,静态就是需要人手工配置,路由表是固定不变的,动态路由是根据一些规则动态更新路由表数据,总之, 路由表最终会有一些描述网络拓扑结构的记录存在。
当路由器A收到数据包之后,解封装这个数据包,从下层网上拆,链路层拆出 MAC 地址,发现就是自己的,继续拆,拆到 IP 层,找到目的 IP 地址,拆到 IP 层就可以了。然后拿着这个目表 IP 地址在路右边中检索,看看是否正好有对应的目标网络。
拿192.168.8.0(子网掩码是255.255.255.0)这个目标网络来说,目标是一个网络地址,可以理解为一个子网(局域网),那如果IP数据报里的目标IP是192.168.8.8/24或192.168.8.188/24都能对应上这一条记录,因为这两个地址和子网掩码与操作之后,得出的网络地址都是192.168.8.0。于是就发给下一跳 0.0.0.0。
假设我们的目标IP是114.21.1.1,通过查表发现了正好有目标地址是114.21.1.0的记录,于是转发给下一跳地址 114.21.1.100,通过en0这个接口发出去,直接发送到了与之相连的子网B的顶层交换机。
如果没有找到对应的记录,查看是否有默认路由,也就是目的地址是0.0.0.0的记录,如果有的话,就发给默认路由对应的下一跳地址。如果连默认路由也没有,直接将包丢弃,然后回复给源IP 一个类型为主机不可达的ICMP包。告诉源主机,此路不通了,然后应用程序根据这个信息,选择新的应对策略。
子网B的交换机X转发包
数据包从路由器A出来之后先到了子网B的顶层交换机,然后经过顶层交互机的转发,转发给了子网B的交换机X。顶层交换机如何转发就不说了,和交换机X的转发过程是一致的。
交换机的转发就要说到转发表了。
在交换机中维护着一张叫做转发表的映射表。一台交换机上有很多个接口,每个接口连接一台设备。转发表记录的就是接口和所连接的设备的MAC地址的映射关系。交换机就是根据这张表将数据帧传输到指定的主机端口上的。
数据包走到交换机这里了,说明它离目的地已经不远了,已经找到目标主机所在的局域网内了。
当数据包到达交互机后,交换机检查自己的MAC表是否有数据帧中目的MAC地址的匹配条目,如果有,则会根据MAC表中记录的对应端口将数据帧转发出去,这一转发方式称为「单播」。
而如果没有,则会将该数据帧从非来源端口的其它全部端口发送出去,这一转发方式程序称为「广播」。。
假设交换机 X 收到数据包后,根据目标MAC地址查询转发表,没查到,这时候,交换机X就将包从端口1和端口2广播出去给主机X-1和主机X-2,主机X-1收到这个包后,对比目的MAC地址和自己的是否一致,结果发现这个包是发给自己的,会回复交换机X一个数据包,包含自己的(主机X-1)的MAC地址,这时,交换机X就将这个MAC地址和交换机上对应的端口的映射关系记录到转发表。这一过程通常称为「自学习」。
主机X-2发现包不是发给自己的,直接就忽略了。
到此为止,主机X-1就顺利收到包了,确切的说是一个以太网帧。
子网B的主机X-1收到包之后
主机X-1收到这个数据帧之后,链路层解析,发现正好是发给自己的,因为目标MAC地址和自己的一致,然后交给网络层,发现目的IP也是自己的,于是交给传输层,传输层解析TCP段,最后将数据交给上层的应用层,应用层根据TCP的目的端口号,判断是那个应用程序要处理收到的数据。
总结
下面的流程图是对上述过程的汇总,可以点开下面的大图查看。
其中有几个细节要理解,对理解整个过程有很大帮助。
1、链路层的以太网数据帧必须要有目的端的 MAC 地址,而且必须是下一跳的 MAC 地址。别问为什么,协议就是这么规定的。
2、正因为链路层以太网帧必须是下一跳MAC地址,所以整个传输过程中,以太网帧是一直解包、重组的,目的就是把下一跳MAC地址重组进去。
3、网络层 IP 协议中的目的 IP地址是不能变的,那有人要问了,发送端和目的端虽然不是在一个子网中,但它们的局域网地址都是 192.168.1 网段的,那怎么能找到目的主机呢。本篇并没有讨论这个问题,这其实就要牵扯到公网和内网的映射了,一个局域网最终会映射到一个公网 IP 地址上,比如路由器可以设置 NAT 功能。
4、ARP 协议只工作在局域网中,ARP 通过 IP 获取 MAC 地址,是通过向局域网内所有主机广播 ARP 请求的,只有对应的 IP 地址才会回复这个 ARP 请求。
5、每经过一个路由设备,都要将 IP 数据报拆包,然后再重组,源IP地址设置为自己的,然后 TTL 减一,TTL 有一个限制,比如 32,当路由次数超过这个数值,表示网络环境不是很好,绕的太远了,就会把这个包丢弃掉。
相关文章:

要理解网络,其实不就是理解这三张表吗
我们如果要理解数据是如果在网络世界中穿梭的,那其实只要了解其中的三张表就可以了。这三张表分别为路由表、转发表、ARP 表。 假设我们用聊天工具聊天的时候,我在北京,你在广东,当我给你发送一条消息的时候。搭载这这条消息的数据…...

Java异常架构与异常关键字
Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机制。 Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问…...

【阅读笔记】SecureML: A System for ScalablePrivacy-Preserving Machine Learning
1. Motivation 针对机器学习中的出现的数据隐私泄露的风险,提出了线性回归、逻辑回归以及简单神经网络的隐私保护模型。 2. Contributions 2.1 为线性回归、逻辑回归以及神经网络设计安全计算协议 2.1.1.1 线性回归 线性回归损失函数为: , 采用SG…...

【2023美赛】C题Wordle预测27页中文论文及Python代码详解
【2023美赛】C题Wordle预测27页中文论文及Python详解 相关链接 (1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 (2)2023年美赛C题Wordle预测问题二建模及Python代码详细讲解 (3)2023年美赛C题…...

【C++修行之路】STL——模拟实现string类
文章目录前言类框架构造与析构c_str迭代器操作符重载[]::> > < < !:reverse与resizereverseresizepush_back与append复用实现insert和erasec_str与流插入、流提取eraseswap(s1,s2)与s1.swap(s2)结语前言 这次我们分几个部分来实现string类…...

CorelDRAW2023最新版序列号使用教程
CorelDRAW2023用起来非常顺手,旨在为用户解决因在工作上带来的问题,在业内可谓享有极高的声誉,是业内人士常用的一款工具,有了它,可以更好的帮助用户把握好各个方面的细节,减少其他方面的失误,让…...

【一天一门编程语言】Python 语言程序设计极简教程
文章目录 Python 语言程序设计极简教程一、Python语言简介1.1 Python的优势1.2 Python的应用二、Python基础语法2.1 Python基础2.1.1 注释2.1.2 变量2.1.3 运算符2.1.4 控制流2.1.5 函数2.2 Python数据类型2.2.1 数字2.2.2 字符串2.2.3 列表2.2.4 元组2.2.4.1 元组的基本操作创…...

14、KL散度
KL 散度,是一个用来衡量两个概率分布的相似性的一个度量指标。 现实世界里的任何观察都可以看成表示成信息和数据,一般来说,我们无法获取数据的总体,我们只能拿到数据的部分样本,根据数据的部分样本,我们会…...

TypeError: load() missing 1 required positional argument: ‘Loader‘解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…...

【设计模式】 观察者模式介绍及C代码实现
【设计模式】 观察者模式介绍及C代码实现 背景 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”,即一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。…...

01-Maven基础-简介安装、基本使用(命令)、IDEA配置、(写jar,刷新自动下载)、依赖管理
文章目录0、Maven1、Maven 简介2、Maven 安装配置安装配置步骤3、Maven 基本使用Maven 常用命令Maven 生命周期IDEA 配置 MavenMaven 坐标详解IDEA 创建 Maven 项目IDEA 导入 Maven 项目配置 Maven-Helper 插件 (非常实用的小插件)依赖管理使用坐标导入 jar 包依赖范围0、Maven…...

一、前端稳定性规约该如何制定
前言 稳定性是数学或工程上的用语,判别一系统在有界的输入是否也产生有界的输出。若是,称系统为稳定;若否,则称系统为不稳定。 前端稳定性的体系建设大约可以分为了发布前,发布后,以及事故解决后三个阶段…...

Docker(三)Docker网络
目录1 结论知识2 link3 自定义网络1 结论知识 每一个容器启动时都会被分配一个ip地址;宿主机可以ping通任何一个docker容器;启动docker之后,宿主机默认网卡docker0,启动容器在宿主机注册网卡,使用的evth-pair技术&…...

Js高级API
Decorator装饰器 针对属性 / 方法的装饰器 // decorator 外部可以包装一个函数,函数可以带参数function Decorator (type) {/*** 这里是真正的decorator* description: 装饰的对象的描述对象* target:装饰的属性所述类的原型,不是实例后的类。如果装饰…...

团队:在人身上,你到底愿意花多大精力?
你好,我是叶芊。 今天我们讨论怎么带团队这个话题,哎先别急着走,你可能跟很多人一样,觉得带团队离我还太远,或者觉得我才不要做管理,我要一路技术走到底,但是你知道吗?带团队做事&am…...

Linux-Poolkit提权
Linux-Poolkit提权 漏洞复现- Linux Polkit 权限提升漏洞(CVE-2021-4034) 0x00 前言 polkit是一个授权管理器,其系统架构由授权和身份验证代理组成,pkexec是其中polkit的其中一个工具,他的作用有点类似于sudo&#x…...

【React全家桶】React Hooks
React Hookshooks介绍useState(保存组件状态)useEffect()useCallback(记忆函数)useMemo() 记忆组件useRef(保存引用值)useReducer()useContext(减少组件层级)自定义hookshooks介绍 在react类组件(class)写法中,有setState和生命周期对状态进…...

CLIP论文阅读
Learning Transferable Visual Models From Natural Language Supervision 利用自然语言的监督信号学习可迁移的视觉模型 概述 迁移学习方式就是先在一个较大规模的数据集如ImageNet上预训练,然后在具体的下游任务上再进行微调。这里的预训练是基于有监督训练的&am…...

华为OD机试真题Python实现【身高排序】真题+解题思路+代码(20222023)
身高排序 题目 小明今年升学到了小学一年级, 来到新班级后,发现其他小朋友身高参差不齐, 然后就想基于各小朋友和自己的身高差,对他们进行排序, 请帮他实现排序 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 输入 第一行为正整数H…...

Spring Cache的使用--快速上手篇
系列文章目录 分页查询–Java项目实战篇 全局异常处理–Java实战项目篇 完善登录功能–过滤器的使用 更多该系列文章请查看我的主页哦 文章目录系列文章目录前言一、Spring Cache介绍二、Spring Cache的使用1. 导入依赖2. 配置信息3. 在启动类上添加注解4. 添加注解4.1 CacheP…...

(三十八)MySQL是如何支持4种事务隔离级别的?Spring事务注解是如何设置的?
上次我们讲完了SQL标准下的4种事务隔离级别,平时比较多用的就是RC和RR两种级别,那么在MySQL中也是支持那4种隔离级别的,基本的语义都是差不多的 但是要注意的一点是,MySQL默认设置的事务隔离级别,都是RR级别的&#x…...

【博学谷学习记录】大数据课程-学习第八周总结
Hadoop初体验 使用HDFS 1.从Linux本地上传一个文本文件到hdfs的/目录下 #在/export/data/目录中创建a.txt文件,并写入数据 cd /export/data/ touch a.txt echo "hello" > a.txt #将a.txt上传到HDFS的根目录 hadoop fs -put a.txt /2.通过页面查看…...

go cobra初试
cobra开源地址 https://github.com/spf13/cobra cobra是什么 Cobra is a library for creating powerful modern CLI applications. Cobra is used in many Go projects such as Kubernetes, Hugo, and GitHub CLI to name a few. This list contains a more extensive lis…...

【react全家桶】 事件处理
文章目录03 【事件处理】1.React事件2.类式组件绑定事件3.向事件处理程序传递参数4.收集表单数据5.受控和非受控组件5.函数的柯里化03 【事件处理】 React的事件是通过onXxx属性指定事件处理函数 React 使用的是自定义事件,而不是原生的 DOM 事件 React 的事件是通过…...

RabbitMQ交换机(Exchanges)
目录 一、概念 二、临时队列 三、绑定 四、Fanout(扇出交换机) (一)介绍 (二)实战 五、Direct(直接交换机) (一)介绍 (二)实…...

2023年java初级面试题10道基础试水题
1、面向对象的特征有哪些方面?答:面向对象的特征主要有以下几个方面:1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节…...

烙铁使用方法
烙铁使用 烙铁是硬件工程师最经常使用的工具之一,一把性能保持良好的烙铁能帮助我们快速进行电路调试。烙铁第一次加热时采用焊锡均匀涂覆在烙铁头上,以便去除包在烙铁头上面的氧化物。在工作中我们需要根据情况选择合适的烙铁头类型,合适的温度进行操作。完成焊接后要在烙铁…...

golang日期转换、日期增减计算、时间戳转换
// 固定日期格式format : "2006-01-02 15:04:05"// 按本地时区解析日期location, _ : time.ParseInLocation(format, "2022-02-20 11:30:00", time.Local)// 增加1年,三个参数分别是:年,月,日date : location…...

Android 多种支付方式的优雅实现
场景App 的支付流程,添加多种支付方式,不同的支付方式,对应的操作不一样,有的会跳转到一个新的webview,有的会调用系统浏览器,有的会进去一个新的表单页面,等等。并且可以添加的支付方式也是不确…...

算法设计与分析期末考试复习(三)
动态规划 动态规划算法与分治法类似,其基本思想也是将待求解问题分成若干个子问题。但是经分解得到的子问题往往不是互相独立的。在用分治法求解时,有些子问题被重复计算机了许多次。 如果能够保存已解决的子问题的答案,而在需要时再找出已求…...