Linux:数据链路层

news/2024/12/2 10:11:31/

文章目录

  • 路由表
  • 数据链路层
  • 分片
  • mac帧报头
  • ARP协议
    • ARP的周边话题

路由表

在这里插入图片描述
当主机a想要发送消息到主机b,这一整个过程中,数据报文在进行传输的过程实际上是一跳一跳的过去的,而报文可能会经过公网进行传递,本质上这些网络都是靠对应的路由器来进行链接的

当在之前的实验中,向某个地方进行请求的时候,请求的ip都是公网ip,而在平时的云服务器中是使用的是公网ip的,并且在ip协议的报头中,也有对应的ip字段,表示的是源ip地址和目标ip地址,这些都是来保证网络数据包可以传递过去的保障,那这和这里的路由有什么关系呢?

路由的工作之一是有路由转发的工作,每一个主机都有一个叫做路由表的东西,那这个路由表有什么用呢?在Linux的操作系统中可以查到这个内容:

在这里插入图片描述

那我上述所示的这个机器,通过这样的指令就查询到了路由表的存在,那当现在要有一个目标主机,现在要进行报文的发送了,就会拿着这个目标主机的ip,和子网掩码进行按位与,得到的就是Destination,然后再和每一行的Destination进行比对,如果匹配成功就发送,没有成功就继续进行匹配

那匹配路由表会有下面的几种可能性,我们分别进行讨论

**1. 不知道?**这种情况通常来说是路由的算法做的不佳的原因,这里我们不考虑这种情况
**2. 给主机具体的下一跳:**通过查询路由表,找到了想要传递的下一跳的目的地,所以直接就通过下一跳跳过去了
**3. 路由器也不清楚:**比对路由表,发现没匹配成功,这个时候就会把报文传递给默认路由,所谓的默认路由,就是网段内的另外一个路由器,然后在这个路由器中进行查询,继续传递
**4. 到达入口路由器:**这个就是比较理想的状态了,此时已经找到目标服务器了,那么就可以直接传递进去了

数据链路层

在实际的使用当中,报文其实并没有直接通过网络发出去,而是会交给下一层协议,那这层协议就是我们要谈论的最后一层协议了:数据链路层

对于数据链路层来说,实际上已经算是一个网卡硬件驱动层了,数据链路层不能发送过大的报文,这也是和硬件相关的,被硬件所控制的,那这就必然要求,上层不能交付过大的报文,这也就解释了对应的在TCP中,进行流量控制的章节中我们讲到,流量控制说的是对方的接收能力,比如现在对方接收能力是64kb,那为什么不直接把这64kb直接发过去,而是要一点一点发?原因就在于此,因为底层的发送是有限制的,这个限制就来源于网卡硬件

在这里插入图片描述

分片

那假设,现在就是运气不好,上层传递过来的报文就是太大了,那这该怎么办呢?作为网络层的ip协议,自然也有自己的方案,其中一种概念叫做分片,分片工作是由ip协议完成,然后传递到目标主机再由对方的ip协议进行组装,这个分片简单来说就是把ip在底层划分为若干个小的ip,然后这些小的ip再进行分次传送,送过去以后再组装成一个大的ip,再向上交付,那现在要考虑的几个问题就是,如何进行分片?又如何进行组装?

分片

对于分片来说,概念也相对比较简单,首先要知道的一点是进行分片也是要组装报头的,回顾ip协议,它的报头中是存在一个16位的标识的:
在这里插入图片描述
那这个标识是ip协议的标号,不同的ip协议标识肯定是不同的,对于相同的ip协议分片之后的标号也是相同的,这些都算比较好理解

再看下一个字段,说的是3位标志,那这个标志是干什么的呢?在这3位标志当中,其中第二位表示的是是否允许进行分片,如果显示的结果是0,那么就是表示允许分片,如果是1那就是表示的是不允许分片,第三位表示的是是否为结束标记,如果是1表示当前还没有结束,如果是0表示的是当前已经结束了,代表这个分片结束了

再看下一个字段是片偏移,这个就更简单了,就是一个偏移量

下面我用一个例子来进行解释上面的这一套理论:假设现在有一个报文是3000字节,而数据链路层最多发1500字节的报文,那它该如何进行划分呢?

在这里插入图片描述

那现在划分的问题结束了,它是如何进行组装的呢?正是由于有标记位的存在,才能保证不会丢失,偏移量和标记位加起来就能确定这个报文是不是最后一个,是不是开头,是不是中间

需要注意的是,正常来说是不建议进行分片的,因为如果有一个报文丢失了,那么整个报文都要进行重传,ip协议是没有TCP协议的保存机制的

mac帧报头

在计算机当中,每台主机除了对应的ip之外,还应该拥有一个mac地址,这个mac地址指的是网卡,对于每一个网卡来说,它都有一个单独的mac地址与之对应,它的作用主要就是用来在同一个局域网中进行区分特定的主机

那下图所示的是mac帧的报头信息

在这里插入图片描述

首先是数据部分,这个数据部分指的是ip报文,那随之而来的就是每一个协议都要思考的问题,它是如何做到报头和有效载荷进行分离,以及它是如何进行交付的?

报头和有效载荷分离

结论是,它是采用的定长报头的方式,当收到报文的时候就可以根据定长的报头实现和有效载荷的分离,其中有源地址和目的地址还有类型

如何进行分用?

如何进行识别这个报文是用以做什么的呢?答案是在报头的类型中会有记录,如果当前使用的是0800类型,那么表示的就是一个ip的数据包,这个使用的是0806类型,那么表示就是一个ARP请求,如果使用的是8035,那么表示的是RARP请求报文

ARP协议

这里我假设一个场景,有一个数据包要从A主机传递到B主机,经过一系列传输后,传递到了入口路由器,假设这个入口路由器叫做路由器d,那在它接受到这个数据包之后,根据子网掩码的运算,发现此时这个路由器d直接相连的网络就是这个数据包的目的地,那么这就意味着这个路由器d要经过内网转发,把数据交给主机b,那这就意味着一件事,对于数据包来说,它必须要知道主机b的mac帧地址,这样才能把数据送到主机b,那现在的问题是,路由器d接受到了这个报文,只知道目标主机b的ip地址,但是不知道主机b的mac地址,所以在内网交付的过程中,路由器d是无法把数据交给主机b的

所以现在对于路由器d来说,它必须要有一种方法,能根据ip地址转换成目标主机的mac地址,只有得到了对方的mac地址,才能把信息数据交给主机b,所以在一个局域网中,这种把ip地址和mac地址相关联的方法,就叫做是ARP协议

在这里插入图片描述

如上图所示,展示的就是ARP协议的一个基本的过程,主机a通常就是入口路由器,它和所在局域网当中的所有主机进行相连,当它要进行内网传递的时候,就要发送一个ARP请求包,然后去获取这个主机的mac地址,如果获取成功了,就把这个数据包发送出去,如果没成功这个数据包就发送失败了

ARP协议报头

既然是协议,那么就意味着ARP协议也是有报头的,那么这里对于ARP协议的报头进行理解:

在这里插入图片描述

如上图所示,展示的是ARP协议的报文信息,而前面的字节表示的是报头,后面的28字节ARP请求和应答表示的是有效载荷,那我们先说这个报头的信息

对于报头来说,头部有这个以太网的目的地址和源地址,ARP协议是属于mac帧的上层的,但是它又是属于数据链路层的

对于有效载荷来说,第一个参数是硬件类型,一般来说说的是网络类型,这里一般填写的也是以太网,一般写1就行,不过有时候也可能会有无线网的信息,第二个参数是协议类型,协议类型的意思就是要转化的地址,比如说这个ARP协议是要转换成mac地址,那么这里一般的固定写法就是写成0800,代表的是要把ip地址转换成mac地址,再说后面的类型,硬件地址长度和协议地址长度,硬件地址长度对于以太网来说是6字节,对于ip地址来说是4字节,这些字段的内容一般都是固定的,直接填写就好

重点是后面的这个op字段,这个op字段如果写的是1,表示的这是一个ARP请求,如果写的是2,表示的这是一个ARP应答,比如作为入口路由器来说,它作为发起者,它本身填写的就是1,而如果作为接收端要返回,那么写的就是2,后面是发送端的ip地址和以太网地址,还有目的端的以太网地址和ip地址

在首次发起请求的时候,是并不知道这个信息的,所以对于目标的这些不清楚的字段,一般用全f来进行表示

所以我们可以看到对于整个网络协议栈来说,是分为四层的,其中在最底层的叫做mac帧,mac帧的上层是ARP协议,这个ARP协议也是属于数据链路层,这俩是在一层的,所以在网络中进行路由的时候,路由表当中是会包含有主机相连的信息

ARP的周边话题

下面对于ARP的周边问题进行解释

ARP的触发机制?

数据包从a主机到b主机的这个过程,是需要到入口路由器的,然后入口路由器再传递到主机b,而这个ARP机制并不会重复去做,只有在ARP缓存失效的时候才会触发这个ARP机制

ping问题

实际上,对于每一个子网来说,都有自己的内网ip和内网对应的子网掩码,而在网络中是存在一条叫做ping的命令的,这个命令就是给目标主机发送一个报文,而主要目的是要收到目标主机的应答,它的作用主要是用来检测网络的连通性的报文,所以依据这个ping命令,是可以做到获取同一个网段的所有人的ip地址和mac地址的,换句话说,通过我的ip和子网掩码,可以得到我的网络号,根据我的网络号再拼接ip地址,就能ping所有的主机,得到所有主机的ip地址和mac地址

ARP应答的问题?

当ARP应答获取成功了之后,那么就会把mac地址和ip地址缓存起来,形成一个对应关系,而这个缓存是有时间限制的,太长的缓存信息就被丢弃了,那假设现在有一个主机的网卡被更换了呢?这就意味着mac地址也会被更换,所以ARP协议对于收到了新的ARP信息之后,会自动更新为最新的信息,这都没问题,但是会出现一个问题

假设现在有另外一个主机m,它接入到了这个网段当中,它有ipm和macm,那么假设未来它构建一个报文,经过内网转发,直接一直向主机a发送ARP的应答,那么对于路由器来说,就会构建出一个主机b和macm的映射关系,那这其实是一个比较恐怖的事,因为未来这个路由器向主机b发送的消息,都会推送到主机m上,而转到主机b上的信息因为mac地址不匹配,反而会被丢弃,那这个主机m就被叫做是一个中间人机器


http://www.ppmy.cn/news/1408965.html

相关文章

vue 浅解watch cli computed props ref vue slot axios nexttick devtools说明使用

Vue.js 是一个强大的前端框架,它提供了很多有用的功能和工具。你提到的这些特性(watch、cli、computed、props、ref、slot、axios、nextTick、devtools)在 Vue 中各自扮演着不同的角色。下面我会逐一解释这些特性如何在 Vue 中使用&#xff1…

Unity自定义框架(1)-----------单例模式

前言: Unity作为一款强大的游戏开发引擎,其基础框架的设计对于项目的结构和性能有着重要的影响。其中,单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。 什么是单例模式&#xff1f…

用一个程序解决SQLite常见的各项操作(实用篇)

文章说明: 本篇文章是在之前的一篇文章SQLite3进行数据库各项常用操作基础上写的,将SQLite涉及到的常用的几种操作,以函数的形式处理成相互调用的形式。 因为之前的文章对基础操作已经解释过了,所以这里直接放置可执行代码和结果…

2024-04-02 问AI:介绍一下深度学习中的 “迁移学习”

文心一言 迁移学习(Transfer Learning)是深度学习中一种重要的机器学习方法,其核心思想是将为某个任务A开发的模型作为初始点,重新使用在为任务B开发模型的过程中。这种方法的目的是通过从已学习的相关任务中转移知识&#xff0c…

20240327-PCL-1.41.0安装说明-VS2022-CMAKE篇

20240327-PCL-1.41.0安装说明-VS2022-CMAKE篇 一、软件环境 Win10 x64 22h2 Junecmake 3.29.1VSCODE v1.87.2GIT v2.29.2标签:win10 22h2 vscode cmake分栏:C 二、硬件环境 Win10 x64的PC台式机 三、下载最新版本PCL-1.41.0 方法一 https://githu…

OMP实现压缩感知的实现(MATLAB)

本文介绍通过DWT和OMP实现压缩感知。 不同的是,将DWT得到的低频放到了作为稀疏矩阵的顶部。 压缩感知 压缩感知算法是一种用于从高维度数据中恢复稀疏信号的方法。它通常用于处理信号的采样和重建,例如图像或音频。以下是压缩感知算法的一般实现细节: 信号表示: 压缩感知算…

智慧牧场数据 7

1 体征数据采集 需求:获取奶牛记步信息 三轴加速度测量:加速度测量计反应的加速向量与当前的受力方向是相反,单位为g 陀螺仪,是用来测量角速度的,单位为度每秒(deg/s) 2000deg/s 相当于1秒钟多少转 1.1…

异常处理之Java异常体系

Throwable java.lang.Throwable 类是Java程序执行过程中发生的异常事件对应的类的根父类。 Throwable中的常用方法: public void printStackTrace():打印异常的详细信息。 包含了异常的类型、异常的原因、异常出现的位置、在开发和调试阶段都得使用prin…