Linux:深入理解数据链路层

实际上一台主机中,报文并没有通过网络层直接发送出去,而是交给了自己的下一层协议——数据链路层!!

一、理解数据链路层

网络层交付给链路层之前,会先做决策再行动(会先查一下路由表,看看目标网络是不是在当前子网中,如果不在就发送给下一跳的路由器,封装路由器的mac帧报头      在的话就发给自己子网内的机器  封装该机器的mac帧报头) 

所以IP层解决的是跨网络问题,但是数据链路层解决的是同一个子网内跨主机的问题!!!

二、以太网

2.1 认识以太网

   "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;

数据链路层解决的是直接相连的主机(包括电脑、路由器、手机等)之间进行数据交付的问题!! 

例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;

以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;

2.2 以太网帧格式

 类型是0800,就是正常ip报文,类型是0806则是ARP请求(用IP去广播询问mac地址),类型是0835则是RARP请求(就是用mac地址去问ip地址)

问题1:mac帧是如何解包和封装的??

——>通过定长报文(长度由MTU决定)

问题2:如何做到分用?

——>局域网通信过程中,其实所有的主机都能收到报文(吃瓜群众很多,意思就是大家都能收到只不过和自己对比之后发现不是自己的就会丢弃),但是当他解开mac帧报头后发现目的mac帧地址是自己的地址,才会把报文向上交付,否则就丢弃  

2.3 局域网通信原理

      当我信息从上层交付到网络层的时候,此时我会在网络层查一下当前的路由表(决策),看看目标网络是否在当前的子网里,如果在的话就直接封装到该主机的mac帧地址报头发到自己的局域网中,如果不在的话,就会找到默认下一跳的路由器然后封装到该路由的的mac帧地址报头,前往下一个网络寻找。

      每当到达一个子网的入口路由器时,都会先解开mac报头向上交付给网络层,然后再搜索网络层的路由表判断当前报文是否在该网络,然后根据决策继续封装新的mac报头。

     然后当到达某个网络的入口路由器确认该报文要发给该网络的主机的时候,就会封装目标主机的mac帧然后直接发到局域网中,只有目标主机可以收到报文,其他主机收到报文后会丢弃。

2.4 理解mac地址和ip地址 

mac地址:

        MAC地址用来识别数据链路层中相连的节点;

        长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)

       在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).

我们会发现在局域网通信的这个过程中,源IP和目标IP一致不变,但是源mac地址和目的mac地址一直在变! 

源IP和目的IP相当于是 :你从哪里来,要到哪里去?——>东土大唐-西天 

源mac地址和目的mac地址相当于是:你上一站从哪来,下一站要到哪去?——>车迟国-火焰山

IP地址描述的是路途总体的起点和终点; MAC地址描述的是路途上的每一个区间的起点和终点; 

2.5 认识MTU和MSS

MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.

       以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;

        最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU; 

2.5.1 MTU对IP协议的影响(分片)

由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.

将较大的IP包分成多个小包, 并给每个小包打上标签;

每个小包IP协议头的 16位标识(id) 都是相同的;

每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最 后一个小包, 是的话置为1, 否则置为0);

到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;

一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据;(而是由TCP负责)

 问题1:为什么切片不在数据链路层、不在TCP层做,而是在IP层做??

 ——>因为如果是在最底层的数据链路层做分片,我们还需要去面对不同的物理网络的驱动程序做更改(不属于OS的范畴了,而是硬件厂商的范畴)

         而如果是在上层的传输层或者应用层做分片,我们还要具体关心是哪种协议,每种协议还得自己实现关于切片的模块,一方面增加了路由器的复杂度,另一方面处理效率也低,路由器在处理IP层以上的高层协议一般采用纯粹的软件来完成,那样效率会更低。

      而IP层是软件设计里常用的适配层,我们只需要读取IP头信息,至于里面传输的是TCP/UDP/ICMP/OSPF/GRE/ESP协议我们并不关心,也不需要关心!!所以由IP层做分片是成本最低的选择!!当然最后组装也要有由IP层来组装

问题2:IP层是如何组装的呢???

前置问题a:你怎么知道这个IP被分片了呢??

——>片偏移!=0 || 更多分片==1  (反之没有分片就是片偏移==0 &&更多分片==0)

前置问题b:你怎么确保所有的片都聚到一起了那??

——>

丢了第一个的情况:只需查看这些分片中是否有13位片偏移为0的分片,如果存在,则第一片分片没有丢失;如果不存在,则第一片分片丢失

丢中间的情况:只需对这些分片按片偏移量进行排序,在遍历这些分片时,检查 该分片的片偏移量 * 8 + 该分片的有效载荷大小 == 下一片的片偏移量 * 8,如果等于,表示中间没有分片丢失;如果不等于,表示中间有分片丢失。

丢最后一个的情况:只需查看这些分片中是否存在MF 为 0的分片即可,如果存在,则最后一片分片没有丢失;如果不存在,则最后一片分片丢失。

——> 所以16位标识+更多分片+片偏移 可以确保我们的报文安稳收到!!

问题3:建不建议分片呢??

——> ip中其中一个分片丢失了,那么整个报文都会被丢弃重发!!分片会增加丢包的概率

 数据测试:假设有3000字节,每一个分片都要20报头,但是一个分片长度最多1500

2.5.2 MTU对UDP协议的影响 

     一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.

      这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在 网络层被分片, 整个数据被丢失的概率就大大增加了.

2.5.3 MTU对于TCP协议的影响

       TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size); TCP在建立连接的过程中, 通信双方会进行MSS协商.

      最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).

      双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.(三次握手时协商,因为一旦分片,那么双方由于硬件差异MTU可能会不一样,所以需要统一一下MSS由TCP来控制)

     然后双方得知对方的MSS值之后, 选择较小的作为最终MSS. MSS的值就是在TCP首部的40字节变长选项中(kind=2);

2.5.4 MSS和MTU的关系

 查看硬件地址和MTU

 

使用ifconfig命令, 即可查看ip地址, mac地址, 和MTU; 

2.6 数据碰撞

         因为局域网中一台主机往局域网中发消息的时候,所有主机都会收到,如果此时有多台主机都在发消息,那么就会出现数据碰撞的问题!!

         所以为了避免数据蹦装,我们就得想办法保证任何一个时刻只有一个主机在发送消息,所以我们需要有碰撞避免算法,来将所有主机发送消息的时间给错开(有些主机需要等一等)

     可是如果一个局域网主机太多了,那么碰撞的可能性还是会很大,因此如果一些不法分子通过其中一台主机疯狂局域网塞垃圾数据,那么也很容易造成局域网瘫痪!! 

     除了碰撞避免算法,其实在还有交换机(划分碰撞域)的存在。

     其实我们的硬件有MTU的限制而产生分片,除了本身硬件的原因,还有一个原因就是避免数据帧一次发送过大,才能让报文更方便进入局域网中,在时间维度上让报文尽可能岔开发送(所以一般是46-1500)

     可是链路层对ip层说:哥们,你一次数据别发太大,我扛不住

     ip说:这不关我的事,我就是个跑腿的,发多少又不是我说了算的,可靠性是tcp保证的!

    链路层:我不管,反正我最大就1500, 你去跟tcp商量一下,想想办法

    ip对tcp说:因为我还有自己的报头,所以你最大就给我1480吧,别超过了

   tcp说:好吧,可是我自己也有报头,那我除了20个报头,我剩下最多可以有1460的有效载荷,而这个有效载荷就是MMS!!

      这就是为什么滑动窗口要一块块发送而不是整体发送,这是因为有MSS在约束他!!但是因为不同主机硬件有差异,MTU有差异,所以我们的TCP在三次握手的时候必须通过选型和对方协商一下,以最小的为准,这样避免在通信的时候不会出现太多的分片和组装,也避免了对方因数据包太大而无法接收的情况!

三、ARP协议

         虽然我们在这里介绍ARP协议, 但是需要强调, ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议

3.1 为什么要有ARP协议

         所谓的数据,要发送到目标网络,本质上是通过无数个连续的子网实现的!! 

  

 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;

      数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃(需要重新封装mac帧),因此在通讯钱必须获取目的主机的mac地址

 因此ARP协议就是用来建立主机IP地址和MAC地址的映射关系的!

 3.2 APR的报头

ARP协议是属于mac帧的上层协议,但是归属到数据链路层! 

ARP报头:

 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的

硬件类型指链路层网络类型,1为以太网;(一般固定)

协议类型指要转换的地址类型,0x0800为IP地址;(一般固定)

硬件地址长度对于以太网地址为6字节;(一般固定)

协议地址长度对于和IP地址为4字节;(一般固定)

op字段为1表示ARP请求,op字段为2表示ARP应答。(重要,决定这个报文是请求还是应答)

 3.3 模拟一次ARP过程

 1、填写ARP请求

 

      前4个基本固定,而请求的op为1,后面四个地址我们唯独不知道目的mac地址,我们填FF:FF:FF:FF:FF:FF

2、给ARP请求封装mac帧报头

 请求的mac帧类型是0806 而我们不知道以太网的目标地址,可以填FF:FF:FF:FF:FF:FF表示广播给该子网内的全部主机

 3、该ARP请求被丢到了网络中,然后各个主机收到后先开始解析mac报头

4、假设我们的非目标主机解开mac报头后发现该报头的目标mac地址是 FF:FF:FF:FF:FF:FF,说明这个是广播报文所以必须受理。他会接着将该arp请求交给arp软件层

 5、因为我们收到的arp报文可能是响应,也可能是请求,因此我们首先要先看op,看看是请求还是响应,然后我们发现是请求

 6、于是我们确认是请求后,然后看一下目的IP是不是我自己,发现不是我自己,于是我就把报文丢弃!同理其他的非目标主机也会在此时丢弃该报文

注意:因为是广播 所有非目标主机都受理了,所以报文在ARP软件层被丢弃的!!

7、唯独目标主机在收到该请求后,重复上述步骤发现里面存的目标IP地址正好是自己的地址,于是他要给开始给对方回复ARP响应

 8、此时我们通过之前的arp请求可以知道源主机的mac地址和ip地址,于是给对方定向发送了arp请求

9、因为此时是定向,不是广播,所以所有的非目标主机在收到之后直接在mac帧层丢弃了! 然后我们将选项该为2.意思是响应

10、当该子网的入口路由器收到该报文之后,交给了ARP软件层,通过op确认目标主机发来的响应之后, 然后会读取发送端的mac地址,确认这就是我们想要找的主机的mac地址,然后建立了在自己的arp表里面建立了映射

11、此时我们再将之前的报文向下交付给mac帧层的时候,就可以通过映射找到该目标ip的mac帧地址,重新给他封装mac帧表头,将报文发送给目标主机。

 总结:

1、因为主机可能会收到arp的应答,也可会收到arp的请求,因此无论是收到任何的arp报文,都是先看OP,这决定是该报文是请求还是应答!!

2、如果是请求,意味着需要查看一下自己的目的以太网的ip看看是不是和自己的ip一样,确认之后再根据发送端的ip和mac地址发送响应回去。

3、如果是应答,意味着就可以建立该报文的发送端的ip和mac地址的映射关系,而之前发送过来的报文就可以在向下交付的时候通过查这个映射知道自己目标主机的mac地址从而封装mac帧报头

4、请求以广播形式所有主机都得受理,只不过非目标主机会在arp软件层丢弃,而响应是定向发送,所以非目标主机是在mac帧层被丢弃

3.4 APR周边知识总结

1、主机的mac地址的ip地址会被主机缓存起来,临时缓存起来

      每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如 果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址

 问题1:为什么要有缓存表呢??

——>

(1) 减少网络通信量:

当主机需要发送数据到另一个IP地址时,它会首先检查ARP缓存表中是否已经存在该IP地址对应的MAC地址。如果存在,则直接使用该MAC地址发送数据,无需发送ARP请求进行广播查询,从而减少了网络通信量,提高了通信效率。

(2) 加快网络通信速度:

缓存表减少了查找MAC地址所需的时间,因为查询缓存通常比广播ARP请求并等待响应要快得多。这有助于加快数据包在网络中的传输速度。

问题2:为什么表项要有过期时间而不是一直有效呢??

——>

(1)确保数据的有效性:

     网络设备的MAC地址可能会因为多种原因发生变化,如设备重启、故障恢复或更换网络接口卡等。如果ARP缓存表中的表项一直有效,那么即使MAC地址已经发生变化,发送方仍然可能使用旧的MAC地址发送数据,导致数据无法正确到达目的地。设置过期时间可以确保缓存中的MAC地址保持最新。

(2) 防止缓存污染和攻击

       在某些情况下,恶意用户可能会尝试通过发送伪造的ARP响应来污染其他主机的ARP缓存表,从而导致数据包被发送到错误的目的地。设置过期时间可以限制这种攻击的影响范围,因为即使缓存被污染,表项也会在一段时间后失效。

(3)节省系统资源

       随着时间的推移,ARP缓存表中可能会积累大量的表项。如果表项一直有效,那么这些表项将占用 大量的系统资源(如内存)。设置过期时间可以允许系统定期清理不再需要的表项,从而释放系统资源供其他应用使用。

2、 我们可以通过自己的IP和子网掩码,获取网络号,然后拼接IP地址,ping(一个网络工具,通过发送ICMP回声请求信息到目标主机并等待回应)所有的主机从而得到所有主机的IP和mac

3、如果我收到了多次同样的arp应答,我会以最新的为主

4、A主机到B主机,不仅仅是在目标网络,其实中间过程每经过一次路由器(下一跳),就是从该子网的入口路由器到出口路由器,在没有缓存的情况下一般都需要用arp去询问路由器的mac地址!

3.5 ARP欺骗 

 一开始,我们双方互相给对方发送过arp请求,所以双方都建立了对方主机的ip和mac映射

可 

3.5.1 单向欺骗(有感觉,会被强制断网)

     中间主机通过定向向源主机发送虚假的arp响应,然后修改了源主机的arp映射表,从而定向地让你的目标主机断网!!

3.5.2 双向欺骗(没有感觉,但数据会被窥探) 

     中间主机都给双方发送arp响应,这样双方再给对方发消息的时候都会推送给中间人,此时中间的信息会被窥探,但你并不能察觉!

 文心一言搜索:arp的欺骗工具欺骗    可以跟室友商量,想办法让室友断网

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

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

相关文章

Python基本语法(类和实例)

类和实例 类和对象是面向对象编程的两个主要方面。类创建一个新类型,而对象是这个 类的实例,类使用class关键字创建。类的域和方法被列在一个缩进块中,一般函数 也可以被叫作方法。 (1)类的变量:甴一个类…

2025 年如何使用 Pycharm、Vscode 进行树莓派 Respberry Pi Pico 编程开发详细教程(更新中)

micropython 概述 micropython 官方网站:https://www.micropython.org/ 安装 Micropython 支持固件 树莓派 Pico 安装 Micropython 支持固件 下载地址:https://www.raspberrypi.com/documentation/microcontrollers/ 选择 MicroPython 下载 RPI_PIC…

flink rocksdb状态说明

文章目录 1.默认情况2.flink中的状态3.RocksDB4.对比情况5.使用6.RocksDB架构7.参考文章8.总结提示:以下主要考虑flink 状态永久存储 rocksdb情况,做一些简单说明 1.默认情况 当flink使用rocksdb存储状态时。无论是永久存储还是临时存储都可能会落盘写文件(如果没有配置存储…

安装SDL和FFmpeg

1、先记录SDL 这玩意还是有一点讲究的 具体步骤: 下载 SDL包: 链接:https://www.libsdl.org/release/SDL2-2.0.14.tar.gz 可以用迅雷,下载完之后, 解压: tar -zxvf SDL2-2.0.14.tar.gz进入安装目录 cd …

2022年408真题及答案

2022年计算机408真题 2022年计算机408答案 2022 408真题下载链接 2022 408答案下载链接

Spring AI聊天模型API:轻松构建智能聊天交互

Spring AI聊天模型API:轻松构建智能聊天交互 前言 在当今数字化时代,智能聊天功能已成为众多应用程序提升用户体验、增强交互性的关键要素。Spring AI的聊天模型API为开发者提供了一条便捷通道,能够将强大的AI驱动的聊天完成功能无缝集成到…

Softmax回归与单层感知机对比

(1) 输出形式 Softmax回归 输出是一个概率分布,通过Softmax函数将线性得分转换为概率: 其中 KK 是类别数,模型同时计算所有类别的概率。 单层感知机 输出是二分类的硬决策(如0/1或1): 无概率解释&#x…

【React】Hooks 解锁外部状态安全订阅 useSyncExternalStore 应用与最佳实践

一、背景 useSyncExternalStore 是 React 18 引入的一个 Hook;用于从外部存储(例如状态管理库、浏览器 API 等)获取状态并在组件中同步显示。这对于需要跟踪外部状态的应用非常有用。 二、场景 订阅外部 store 例如(redux,mobx,Zustand,jo…

Dify框架面试内容整理-如何评估基于Dify开发的AI应用的效果?

评估基于 Dify 开发的 AI 应用效果,需要从 用户体验、技术性能 与 业务价值 三个层面综合衡量。以下是详细的评估框架,涵盖三个关键点: 用户反馈与满意度

Linux 系统下VS Code python环境配置!

Anaconda安装: 在 Linux 系统中安装下载好的 Anaconda3-2024.10-1-Linux-x86_64.sh,可按以下步骤操作: 1. 赋予安装脚本执行权限 打开终端,切换到安装包所在目录(假设在 software 文件夹中),…

项目实战-基于信号处理与SVM机器学习的声音情感识别系统

目录 一.背景描述 二.理论部分 三.程序设计 编程思路 流程图 1.信号部分 创建数据 generate_samples.py 头文件 生成函数 generate_emotion_sample 传入参数 存储路径 生成参数 创建基础正弦波信号 调制基础正弦波 对于愤怒可以增加噪声 归一化信号 存储 主函…

虚幻引擎作者采访

1万小时编程_哔哩哔哩_bilibili https://www.youtube.com/watch?v477qF6QNSvc 提姆斯温尼是一位传奇性的视频游戏程序员,Epic Games 的创始人兼首席执行官。 该公司开发了虚幻引擎、堡垒之夜、战争机器、虚幻竞技场等许多开创性和有影响力的视频游戏。 他哥哥…

如何限制pod 进程/线程数量?

在 Kubernetes 中限制 Pod 的 进程数(PID 数量) 和 线程数,需要结合 Linux cgroup 控制 和 容器运行时配置。以下是具体方法和示例: 一、限制进程数(PID 数量) 1. 通过 pids cgroup 控制器限制 原理&…

使用 Hugging Face 镜像站快速下载大模型

在国内使用 Hugging Face 下载模型时,经常遇到连接慢、断点续传失败等问题。本文记录一个稳定、快速下载模型的命令行脚本,并支持设置模型缓存路径和目标目录,方便后续统一管理。 1. 设置 Hugging Face 镜像站 为了提升国内访问速度&#xf…

原语的使用

1、什么是原语?? 原语( primitive ),是FPGA开发环境所提供的一系列逻辑功能单元。往往与FPGA芯片的厂家精密相连,不同厂家的原语往往不能通用。 2、需要使用原语的情况 一般来说,在进行HDL cod…

大模型核心技术及架构解析

大模型核心技术及架构解析 大语言模型(Large Language Models, LLMs)已成为当前AI领域最重要的技术突破之一。以下是其核心技术和架构的全面分析: 一、核心技术组成 1. 基础架构技术 技术说明代表应用Transformer自注意力机制基础架构GPT, BERTMoE架构混合专家模…

ES6/ES11知识点 续三

rest参数 Rest 参数(Rest Parameters)是 ES6 引入的一个非常实用的特性。它允许函数接受不定数量的参数,并将这些参数作为一个数组存储,从而简化了处理可变参数的代码。 Rest 参数语法 Rest 参数使用 … 语法,紧跟着…

记忆翻牌游戏:认知科学与状态机的交响曲

目录 记忆翻牌游戏:认知科学与状态机的交响曲引言第一章 网格空间拓扑学1.1 自适应网格算法1.2 卡片排布原理第二章 状态机设计2.1 状态跃迁矩阵2.2 时空关联模型第三章 记忆强化机制3.1 认知衰减曲线3.2 注意力热力图第四章 动画引擎设计4.1 翻牌运动方程4.2 粒子反馈系统第五…

STM32外设-GPIO输出(不含复用)

STM32外设-GPIO输出(不含复用) 一,GPIO模式简介1,输入模式2,输出模式3,模拟模式4,复用模式 二,输出模式详解1, 输出类型1,推挽输出:2,…

58认知干货:创业经验分享及企业形式的汇总

机会永远都是留给有眼光、能发现机会的人,而不是留给有准备的人!往往机会就在身边,普罗大众却无法发现,而真正适合创业的人,天然具备这方面的能力。 当然后天的补足也未尝不可:“故常有欲以观其微,常无欲以观其妙。””引用《道德经》 读懂这句话自然便会拥有对商业和…