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的欺骗工具欺骗 可以跟室友商量,想办法让室友断网

相关推荐
Hao想睡觉4 分钟前
CNN卷积神经网络之VggNet和GoogleNet经典网络模型(四)
网络·人工智能·cnn
dessler17 分钟前
RabbitMQ-镜像队列(Mirrored Queues)
linux·运维·rabbitmq
瑾曦21 分钟前
Docker相关命令
linux
发抖吧小喵喵25 分钟前
rpm包直接安装新系统缺少依赖问题处理
linux·运维·服务器
码农101号1 小时前
Linux中Docker Swarm介绍和使用
linux·spring cloud·docker
Nazi61 小时前
dockerfile基础
linux·运维·docker·容器·云计算
所念皆为东辞1 小时前
elk部署加日志收集
linux·elk·elasticsearch·centos
TLucas2 小时前
Centos 7部署.NET 8网站项目
linux·nginx·postgresql·centos·.net
Doris_LMS6 小时前
在Linux下安装nginx(保姆级别)
linux·运维·nginx·centos
超級二蓋茨8 小时前
在 CentOS 上安装 FFmpeg
linux·ffmpeg·centos