【Linux网络编程】数据链路层--以太网协议

目录

链路层

以太网通信原理

以太网协议

以太网帧格式

MTU(最大传输单元)

MTU对UDP协议的影响

MTU对TCP协议的影响

交换机

数据转发全过程与ARP的引入

ARP协议

ARP协议的基本介绍

ARP协议格式

ARP原理

ARP欺骗原理


链路层

在IP协议章节,我们已经能把一个数据报文跨网络传输到另一台主机。我们当时是默认了,局域网之间的主机是能直接通信的。接下来的问题是:局域网之间的主机如何直接通信

数据从主机A到主机B的时候,可能会经过无数个子网。而链路层解决的,就是数据报文如何在一个子网中,进行转发。

实际上,链路层完成的工作就是局域网的转发。

以太网通信原理

前提:主机可以直接发送数据到自己所连接的局域网上


MAC地址

  • MAC地址的功能:主要用于处于同一个子网之间的主机进行数据路由/转发。

  • MAC地址的唯一性:MAC地址在局域网中必须是唯一的。MAC地址是分配给网络设备(例如网卡、路由器、交换机等)的物理地址,它是由设备的制造商在生产时烧录到设备的网络接口控制器(NIC)中的。

  • MAC地址的格式:每个MAC地址由48位(6个字节)组成,通常以12个十六进制数字表示,分为6组,例如:00:1A:2B:3C:4D:5E。MAC地址的前24位(前3字节)通常是由IEEE分配给设备制造商的标识符,后24位由制造商用于唯一标识每台设备。

在Linux中,通过ifconfig指令可以查看当前主机的mac地址


MAC地址 vs IP地址

1、功能不同

  • MAC地址用于在同一个局域网(或子网)内唯一标识和定位设备,是数据链路层(倒数第二层)的概念。它帮助设备在物理链路上进行直接通信。

  • IP地址用于在整个网络中唯一标识和定位主机,是网络层(倒数第三层)的概念。它允许设备通过路由器跨越不同的子网进行通信。

2、分配方式不同

  • MAC地址由设备的制造商在生产时硬编码到网络适配器中,确保全球范围内的唯一性。这意味着每个网络设备在生产时就有一个唯一的MAC地址。

  • IP地址由网络管理员或者DHCP服务器根据网络配置动态分配或者静态分配给设备。这允许灵活的地址管理和资源利用。

3、主要不同

  • MAC地址是设备的物理地址,固定在设备的网络适配器硬件上,不受网络配置变化的影响。即使设备移动到不同的网络或者子网,其MAC地址也不会改变。

  • IP地址是逻辑地址,允许网络中的设备根据网络配置和需要进行动态分配或更改。它允许设备在不同的网络环境中自由移动和连接。

  • 在NAT技术中,IP地址是会变化的!而MAC地址一般是长时间保持不变的!


MAC地址的替换

当经过了一次路由,一个数据包已经送到了目的MAC地址以后,需要把目的MAC地址变成下一次转发的源MAC地址。把目的MAC地址变成下一次路由的目标主机MAC地址

举个例子:

MAC地址就相当于是一个车站的站点,当你坐车来到一个新的站点以后,你所处的站点(源MAC)肯定会发生变化。而你的下一个站点(目的MAC)也会发生变化


以太网通信过程

假设主机A、主机B、主机C、主机D、主机E都连接了同一个以太网,它们都有自己的MAC地址

如上图,假设mac地址为A的主机发送了一个数据报文,这个报文的目标主机是mac地址为E的主机

  • 这个数据报文的源mac地址为macA,目标mac地址为macE

  • 当主机A的数据报文到达以太网以后,其他主机(B、C、D、E)都能看到这个数据

  • 以太网中的所有主机(除发送方外)都会对这个数据报文进行解包,并对比报文中的目标mac和自己的mac是否相同

  • 若相同,则进行向上交付,若不同,则把数据重新发送到以太网中

  • 所以主机E能收到这个数据报文

数据碰撞:当有多台主机同时向以太网中发送数据时,会造成数据碰撞问题。实际上可以把局域网想象成一个共享资源。

避免碰撞:不同类型的局域网(以太网/令牌环网...)的区别主要是发生数据碰撞时的处理方法不同,对于以太网来说发生碰撞时是直接发了再说,若发生数据碰撞原来的碰撞的数据直接丢弃,碰撞双方的某个主机会停下来等一会,等了一会以后再重新发送数据

当一个局域网有了避免碰撞算法以后,就从共享资源变为了一个临界资源

注意:正因为局域网要进行避免碰撞,所以一个局域网之间主机数量其实越少越好


以太网协议

以太网协议指的是工作在数据链路层的所有协议。以太网协议中包含了MAC协议,ARP协议,RARP协议


以太网帧格式

  • 目的地址:本质是发送方的mac地址

  • 源地址:是接收方的mac地址

  • 类型:它表示该数据帧应该交付给上层所使用的哪个协议。若该值为0800则表示该帧需要交付给IP协议。若该值为0806表示该帧需要交付给ARP协议。若该值为8035表示该帧需要交付给RARP协议

  • 数据:即有效载荷的长度,规定数据长度不能小于46字节,不能大于1500字节

  • CRC:在数据部分之后,用于验证帧在传输过程中是否发生了损坏。


MAC帧如何把有效载荷(数据)交付给上层

分离+交付即可

  • 分离:固定长度(12+4字节)的报头,直接取出头12字节和尾4字节交付给上层即可

  • 交付:根据类型字段,判断出需要交付给哪个协议(IPv4/ARP/RARP)交付即可

具体过程:

  • 主机收到来自局域网的报文以后,先看它的目的MAC地址和自己的MAC地址是否相同,若不相同直接丢弃。若相同则继续进行下一步

  • 主机根据CRC判断该MAC帧是否在数据传输时出错。若出错,一般是直接丢弃。若没出错则进行下一步

  • 主机对MAC帧的报头和有效载荷进行分离,根据报头中的类型字段判断应该把有效载荷交付给上层哪个协议后,直接交付即可


MTU(最大传输单元)

若网络层收到的数据+自己的报头>MTU,那么网络层会对数据进行分片再交付给链路层。当数据到达接收方时,接收方网络层需要自己手动组装,与之相关的话题,在IP协议中我已详细说明!

MAC帧规定了数据的最大传输默认情况下是1500字节。

尽管如此,我们也可以手动设置MTU

bash 复制代码
设置MTU指令:sudo ip link set dev 接口名称 mtu 值
例如:sudo ip link set dev eth0 mtu 1400

一般不建议自己修改MTU值

若MTU设置的过大,会造成的问题:

  • 数据包转发的分片组装问题:尽管你设置了一个较大的MTU,在你的本主机上数据包的分片会得到有效减少,但网络传输数据包不仅仅只经过你的本主机,在传输中可能会遇到各种设备,这些设备的MTU是不同的,这会导致数据包到达这些设备时被分片和组装的问题

  • 兼容性问题:网络传输的中间设备,有些网络设备可能因为种种原因(例如该设备较旧),可能无法处理你这个大的数据包。如果数据包大小超出了这些设备的处理能力(如设备内存过小,设备的缓存不足),它们可能会丢弃数据包或出现异常,从而影响整体数据传输。

若MTU设置的过小,会造成的问题:

  • 开销增大:网络传输中,每一个数据包都需要有报头。提供一个报头以及处理方处理一个报文是有成本的,若MTU过小,那么系统需要提供的数据报头就增加了。接收方需要处理的报文数量也增加了。从而导致效率的问题

  • 网络拥塞:较小的MTU会导致同样长的一段数据被分多个报文进行发送,这可能会导致网络拥塞的情况。尽管这个现象在个体上不明显,但若互联网中的所有主机的MTU都很小,那么网络拥塞就是必然的!


MTU对UDP协议的影响

由于MTU的限制(假设MTU为1500字节),若UDP协议向下交付时的有效载荷长度 > 1472,那么会造成网络层的分片和组装!又因为UDP协议不提供可靠性保障,分片和组装大大提高了UDP数据报文的丢包概率

1472是怎么来的 : MTU = 1500字节 - IP标准协议报头(20字节) - UDP协议报头(8字节)


MTU对TCP协议的影响

由于MTU的限制(假设MTU为1500字节),若TCP协议向下交付时的有效载荷长度 > 1460,那么会造成网络层的分片和组装!因为TCP协议提供了可靠性保障,所以在传输过程中哪怕出现数据包丢失,也能通过重传策略进行弥补。但分片可能导致TCP的重传次数增加,从而影响效率!

1460怎么来的:MTU(1500字节) - IP标准协议报头(20字节) - TCP标准协议报头(20字节)

1460(TCP有效载荷长度)我们称之为MSS


TCP三次握手中MSS的协商

TCP通信双方在进行三次握手建立连接时,需要协商双方的MSS

协商出来的MSS = min(发送方MSS,接收方MSS)

为什么需要协商MSS:

  • 通信双方协商MSS是为了在进行数据传输时尽量避免数据分片。假设发送方MSS为1460,接收方MSS为960,若它们之间不进行MSS的协商,那么接收方每次收到的报文大小都超过了它的MTU,从而导致网络层的分片和组装,提高了重传的风险!

TCP三次握手确定MSS的具体过程

第一次握手:发送方发送一个SYN(请求连接标志位)为1的报头,发送方会将自己的 MSS 值放入 报头的选项字段中。

第二次握手:接收方收到发送方的报头,需要给出应答。即给发送方发送一个ACK(应答标志位)和SYN(请求连接标志位)标志位为1的报头,接收方会将自己的 MSS 值放入这个报头的选项字段中

第三次握手:发送方拿到接收方的MSS值,通过 mss = min(发送方MSS,接收方MSS),确认自己在通信时的MSS并建立连接。接收方也同理


交换机


交换机的使用场景

局域网进行通信时,可能会出现数据碰撞,这就要求碰撞双方主机某一台需要进行等待,这会影响数据包转发时的效率,在局域网中主机设备较少时可能不太明显,但随着局域网中主机数量越多,发生碰撞的概率就越大,那么有没有什么方法可以让一个局域网之间有大量的主机,而又能较小概率发生数据碰撞呢?

实际上是有的,这也就是交换机的功能,划分碰撞域

总的来说,交换机在小型局域网中可能不会对网络有着明显改善,但在大型局域网中,交换机能显著提高网络效率和带宽利用率。


交换机的功能

上图是一个简易的局域网和交换机的模型

注意:交换机是工作在链路层的设备

什么是划分碰撞域?

  • 在上图中,假设没有交换机,那么主机A发送一条数据包以后,别的主机都能看到但别的主机不能与主机A同时发,因为可能会造成数据碰撞。

  • 当有了交换机以后,假设主机A向主机D发送数据包,那么主机A、B、D以及交换机都能同时看到这个数据包。同样的,它们也不能与主机A同时发送。而交换机收到数据包以后,发现目标主机并不在它的右边,所以它可以把数据包不向右边进行转发。所以在主机A发送数据时,并不会影响主机C和主机E的发送

  • 那么如果主机A向主机E(两个不同碰撞域的主机)发送数据包呢?实际上,交换机可以判断出发送方和接收方处于不同的碰撞域,从而交换机进行自动向另一个碰撞域进行数据包转发


交换机划分碰撞域的原理

交换机能完成划分碰撞域的工作,主要经历了三个阶段

第一个阶段:交换机刚被装入局域网

  • 交换机在刚被装入局域网时,它还不能完成划分碰撞域的工作,它完成的工作就只有一个,拿到数据以后正常转发到整个局域网中

第二个阶段:交换机能进行初步划分碰撞域

前提:交换机有两个接口,一个接口连接的是局域网的左边(上图为主机A、B、D所处),一个接口连接的是局域网的右边(上图为主机C、E)。

假设主机A给主机E发送数据

  • 当数据包从它的左边接口经过,想要转发到右边接口时,交换机记录下这个源mac地址是在我的左边局域网的。之后交换机正常转发
  • 主机E收到数据包时,会对数据包做出应答,此时这个应答流经交换机的右边接口,交换机记录下这个应答的源mac地址是在我的右边局域网的。
  • 对于其他主机发送数据时也一样,慢慢的,碰撞域被初步划分了!

第三个阶段:局域网彻底被划分碰撞域

  • 当局域网中的主机互相开始通信后,交换机记录的主机越来越多。最终交换机彻底完成划分碰撞域

数据转发全过程与ARP的引入

参照上图,具体过程:

  • 主机B与路由器F一定处于同一个子网。
  • 主机B发送的MAC帧的源MAC是主机B的MAC地址,目的MAC是路由器F的地址
  • 对于子网中其他非目的MAC的主机来说,它们也会看到这个MAC帧,但它们通过对比目的MAC和自己的MAC后,发现不是发送给自己的,那么就会自动丢弃。
  • 最终数据到达路由器F,它把该数据帧中的源MAC地址修改为自己的MAC地址,目的MAC地址修改为路由器G的MAC地址。
  • 以此循环,最终数据从路由器D发送到主机C

接下来的问题是:数据帧到达路由器D时,为什么路由器D能知道主机C的mac地址,并且知道这个mac地址就一定是主机B想发送的mac地址呢?数据帧在进行转发的时候可是经历了无数次的mac地址的重新封装。

实际上,虽然主机B不知道主机C的MAC地址,但它能知道主机C的IP地址。并且公网IP在全网中是唯一的。要实现真正的跨网络数据传输,那么就要求网络传输过程中需要有一个协议来把目的IP地址转化为MAC地址。这个协议就是ARP协议

注意:不仅仅是路由器D向主机C进行转发要进行ARP,每一个路由转发的过程可能都需要进行ARP。正因如此,这也说明了ARP协议在网络传输的重要性


ARP协议


ARP协议的基本介绍

ARP协议在网络协议栈的哪一层?

ARP协议是在MAC协议之上,IP协议之下的一个链路层协议。


ARP协议的功能

ARP的主要功能是将一个IP地址转换为一个MAC地址,以便在同一局域网内进行数据帧的传输。由于网络层(如IP协议)和链路层(如以太网协议)使用不同的地址格式,ARP协议提供了这两者之间的桥梁。

  • 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址
  • 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃,因此在通讯前必须获得目的主机的硬件地址

MAC协议如何把数据包交付给ARP协议?

注意:所有的数据包进行转发时最终真实在网络中传输的都是一个一个的mac帧,哪怕是ARP也不例外!

主机收到来自网络中的一个mac帧以后,在它的mac帧层会查看mac帧中的类型字段,并以此决定向上交付给哪个协议

  • 若类型字段为0800,则解包后直接交付给网络IP层
  • 若类型字段为0806,则解包后会交付给ARP层

ARP协议格式

  • 硬件类型:指定底层网络协议的类型。对于mac协议来说,硬件类型值为1。(一般固定值)

  • 协议类型:指定上层层协议的类型。若上层为IPv4,则该字段值为0x0800。(一般固定值)

  • 硬件地址长度:硬件地址的长度,以字节为单位。对于以太网地址,硬件地址(mac地址)长度为6(字节)。(一般固定值)

  • 协议地址长度:协议地址的长度,以字节为单位。对于IPv4地址,协议地址长度为4(字节)。(一般固定值)

  • op:指定该ARP的类型,若值为1,则表示该ARP为ARP请求。若该值为2,则表示该ARP为ARP应答

  • 以太网地址就是mac地址!


ARP请求 vs ARP应答

为什么要区分ARP请求和应答?

  • 局域网中,一般都不只一台主机。当一台主机收到ARP时,这个ARP既可能是别的主机发过来的ARP请求,也可以是这台主机自己之前发出的ARP请求的应答。
  • ARP请求和应答完成的工作是截然不同的,主机收到ARP请求时需要告诉对方自己的mac地址。主机收到ARP应答时就代表已经知道了对方的mac地址,下一步就是要进行mac帧的转发了!

ARP原理

若对于ARP我们仅仅是上述的理解,那么是很容易得出一个逻辑性的错误的。

我们说局域网转发时真实转发的必须是一个一个的mac帧

既然是mac帧,那么我们就需要填目的mac地址

但我们发送ARP的需求就是要获得目的mac地址,这难道不是出bug了吗?


ARP协议的广播机制及其过程

  • mac帧在封装ARP请求时,填写的目的mac地址是FF:FF:FF:FF:FF:FF,这个目的mac地址表示的是对局域网中所有的主机进行转发。即广播

  • 每台主机都会收到这个被mac帧封装的ARP请求,它们对比目的mac地址,发现是广播地址。那么它们都会对这个mac帧进行解包并交付给ARP层

  • 它们的ARP层看的第一个字段是op,即ARP类型。因为ARP类型决定了它们接下来该怎么做

  • 通过op字段,它们发现自己收到的是ARP请求,接着就看这个ARP请求的目的IP地址。

  • 若发现不是本主机的IP地址则直接丢弃。

  • 若发现是本主机的IP地址,那么它会修改这个ARP的源MAC地址为本主机的MAC地址,接着修改这个ARP的目的MAC地址为对方的MAC地址,需要注意的是对方的目的mac地址在ARP请求中保存着。

  • 接着修改op字段为2,表示ARP应答,重新交付给MAC帧发送给对方。

  • 对方收到ARP应答,双方都确认了对方的mac地址


ARP缓存表

通过ARP的原理,我们会发现ARP的过程其实是比较繁琐的,发送请求时,它要求的是局域网中所有的主机的mac层都进行解包交付。

那么难道我们每一次需要得到对方的mac地址时都需要发送一次arp请求吗?

实际上,并不会,主机在自己的ARP层一般维护了一张ARP缓存表。这张表中存储了ARP应答中的IP和mac地址的映射关系

我们可以通过arp -a指令来查看ARP缓存表

注意:ARP缓存表的表项中有过期时间(一般为20分钟)


ARP缓存表中的条目为什么要有过期时间而不是永久的?

1、设备移动和更改

  • 在局域网(LAN)中,设备的网络状态是动态的。例如,一台设备可能断开连接、换用不同的IP地址,或通过DHCP重新获取IP地址。若没有过期时间,ARP缓存表中的条目可能会保留陈旧的映射信息,导致数据包发送到错误的MAC地址。

2、IP地址重用

  • IP地址可能被多个设备轮流使用,尤其是在使用DHCP的网络中。如果不及时更新ARP条目,可能会导致通信问题,因为IP地址可能映射到了已下线的设备的MAC地址。

3、释放资源

  • ARP缓存表有存储限制,如果没有过期时间,缓存中的条目可能会长期保留,填满缓存表,占用系统资源。通过设定过期时间,可以定期清理过期条目,确保ARP缓存表不会过度增长。

4、避免缓存污染

  • 如果没有过期时间,由于设备移动和更改会导致陈旧的条目可能造成缓存污染,导致不必要的缓存查找,影响网络性能和通信的准确性。

ARP欺骗原理


背景

如图,两个设备已经经历了一段时间的局域网传输

主机A的IP地址是ipA,mac地址是macA。这些信息路由器R都能在自己的ARP缓存表中查到

路由器R的IP地址ipR,mac地址是macR。这些信息主机A都能在自己的ARP缓存表中查到

于是,这两个设备就正常的进行局域网传输了。


ARP欺骗步骤

在主机A和路由器R所在的局域网中,来了一台新设备主机M,它干了如下事情

  • 在主机A没有发送ARP请求给主机M时,主机M自己构建了一个新的ARP应答,这个ARP应答的ip地址是路由器R的ip地址,但mac地址是主机M自己的mac地址。主机M疯狂向主机A发送这个ARP应答
  • 在路由器R没有发送ARP请求给主机M时,主机M自己构建了一个新的ARP应答,这个ARP应答的ip地址是主机A的ip地址,但mac地址是主机M自己的mac地址。主机M疯狂向路由器R发送这个ARP应答

当主机M分别向主机A和路由器R发送ARP应答时,这两个设备都会修改自己的ARP缓存表,最终主机A发送给路由器R的数据,主机M就能收到。同样的,路由器R给主机A发送的数据,主机M也同样能收到

至此,主机M成为了主机A和路由器R的中间人

ARP欺骗是中间人攻击的一种方式!

相关推荐
华纳云IDC服务商20 分钟前
超融合服务器怎么优化数据管理?
运维·服务器
hy____1231 小时前
动态内存管理
linux·运维·算法
小度爱学习1 小时前
数据链路层协议
运维·服务器·网络·网络协议·网络安全
龙之叶1 小时前
Android13源码下载和编译过程详解
android·linux·ubuntu
Ciderw3 小时前
TCP三次握手和四次挥手
开发语言·网络·c++·后端·网络协议·tcp/ip·golang
小猪佩奇TONY3 小时前
Linux 内核学习(4) --- devfreq 动态调频框架
linux·运维·学习
爱吃喵的鲤鱼4 小时前
Linux——网络(udp)
linux·网络·udp
千航@abc4 小时前
vim可视化模式的进阶操作
linux·编辑器·vim
乐茵安全5 小时前
《网络安全中的“泛洪”攻击:揭秘、防范与应对策略》
服务器·网络·web安全
小Hier5 小时前
linux系统centos版本上安装mysql5.7
linux·运维·centos