【Linux网络】数据链路层

网络转发,本质是在子网和子网之间进行转发。学习IP协议,本质上是解决"B → C,为什么先到路由器F?"这类路径选择问题。要把数据从主机B传送到主机C,必须先将数据从主机B交给路由器F。

那么同一个子网中,一个主机怎么把数据交给另一台主机?其实就是局域网通信的问题!这就需要数据链路层来解决这个问题

文章目录

  • [1. 认识以太网](#1. 认识以太网)
    • [1.1 什么是以太网](#1.1 什么是以太网)
    • [1.2 以太网帧格式](#1.2 以太网帧格式)
    • [1.3 认识MTU](#1.3 认识MTU)
  • [2. ARP协议](#2. ARP协议)
    • [2.1 引入ARP协议](#2.1 引入ARP协议)
    • [2.2 ARP协议的作用](#2.2 ARP协议的作用)
    • [2.3 ARP数据报的格式](#2.3 ARP数据报的格式)
    • [2.4 ARP协议的工作流程](#2.4 ARP协议的工作流程)
    • [2.5 ARP欺骗](#2.5 ARP欺骗)

1. 认识以太网

1.1 什么是以太网

以太网(Ethernet)"代表的是一整套通信技术规范,用于指导设备在局域网(LAN)中如何互相通信。这就像普通话是一种"语言标准",来自不同地方的人只要都说普通话,就能交流。因此,你可以用以太网标准组建家庭网络、公司网络,甚至数据中心网络,它们都是不同的"具体网络",但都遵循以太网标准。

它主要规范了:

  • 数据链路层(如:帧格式、MAC地址、链路访问控制等)
  • 部分物理层内容(如:网线种类、接口、拓扑结构、速率等)

换句话说,以太网 = 一套规则,而不是一个实际存在的网络。

以太网的核心工作机制:CSMA/CD

早期共享式以太网使用一种称为 CSMA/CD(载波侦听多路访问/冲突检测)​ 的协议来管理网络访问。其工作方式通俗来讲就是"先听后发、边发边听、冲突退避":

  • 多点接入:所有设备都连接在一条共享的总线上。

  • 载波侦听:任何设备在发送数据前,必须先检测总线是否空闲。如果空闲,才可发送;如果繁忙,则等待。

  • 冲突检测:由于信号传播有延迟,两个设备可能同时检测到空闲并发送数据,导致"冲突"。设备在发送时会持续检测信道,一旦发现冲突,便立即停止发送。

  • 退避重传:发生冲突后,双方会等待一段随机的时间再重新尝试发送,这有效避免了连续冲突。

随着以交换机为核心的星型网络成为主流,每个设备独享一条链路,冲突基本被避免,CSMA/CD的作用也随之减弱,但其作为以太网的基础协议仍被保留。

拓扑结构的演变:从总线到星型

以太网的物理布局(拓扑)经历了重要演变:

  • 早期总线型拓扑:所有计算机通过一根同轴电缆(粗缆10Base-5或细缆10Base-2)串联起来。结构简单,但任一节点故障都可能影响整个网络,难以排查故障。

  • 现代星型拓扑:所有设备通过双绞线或光纤集中连接到一台集线器(Hub)​ 或交换机(Switch)​ 上。这大大提高了网络的可靠性。需要注意的是,使用集线器的网络在逻辑上仍是一个总线网,所有端口属于一个冲突域;而交换机则为每个端口创建一个独立的冲突域,性能更优。

以太网的发展史也是其速度和介质不断升级的历史,下面的表格清晰地展示了这一历程。

以太网类型 标准 速率 常用传输介质 最大网段长度(典型)
标准以太网​ IEEE 802.3 10 Mbps 同轴电缆 (10Base5/2), 双绞线 (10Base-T) 500米 (10Base5), 100米 (10Base-T)
快速以太网​ IEEE 802.3u 100 Mbps 双绞线 (100Base-TX), 光纤 (100Base-FX) 100米 (TX), 2000米 (FX多模)
千兆以太网​ IEEE 802.3z/ab 1000 Mbps 双绞线 (1000Base-T), 光纤 (1000Base-LX/SX) 100米 (T), 5公里 (LX单模)
万兆以太网​ IEEE 802.3ae 10 Gbps 光纤 40公里 (ER单模)

为什么以太网能成为绝对主流?(与令牌环网等对比)

vs. 令牌环网(IBM主导):

  • 简单与成本:以太网(尤其是采用CSMA/CD和星型拓扑后)设计更简单,硬件实现成本更低。

  • 速度发展:以太网在速度升级的道路上(10M -> 100M -> 1000M)步伐更快、更成功,形成了强大的生态系统。

  • 开放性:以太网标准更开放,吸引了众多厂商生产兼容设备,促进了激烈竞争和价格下降。而令牌环网相对封闭。最终,性价比和演进能力让以太网胜出。

vs. 无线LAN(Wi-Fi):

  • 它们不是取代关系,而是互补关系。Wi-Fi标准(802.11系列)本身也借鉴了以太网的帧格式和思想。

  • 以太网的优势:提供稳定、高速、低延迟、高安全的有线连接。适用于对可靠性要求高的设备,如服务器、台式机、网络存储、监控摄像头等。

  • Wi-Fi的优势:提供移动性和部署便利性。适用于手机、笔记本、智能家居等移动设备。

  • 现代网络通常是 "有线以太网作骨干,无线Wi-Fi作延伸" 的混合架构。


1.2 以太网帧格式

以太网的帧格式如下所示:

  1. 前导码与帧起始定界符(图中未显示,但实际存在)
  • 长度:8字节(通常不算是"帧"的正式部分,但在物理层传输时必不可少)。

  • 作用

    • 前7字节 :交替的 1 和 0(10101010... ),用于时钟同步,使接收方网卡能够调整其接收时序,与发送方的信号同步。

    • 最后1字节 :帧起始定界符(10101011),标志着同步序列的结束,下一字节就是真正的帧开始(目标MAC地址)。

  1. 目的MAC地址
  • 长度:6字节(48位)。

  • 作用 :指明该帧的接收者 。可以是一个单播地址 (某台具体设备的网卡)、一个组播地址 (一组设备)或广播地址FF:FF:FF:FF:FF:FF,所有设备)。

  • 关键:交换机根据此地址决定将帧从哪个端口转发出去。

  1. 源MAC地址
  • 长度:6字节(48位)。

  • 作用 :指明该帧的发送者 。必须是发送网卡的单播地址。接收方据此知道是谁发来的帧,以便回复。

  1. 类型
  • 长度:2字节。

  • 作用 :这是Ethernet II帧的关键标识字段 ,用于指明帧内"数据"字段中承载的上层协议是什么

  • 常见值:

    • 0x0800 :表示数据部分是 IPv4 数据包

    • 0x0806 :表示数据部分是 ARP 请求/应答报文

    • 0x86DD :表示数据部分是 IPv6 数据包

    • 0x8100 :表示带有 802.1Q VLAN 标签的帧

  • 注意:在早期的IEEE 802.3标准中,这个字段被称为"长度",指后续数据字段的字节数。但Ethernet II用"类型"来区分,更具灵活性。当这个值大于 0x0600(十进制1536)时,就被解释为"类型",因为数据长度不可能超过1500字节。这是两者兼容的关键。

  1. 数据与填充
  • 长度46 ~ 1500 字节 。这是以太网帧的有效载荷部分。

  • 最小46字节 :这个限制源于早期的CSMA/CD机制。为了保证冲突检测能正常工作,整个帧(从目的MAC到FCS)必须不小于 64字节 (14+46+4=64)。如果上层传来的数据本身不足46字节,链路层会自动在后面添加填充字节(全0)以满足长度要求。

  • 最大1500字节 :这是以太网的最大传输单元。如果IP包太大,网络层(IP协议)就必须对其进行分片。

  • 内容:承载着上层(网络层及以上)的完整协议数据单元,如IP数据包。

  1. 帧校验序列
  • 长度:4字节(32位)。

  • 作用 :用于错误检测 。发送方根据从"目的MAC地址"到"数据与填充"字段的所有内容,通过CRC算法计算出一个值,填入FCS字段。接收方用同样的算法重新计算,如果结果与接收到的FCS不符,就说明帧在传输过程中发生了比特错误,该帧会被直接丢弃,不会上传给上层协议。这是一个非常可靠的检错机制。

如何分离报头和有效载荷?

分离报头和有效载荷依赖于以太网帧格式固定这一特点。接收方通过读取固定长度的报头,就能确定有效载荷的起始位置。

分离的关键在于报头各字段的长度是固定的,接收方像拆解一个结构固定的包裹一样,按顺序取出相应部分即可。

如何分用?

"分用"是指接收方在剥离以太网报头后,如何决定将有效载荷(数据部分)交给哪个上层协议去处理。这个过程完全依赖于报头中的 "类型"字段。

  • 如果 "类型"字段值 = 0x0800 -> 这表示数据部分是一个 IP 数据报。网卡驱动程序会将有效载荷交给操作系统内核中的 IP 协议模块​ 处理。

  • 如果 "类型"字段值 = 0x0806 -> 这表示数据部分是一个 ARP 请求/应答。有效载荷会被交给操作系统内核中的 ARP 协议模块​ 处理。

  • 如果 "类型"字段值 = 0x8035 -> 这表示数据部分是一个 RARP 请求/应答。有效载荷会被交给 RARP 协议模块​ 处理。


1.3 认识MTU

MTUMaximum Transmission Unit 的缩写,即 最大传输单元。它指的是数据链路层的帧(如以太网帧)其数据载荷部分所能承载的上层协议数据的最大长度。

  • 核心点:MTU限制的是 第三层(网络层)数据包的大小。对于以太网,这个"上层数据"通常就是 IP 数据包。

  • 计算:以太网帧的MTU是1500字节,这意味着一个完整的 IP数据包(IP头部 + IP数据部分)不能超过1500字节,才能被塞进一个以太网帧里发送。

为什么以太网的标准MTU是1500字节?

这是一个历史与技术权衡的结果。早期的共享式以太网为了有效检测冲突(CSMA/CD机制),规定了以太网帧的长度最小为64字节,最大为1518字节。从一个完整的以太网帧(1518字节)中,减去帧首部(目的MAC+源MAC+类型,共14字节)和帧尾部校验序列(4字节),剩下承载IP数据包的最大空间就是 1518 - 18 = 1500字节。这个值作为标准被RFC规定下来,并沿用至今。

巨型帧

在高速数据中心网络中,1500字节的MTU可能显得效率低下,因为每个数据包的处理开销是固定的。为此,出现了巨型帧技术,允许MTU值大幅增加,通常可达9000字节。这减少了数据包数量,降低了协议处理开销,提升了大块数据传输的吞吐量。但需要注意的是,巨型帧尚未成为国际标准,需要网络路径上的所有设备都支持并配置相同的巨型帧大小才能正常工作。

MTU对IP协议的影响

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

  • 将较大的IP包分成多个小包,并给每个小包打上标签;
  • 每个小包IP协议头的 16位标识(id) 都是相同的;
  • 每个小包的IP协议头的3位标志字段中,第2位置为0,表示允许分片,第3位来表示结束标记(当前是否是最后一个小包,是的话置为1,否则置为0);
  • 到达对端时再将这些小包,会按顺序重组,拼装到一起返回给传输层;
  • 一旦这些小包中任意一个小包丢失,接收端的重组就会失败,但是IP层不会负责重新传输数据;

MTU对UDP协议的影响

让我们回顾一下UDP协议:

首先UDP 协议本身非常简单,它不提供分片、重传等复杂机制,因此当数据大小超过路径 MTU 时,其带来的影响是直接且显著的。

  • 数据分片与重组:当 UDP 数据报的总长度(UDP 首部 8 字节 + 数据)超过 1472 字节(在标准以太网 MTU=1500 的情况下)时,IP 层会主动对数据报进行分片 。这个过程对 UDP 层是透明的。接收方需要在 IP 层将所有分片重组为完整的数据报后,才能提交给传输层 。

  • 可靠性急剧下降:分片机制极大地放大了 UDP 数据报丢失的风险。由于 IP 协议本身是无连接的、不可靠的,任何一个分片在传输途中丢失或出错,都会导致整个原始 UDP 数据报无法重组。接收方的 IP 层会直接丢弃所有已到达的分片,这意味着整个 UDP 数据报彻底丢失 。分片越多,数据报成功传输的概率呈指数级下降 。

  • 应用层的最佳实践:因此,在基于 UDP 的应用开发中(如 DNS、DHCP、实时音视频),一个非常重要的优化原则是:应用程序应主动控制发送数据包的大小,确保其封装成 IP 包后不超过路径 MTU。这可以避免 IP 分片,从而保证数据的完整性和传输效率 。

MTU对于TCP协议的影响

让我们再回顾一下TCP协议:

与 UDP 的"被动"不同,TCP 作为面向连接的可靠传输协议,通过主动协商机制来规避 IP 分片。

  • MSS 的职责 :TCP 引入了 MSS ​ 这一关键概念。MSS 是指在 TCP 报文段中数据部分的最大长度,不包括 TCP 头和 IP 头 。它的核心目标正是在传输层就控制数据大小,避免数据在网络层被分片​ 。

  • 连接建立的协商:在 TCP 三次握手的过程中,通信双方会在 SYN 报文和 SYN-ACK 报文的 TCP 头部的"选项"字段里,告知对方自己能够接收的 MSS​ 值。这个值通常是基于其网络接口的 MTU 计算得出的(例如,标准以太网接口的典型 MSS 为 1500 - 20 - 20 = 1460 字节)。最终,双方会采用其中较小的那个 MSS 值作为本次连接的数据传输上限 。

  • TCP 的可靠性保障:即使在极少数情况下 TCP 数据仍需分片(如路径 MTU 在连接过程中变小且路径 MTU 发现未生效),TCP 的重传机制也能发挥作用。如果某个分片丢失导致 IP 层重组失败,发送方最终会因为收不到确认而触发整个 TCP 报文段的重传,从而保证数据的可靠交付 。

MSS和MTU的关系

查看硬件地址和MTU

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


2. ARP协议

2.1 引入ARP协议

关于MAC地址和局域网通信原理,其实我们在之前的文章网络传输基本流程中就已经介绍过了


问题1:主机A为什么要把数据交给主机E?

在局域网中,数据帧是以MAC地址作为目标地址进行转发的。主机A发送数据时,会根据路由表或ARP表确定下一跳设备。如果主机E在同一局域网内,则直接发送;如果不在同一网段,则发送给默认网关(如路由器),由路由器负责转发。但图中主机E与主机A在同一局域网,因此主机A直接将数据帧的目标MAC地址设置为MacE,通过广播或单播方式发送。

结论:主机A把数据交给主机E,是因为路由协议或ARP协议确定了主机E是目标主机,且位于同一局域网内,可以直接通信。


问题2:

首先局域网是一个"碰撞域",同一时刻只能发送一个数据帧,所以以太网是一个共享资源,同时也是一个临界资源

  • CSMA/CD机制:设备发送数据前先监听信道是否空闲(载波侦听),发送过程中持续检测冲突。一旦冲突发生,设备会发送一个冲突加强信号,然后执行二进制指数退避算法,随机等待一段时间后重发

那么使用以太网的时候时间越长越好,还是越短越好?

这里的"使用时间"可以理解为单个设备一次占用信道进行传输的持续时间。并非越长越好,也非越短越好,而是需要一个平衡点。

  • 时间过短的弊端:如果设备占用信道的时间极短(即发送的帧长度过小),会导致传输效率低下。因为每个数据帧都有固定的开销(如帧头、帧尾、前导码、帧间隔等)。短帧使得有效数据占比降低,大量信道时间被协议开销占用。更关键的是,以太网帧有最小长度限制(64字节),这是为了确保有足够的时间进行有效的冲突检测。如果帧短于64字节,可能在冲突信号返回发送方之前,帧已发送完毕,导致冲突无法被检测。

  • 时间过长的弊端:如果某个设备长时间占用信道发送一个巨大的数据帧,会导致其他设备等待时间过长,网络响应性变差,延迟增加。这在共享介质中对公平性和实时性应用(如语音、视频)是致命的。

结论:理想情况是让设备在一次信道占用中,发送一个长度适中的帧(如标准以太网MTU 1500字节对应的帧),从而在传输效率和信道共享公平性之间取得最佳平衡。

主机A发送数据帧越长越好,还是越短越好?

对于单个主机发送的数据帧长度,同样需要权衡。

  • 长帧的优点传输效率高。帧的固定开销(如14字节帧头、4字节CRC校验等)在一次传输中只产生一次。帧越长,有效数据载荷(如1500字节)占总帧长(如1518字节)的比例越高,效率可达96%以上。

  • 长帧的缺点

    • 增加冲突影响:如果帧在发送过程中发生冲突,整个长帧都需要重传,浪费的信道时间更多。

    • 增加其他站点等待延迟:长帧会长时间独占信道,导致其他需要发送数据的站点等待,影响网络实时性。

    • 缓冲区压力:过长的帧可能超出接收方的缓冲区容量,导致丢包。

  • 短帧的优缺点:与长帧相反。短帧(如64字节最小帧)在冲突时损失小,重传代价低,且能更快地释放信道。但它的传输效率极低,固定开销占比大。

结论:在共享式以太网中,适中的帧长 是最优选择。以太网标准将最大传输单元(MTU)定为1500字节,正是这种权衡的结果------在保证较高传输效率的同时,不至于因帧过长而对网络延迟和冲突代价产生过大负面影响

。如果应用数据很大,会在网络层(IP)进行分片,而不是在数据链路层使用超长帧。

数据帧越多越好,还是越少越好?

对于传输固定总量的数据,帧的数量取决于帧的长度。

  • 帧数量少(即使用长帧):如上所述,优点是效率高。缺点是会增加延迟和冲突风险。

  • 帧数量多(即使用短帧):优点是冲突时重传的代价小,单个帧的传输延迟低。但缺点是整体效率低,因为需要发送更多的帧,每一帧都带来固定的协议开销。同时,尝试发送的次数增加,这本身就会略微提高发生冲突的概率。

结论:对于给定的数据总量,在可能的情况下,应优先选择数量较少但长度适中的标准帧,而不是大量的小帧或少量巨大的帧。这能使整体吞吐量最大化。操作系统和协议栈通常会尽量封装接近MTU大小的数据包来优化性能。


问题3:网络层使用IP地址进行寻址,但数据在数据链路层实际传输时,依赖的是MAC地址(物理地址)。如果主机A只知道主机E的IP地址,而不知道其MAC地址,如何发送?

所以局域网通信时就需要一种局域网协议,把IP地址转换为对应的MAC地址------ARP协议(地址解析协议)

所以真正在网络物理层上流动的数据是数据帧


2.2 ARP协议的作用

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

和ARP协议类似的协议也有,就比如ICMP协议、IGMP协议等,不单纯属于网络层协议

ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.

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

ARP协议的核心任务是完成网络层地址(IP地址)​ 到数据链路层地址(MAC地址)​ 的动态映射。由于IP地址是逻辑地址,用于在网络层进行全局寻址,而数据在物理网络中传输时,最终依赖的是数据链路层的MAC地址来定位具体设备。ARP正是沟通这两层之间的"翻译官"。


2.3 ARP数据报的格式

一个ARP数据包是嵌套在以太网帧中传输的。整个结构可以分为两大部分:以太网帧头​ 和 ARP数据部分。

  1. 以太网帧头 (共14字节)
    这是用于数据链路层传输的封装头。
  • 目的以太网地址(6字节):

    • ARP请求 中,此字段为广播地址 FF:FF:FF:FF:FF:FF,表示局域网内所有主机都会接收并处理此帧。

    • ARP应答中,此字段为单播地址,即发送ARP请求的那台主机的MAC地址。

  • 源以太网地址 (6字节):总是填充为发送方主机的MAC地址。

  • 帧类型(2字节):这是一个关键字段,用于告诉接收方,数据部分承载的是什么协议。对于ARP协议,该字段固定为 0x0806。接收方的网卡看到这个类型,就会将数据交给系统的ARP协议模块处理。

  1. ARP数据部分 (共28字节)
    这是ARP协议真正的载荷,包含了地址解析所需的全部信息。
  • 硬件类型(2字节):指明网络接口的类型。对于以太网,该值固定为 1。

  • 协议类型(2字节) :指明要映射的协议地址类型。对于IP地址,该值固定为 0x0800(与IPv4的以太网类型相同)。

  • 硬件地址长度(1字节):指明MAC地址的长度(单位:字节)。对于以太网,该值为 6。

  • 协议地址长度(1字节):指明协议地址的长度(单位:字节)。对于IPv4,该值为 4。

  • 操作码/OP(2字节):指明此ARP数据包的类型。最常见的有两种:

    • 1:代表 ARP请求

    • 2:代表 ARP应答

  • 发送端以太网地址(6字节):发送方的MAC地址(与以太网帧头中的源地址相同)。

  • 发送端IP地址(4字节):发送方的IP地址。

  • 目的以太网地址(6字节)

    • ARP请求 中,此字段通常为全零(00:00:00:00:00:00),因为这正是要询问的信息。

    • ARP应答中,此字段填充为接收方(即被请求方)的MAC地址。

  • 目的IP地址(4字节):想要查询的目标IP地址。


2.4 ARP协议的工作流程


第一阶段:ARP 请求(广播)

  1. 触发与查询缓存
  • 触发:如图所示,路由器R准备发送一个IP数据包给IP地址为IPE的主机。但数据链路层传输需要MAC地址,而路由器R只知道目标IP(IPE),不知道其MAC地址。

  • 查询ARP缓存 :路由器R首先会查询本地的ARP缓存表(一个存储了近期IP-MAC映射关系的表)。如果表中已有IPE对应的MAC地址,则直接使用,无需后续步骤。否则需要发起ARP请求。

  1. 构造并广播ARP请求包
  • 构造请求:路由器R会构造一个ARP请求数据包。这个包的核心信息是:

    • 发送方IP:路由器R自己的IP(假设为IPX)。

    • 发送方MAC:路由器R自己的MAC地址。

    • 目标IP:要查询的IPE。

    • 目标MAC :此处填充全零(00:00:00:00:00:00),因为这就是要询问的内容。

  • 封装与广播 :将此ARP请求包封装到一个以太网帧中。该帧的目标MAC地址被设置为特殊的广播地址(FF:FF:FF:FF:FF:FF)。这意味着,这个帧会被发送到局域网内的每一台主机(主机A、B、C、D、E都会收到)。

第二阶段:ARP 应答(单播)

  1. 接收与检查
  • 局域网内所有主机都会接收到这个广播帧。

  • 每台主机都会查看ARP请求包中的"目标IP"字段。

  • 主机A、B、C、D发现"目标IP"(IPE)与自己的IP地址不匹配,于是丢弃该数据包。这正是图片中它们"无动于衷"的原因。

  1. 目标主机响应
  • 主机E的IP地址就是IPE。它识别出这个请求是询问自己的,于是准备响应。
  1. 构造并发送ARP应答包
  • 构造应答:主机E会构造一个ARP应答包。这个包包含了所请求的信息:

    • 发送方IP:主机E的IP地址(IPE)。

    • 发送方MAC:主机E的MAC地址(这就是路由器R想要的信息!)。

    • 目标IP:路由器R的IP地址(IPX)。

    • 目标MAC:路由器R的MAC地址(从收到的请求包中获知)。

  • 单播回应:主机E将这个ARP应答包封装到一个以太网帧中,并直接发送给路由器R(使用路由器R的MAC地址作为目标地址),而不再是广播。

最终步骤:缓存与通信

  1. 更新ARP缓存
  • 路由器R收到主机E的应答后,获得了IP地址IPE对应的MAC地址。

  • 它会将这条IP-> MAC的映射关系记录到自己的ARP缓存表中,并设置一个有效时间(例如20分钟)。这样,在后续一段时间内与主机E通信时,就无需再次广播询问了。

  1. 正常数据传输
  • 此时,路由器R已经知道了主机E的MAC地址。它就可以将最初要发送的那个IP数据包(内容是"你好")封装成以太网帧,正确发送给主了

注意:使用 arp -a 命令可查看arp缓存表

问题:IP-> MAC的映射关系记录到自己的ARP缓存表中,是有一个时间段来记录的,为什么不永久记录下来呢?

网络中的设备(如笔记本电脑、手机)可能会更换网络接口卡(MAC地址随之改变)、更换位置(IP地址可能变化)或直接离线。永久记录会导致过时、错误的映射,使通信失败。永久保存所有映射关系会导致ARP缓存表无限膨胀,占用大量内存,并降低查询速度。

问题:mac帧如何经过ARP协议分离?

MAC帧的解封装

当数据帧通过网络到达一台主机的网卡时,首先在数据链路层进行处理:

  1. 剥离帧头和帧尾:MAC帧的格式是固定的。设备会读取前14个字节(包括6字节目的MAC地址、6字节源MAC地址、2字节类型字段)和最后4个字节的CRC校验码。剩下的部分就是"有效载荷"。

  2. CRC校验:使用CRC校验码检查数据在传输过程中是否出错。如果出错,帧通常会被直接丢弃。

  3. 关键决策:查看类型字段:这是决定"有效载荷"去向的关键。这个字段指明了有效载荷应该交给上层的哪个协议处理。

    • 如果类型字段是 0x0800 ,则表示有效载荷是一个IP数据报,数据链路层会将其交给网络层的IP协议去处理。

    • 如果类型字段是 0x0806 ,这才表示有效载荷是一个ARP报文,数据链路层会将其交给ARP协议处理。

所以,ARP协议的"分离"并不是ARP协议主动去剥离MAC帧,而是数据链路层在完成本职工作后,根据类型字段的指示,将数据"分用"给了ARP协议。

ARP协议的工作流程

当数据被交到ARP协议后,ARP协议会解析这个ARP报文(通常是28字节固定长度

),并根据报文中的操作码op字段)​ 来采取行动:

  1. ARP请求(op=1):这是一个广播请求。当你需要与某台设备通信但不知道其MAC地址时,会发送ARP请求。局域网上所有设备都会收到并处理此请求。

    • 如果你是接收方:检查ARP请求报文中的目标IP地址是否与自己的IP地址匹配。如果匹配,你就会将自己的MAC地址通过一个ARP应答(op=2)​ 单播回复给请求方。同时,你会将请求方的IP-MAC映射记录到自己的ARP缓存表中。

    • 如果你是无关主机:发现目标IP与自己的IP不匹配,则会丢弃这个ARP请求报文。

  2. ARP应答(op=2) :这是一个单播响应。当收到ARP应答时,设备会从中获取发送方的IP地址和MAC地址,并将这个映射关系缓存起来,以便后续通信使用

    。操作系统会维护一个ARP缓存表,并设置老化时间,以防止映射信息过时。

所以,处理任何ARP(请求/应答),先看操作码OP

RARP协议是将目标主机的mac地址,转换为IP地址,相对于ARP协议是比较简单的,这里提一下


2.5 ARP欺骗

步骤一

在攻击发生前,网络处于正常、可信的状态:

  • 主机A​ 知道路由器RIP地址(ipR) 对应其真实的MAC地址(macR) 。主机A的ARP缓存中存在正确条目:ipR-> macR

  • 路由器R ​ 也知道主机AIP地址(ipA) 对应其真实的 MAC地址(macA) 。路由器R的ARP缓存中存在正确条目:ipA-> macA

  • 因此,当主机A需要访问外部网络时,数据包会通过正确的MAC地址(macR)直接发送给路由器R。

步骤二

攻击者主机M(MAC地址为 macM)通过发送伪造的ARP报文,篡改主机A和路由器R的ARP缓存。

步骤一:污染主机A的ARP缓存

  • 攻击行为 :主机M向主机A大量发送伪造的ARP应答包,并宣称:"我是IP地址 ipR(路由器),我的MAC地址是 macM"。

  • 原理 :由于ARP协议设计上无身份验证机制,主机会默认信任收到的ARP应答A无法辨别这个应答是来自真正的路由器还是攻击者。

  • 结果 :主机A更新了自己的ARP缓存,将路由器R的IP地址(ipR)错误地映射到了攻击者M的MAC地址(macM)。现在,主机A错误地认为ipR-> macM

步骤二:污染路由器R的ARP缓存

  • 攻击行为 :同时,主机M向路由器R大量发送伪造的ARP应答包,并宣称:"我是IP地址 ipA(主机A),我的MAC地址是 macM"。

  • 结果 :路由器R也更新了自己的ARP缓存,将主机A的IP地址(ipA)错误地映射到了攻击者M的MAC地址(macM)。路由器R错误地认为ipA-> macM

至此,ARP欺骗完成,主机M成功将自己"插入"了主机A与路由器R(及外部网络)的通信路径中。

步骤三

在ARP缓存被毒化后,所有流量都会"流经"攻击者主机M:

  1. 主机A​ 想访问互联网,它查询ARP缓存,发现 ipR网关)对应macM。于是,它将本应发给路由器R的数据包,全部发往了主机M的MAC地址(macM`)

  2. 主机M截获 这些数据包。此时,它可以窃听、分析甚至篡改其中的内容(例如登录密码、聊天记录)。之后,为了不中断连接引起怀疑,它通常会将这些数据包原样转发给真正的路由器R(macR)。

  3. 外部网络​ 的回复数据包从路由器R返回。路由器R查询自己的ARP缓存,发现 ipA(主机A)对应 macM。于是,它将回复包发往了主机M的MAC地址(macM)

  4. 主机M ​ 再次截获 返回的数据包,同样可以进行窃听或篡改,然后再转发给主机A。

对于通信的双方(主机A和路由器R)来说,网络连接看似正常,但他们所有的流量都在不知不觉中被一个"中间人"(主机M)全程监控和操控。

相关推荐
星梦客1 小时前
FRP 内网穿透工具部署教程
网络·经验分享·笔记
TroubleBoy丶1 小时前
Docker可用镜像
java·linux·jvm·docker
Xyz996_1 小时前
Keepalived双机热备
linux·运维·服务器
Han.miracle1 小时前
网络层-IP 协议全景解析:从地址分配到内网穿透,解锁互联网通信底层密码
服务器·网络·网络协议·ip
小嘟嘟131 小时前
第1章 Shell 脚本入门:从 “Hello World“ 到自动化执行的完整路径
linux·运维·自动化·shell
I · T · LUCKYBOOM1 小时前
23.ssh远程连接、TCP策略
linux·运维·服务器·网络·tcp/ip·ssh
weixin_660096781 小时前
tree命令的离线下载
linux·运维·tree
千百元1 小时前
实时监控磁盘I/O性能
linux·运维·数据库
Vect__1 小时前
Linux常见指令
linux·服务器