Linux:数据链路层

文章目录

  • 路由表
  • 数据链路层
  • 分片
  • 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.mzph.cn/news/795551.shtml

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

相关文章

Ubuntu18.04下利用conda虚拟环境实现ROS Melodic编译python3的cv_bridge踩坑全记录

众所周知ros依赖python2.7环境,而深度学习最低要求是python3.x。因此在实现的过程中我遇到很多关于ros catkin_make失败,python路径找不到,以及OpenCV-python找不到版本,cv2不能import等等问题。我自认为是由于ros和深度学习的python版本或者其他包不兼容的事情。 再说一下…

【python毕业设计】基于Python的医院信息管理系统的设计与实现(源码+数据库+毕业论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

Google视觉机器人超级汇总:从RT、RT-2到AutoRT、SARA-RT、RT-Trajectory

前言 随着对视觉语言机器人研究的深入,发现Google的工作很值得深挖,比如RT-2 ​想到很多工作都是站在Google的肩上做产品和应用,​Google真是科技进步的核心推动力,做了大量大模型的基础设施,服 故有了本文&#xf…

【前端Vue】Vue0基础完整教程第5篇:vue指令(下),成绩案例【附代码文档】

Vue从0基础到大神学习完整教程完整教程(附代码资料)主要内容讲述:vue基本概念,vue-cli的使用,vue的插值表达式,{{ gaga }},{{ if (obj.age > 18 ) { } }},vue指令,综合…

更高效、更简洁的 SQL 语句编写丨DolphinDB 基于宏变量的元编程模式详解

元编程(Metaprogramming)指在程序运行时操作或者创建程序的一种编程技术,简而言之就是使用代码编写代码。通过元编程将原本静态的代码通过动态的脚本生成,使程序员可以创建更加灵活的代码以提升编程效率。 在 DolphinDB 中&#…

【Python系列】将生成的 JSON 数据写入 JSON 文件

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

LeetCode-热题100:45. 跳跃游戏 II

题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j < n 返回到达 nums[n…

面试经典-Spring篇

1、解释Spring框架中bean的生命周期 实例化 通过反射去推断构造函数进行实例化 实例工厂、静态工厂 属性赋值 解析自动装配&#xff08;byname、bytype、 constractor、 Autowired&#xff09; 循环依赖 初始化 调用XXXAware回调方法&#xff08;BeanNameAware、BeanFactoryAw…

移动Web学习05-移动端适配Less预处理器

7、移动端适配 7.1、什么是适配&#xff1f; 简单理解就是、同一个网页&#xff0c;在不同屏幕分辨率的设备下、显示还是一样的&#xff0c;你可以理解为、网页当中的图片&#xff0c;盒子之间的距离、文字的大小、随着屏幕分辨率的变化而变化 前面我们学习了flex布局的方式…

Yalmip使用教程(7)-求解器的参数设置

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 这篇博客将详细介绍yalmip工具箱中常用的求解器设置选项。 1.求解器的基本设置 使用sdpsettings函数可以对求解的相关参数进行设置。最常用的设置…

mysql——认识

一、有哪些数据库 db&#xff1a;database 数据的仓库&#xff0c;有条理的组织起来 DBMS&#xff1a;数据库管理系统 常见的DBMS&#xff1a; 1.mysql 2.oracle &#xff1a;甲骨文 3.Access &#xff1a;微软 4.PostgreSQL 5.SQLite &#xff08;小型&#xff09; 6.…

Java学习day6-集合

集合指一组用于储存和操作数据的类和接口&#xff0c;提供各种数据结构和算法&#xff0c;以在程序中高效地管理和操作数据 特点&#xff1a;与数组相比&#xff0c;集合可以自动扩容&#xff0c;只需向其中添加元素即可&#xff08;与Cvector类似&#xff09;&#xff1b;数组…

软考之零碎片段记录(七)+复习巩固(二)

一、上新 1. 有向图 从顶点A到顶点B的边&#xff0c;不等于从B到A的边。 2. 广度优先 遍历开始节点&#xff08;第一层&#xff09;的邻节点&#xff08;从左至右顺序&#xff09;&#xff0c;邻接点设为第二层根据1中遍历邻接点从左往右的顺序遍历。 bilibili视频《广度优…

P8783 [蓝桥杯 2022 省 B] 统计子矩阵

题目:P8783 [蓝桥杯 2022 省 B] 统计子矩阵 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 代码&#xff1a;&#xff08;部分解析在代码中&#xff09; #include<bits/stdc.h> using namespace std; long long a[1010][1010]; long long pre[1010][1010]; long long …

【云原生篇】K8S配置管理之ConfigMap 和 Secret

在 Kubernetes (K8s) 中&#xff0c;ConfigMap 和 Secret 是用于存储配置数据的资源对象&#xff0c;它们允许你将配置与容器镜像分离&#xff0c;从而增加了应用的灵活性和可移植性。这两种资源的主要区别在于它们存储的数据类型和用途&#xff1a;ConfigMap 用于存储非敏感的…

《C++程序设计》阅读笔记【5-引用】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;《C程序设计》阅读笔记 本文对应的PDF源文件请关注微信公众号程序员刘同学&#xff0c;回复C程序设计获取下载链接。 1 引用1.1 概念1.2 和引用相关的操作1.2.1 什么能被引用 1.3 用引用传…

WebKit结构揭秘:探秘网页渲染的魔法之源

一、WebKit之心&#xff1a;渲染引擎的魔力 WebKit的渲染引擎是其核心所在&#xff0c;它犹如一位技艺高超的魔法师&#xff0c;将HTML、CSS和JavaScript的魔法咒语转化为绚丽的网页画面。它解析代码&#xff0c;绘制页面&#xff0c;让网页内容跃然屏上&#xff0c;展现出无尽…

openpyxl的使用

1、中文手册 openpyxl-一个Python库&#xff0c;用于读/写excel2010 xlsx/xlsm文件 — openpyxl 3.0.5 文档

单片机学习day1(点亮流水灯)

1. 位运算 &:按位与 &#xff08;与0得0、与1不变&#xff09;&#xff08;全1为1&#xff0c;有0得0&#xff09;指定位置1 |:按位或 &#xff08;或1得1、或0不变&#xff09;&#xff08;全0为0&#xff0c;有1得1&#xff09;指定位置0 ^:按位异…

ROS 2边学边练(15)-- 写一个简单的服务(C++)

前言 此篇我们即将编写一个简单的服务&#xff08;service&#xff09;通信例子&#xff0c;客户端节点向服务端节点发出请求&#xff08;.srv文件中规定了通信的数据结构格式&#xff09;&#xff0c;服务端节点收到请求后将结果回复给客户端节点&#xff0c;一问一答&#xf…