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,一经查实,立即删除!

相关文章

【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 的首页,持续学…

面试经典-Spring篇

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

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

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

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

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

Java学习day6-集合

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

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

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

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

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

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

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

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

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

Unity类银河恶魔城学习记录12-4 p126 Item Tooltip源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI.cs using System.Collections; using System.Collections.Generic; usi…

【面经】interrupt()、interrupted()和isInterrupted()的区别与使用

📝个人主页:五敷有你 🔥系列专栏:面经 ⛺️稳中求进,晒太阳 interrupt方法 如果打断线程正在sleep,wait,join会导致被打断的线程抛出InterruptedException,并清除打断标记。如…

Redis的配置文件详解

单位:Redis配置对大小写不敏感! 注意这里:任何写法都可,不区分大小写。 units are case insensitive so 1GB 1Gb 1gB are all the same.包含:搭建Redis集群时,可以使用includes包含其他配置文件网络&…

关于 elf loader 的编写

可以使用如下命令观看 elf 文件的信息 readelf -a build/ramdisk.img | vim -在编写 elf loader 的时候,实际上只有下图这一部分 “Program Headers” 是有用的 凡是类型为 “LOAD” 的就是需要加载进内存的部分 所以,只要把这些部分加载进内存里&…

数据库不用mmap

你确定你想用 MMAP 实现数据库么?_哔哩哔哩_bilibili MMAP 的随机读与顺序读的性能表现不好,以及对于写主要是不可控的刷入时机以及代码冗余,所以 MMAP 不适合在数据库中使用。 mmap是posix系统调用,它提供由操作系统管理内存映…

(C)1008 数组元素循环右移问题

1008 数组元素循环右移问题&#xff1a; 问题描述 输入样例&#xff1a; 6 2 1 2 3 4 5 6 输出样例&#xff1a; 5 6 1 2 3 4 解决方案&#xff1a; #include<stdio.h> #include<string.h> #include<math.h> int main(){int n,k,flag,y,x,final;int a[10000…

Flutter Boost 3

社区的 issue 没有收敛的趋势。 设计过于复杂&#xff0c;概念太多。这让一个新手看 FlutterBoost 的代码很吃力。 这些问题促使我们重新梳理设计&#xff0c;为了彻底解决这些顽固的问题&#xff0c;我们做一次大升级&#xff0c;我们把这次升级命名为 FlutterBoost 3.0&am…