数据链路层--帧传输与链路控制

目录

一、认识以太网

[1.1 以太网数据帧格式](#1.1 以太网数据帧格式)

[1.2 MAC 地址详解](#1.2 MAC 地址详解)

[1.3 MAC 地址与 IP 地址对比理解](#1.3 MAC 地址与 IP 地址对比理解)

[1.4 MTU 最大传输单元](#1.4 MTU 最大传输单元)

[1.5 数据帧在网络中的传播](#1.5 数据帧在网络中的传播)

[1.6 交换机](#1.6 交换机)

二、地址解析协议ARP

[2.1 ARP协议格式解析](#2.1 ARP协议格式解析)

[2.2 ARP协议交互完整流程](#2.2 ARP协议交互完整流程)

[2.3 ARP 协议中的细节](#2.3 ARP 协议中的细节)

三、RARP反向地址解析协议

四、ARP欺骗


一、认识以太网

以太网并不是某一种具体的物理网络,而是一套完整的技术标准,同时覆盖数据链路层与部分物理层规范,其中定义了网络拓扑结构、介质访问控制方式、传输速率等全套规则。 举几个直观规范:以太网传输介质统一采用双绞线;标准传输速率分为 10M、100M、1000M 千兆等多个档位。 时至今日,以太网是使用范围最广的局域网技术,同层级的局域网技术还有令牌环网、无线 LAN 等。

我们常说的跨网络通信,本质就是将多个独立局域网串联互通;而数据链路层传输的基本单元,我们统一称为数据帧。

1.1 以太网数据帧格式

以太网帧头部为固定长度结构:6 字节目的 MAC 地址 + 6 字节源 MAC 地址 + 2 字节类型字段,尾部附带 4 字节 CRC 校验位,头部 + 校验固定占用 6+6+2+4=18 字节。 正因为帧头长度固定,接收端只需要用整个帧总长度减去 18 字节固定头部长度,就能精准分离出上层交付的有效载荷。

当网络层报文向下交付数据链路层封装时,帧头的 2 字节类型字段会标记上层协议类型:

  • 上层是 IP 报文:填写 0x0800
  • 上层是 ARP 报文:填写 0x0806
  • 上层是 RARP 报文:填写 0x0835

接收主机解析数据帧时,依靠该类型字段判断载荷属于哪一种上层协议,再把数据向上交付对应模块处理。

1.2 MAC 地址详解

MAC 地址仅要求在单个局域网内部唯一有效,MAC 地址本身无法跨网段传输,跨网络转发时只会更换二层 MAC 头部。

1.3 MAC 地址与 IP 地址对比理解

  • IP 地址:代表整条传输路径的起点主机、终点主机,全程跨网段保持不变;
  • MAC 地址:仅代表当前传输区间的相邻两端设备,每经过一台路由器二层头部就会重新改写。

我们可以用快递运输的逻辑直观区分二者作用:IP 地址就相当于完整的买家、卖家收货地址,代表整条传输路径的起点和最终终点;MAC 地址则只对应运输途中相邻两个快递中转站点,每一段短途转运都要更换一次对应的收发站点地址。

1.4 MTU 最大传输单元

MTU 可以类比快递网点的包裹尺寸上限,该限制由数据链路层对应的物理介质标准决定。

以太网标准对帧载荷有硬性长度约束:载荷最小 46 字节,最大 1500 字节。 像 ARP 这类短报文,原始长度达不到 46 字节下限,必须在报文尾部补充 PAD 填充位,补齐至 46 字节后才能封装为完整以太网帧发送。 这也正好解释 IPv4 头部为什么要专门设计 16 位总长度字段:网卡接收的以太网载荷中会附带 PAD 填充数据,但 IP 总长度字段仅记录纯粹的 IP 报文(IP 首部 + IP 载荷),不包含填充位。接收端读取总长度减去 IP 首部长度,即可提取真实上层数据,自动舍弃末尾无用的 PAD 填充。

其中 1500 字节的载荷上限,就是以太网标准的 MTU(最大传输单元),不同链路标准对应的 MTU 数值各不相同。 当 IP 报文从以太网转发至拨号链路这类 MTU 更小的网络时,若报文总长度超出目标链路 MTU 阈值,路由器会对 IP 报文执行分片操作,拆分多个小包传输。

1.5 数据帧在网络中的传播

当数据帧在局域网中传播时,局域网内所有主机和路由器都会接收到该数据帧。当设备将数据帧向上交付至数据链路层后,会对比自身 MAC 地址和数据帧中的目的 MAC 地址,如果不匹配则直接丢弃该报文,不会继续向上层解包。只有 MAC 地址匹配的设备才会处理这份数据。这种机制保证了数据帧虽然以广播形式在物理介质上传输,但只有真正需要它的设备才会接收并处理,其余设备则静默丢弃,从而避免无关主机对无关数据的无效解析。

而路由器是局域网内设备,仅接收目的 MAC 与自身接口 MAC 一致的数据帧,接收后查询路由表,重新更换源 MAC 与目的 MAC 地址再转发。后续每一跳转发都重复该流程,直至数据帧最终抵达目标主机。这里需要特别强调的是,路由器在转发过程中不仅会改写二层 MAC 头部,还会根据路由表决定下一跳的出口,因此每一跳的源 MAC 和目的 MAC 都会发生变化,而 IP 地址始终保持不变,这正是二层寻址与三层寻址分工协作的典型体现。

一个局域网内不会只有一台主机传输数据,多台设备同时收发报文是常态。多台主机同时向外发送光电信号时,信号会互相干扰、数据出错,这种冲突现象叫做数据碰撞。所有可能发生数据碰撞的设备范围,我们称之为碰撞域,因此传统以太网整体就是一个独立碰撞域。碰撞域的范围越大,发生碰撞的概率就越高,这也是为什么早期共享式以太网在设备数量增多后性能会急剧下降的根本原因。

一旦数据发生碰撞了,发生数据碰撞的主机就需要进行碰撞检测与避免 !而碰撞避免的本质是在数据链路层对数据进行延迟重发。具体来说,当主机检测到碰撞发生后,会立即停止发送,并等待一段随机时间后再重新尝试发送,这个随机退避机制可以有效避免多台主机在同一时刻再次同时发送,从而降低连续碰撞的概率。

碰撞检测与碰撞避让机制的核心逻辑 ,就是当检测到当前信道已有主机在发送数据时,其余主机暂停发送操作,以此保证同一个碰撞域内,同一时刻仅有一台主机占用信道传输数据,从而从根本上减少数据碰撞。这种"先听后发、边发边听"的机制,本质上是一种分布式信道访问控制策略,它不依赖中心调度节点,而是依靠每台主机的自觉监听与退避协作,共同维护信道的有序使用。

报文在发送时不是直接一次性发过去,而是拆分成一个一个的小报文 ,少量多次地发送过去。这样在别人通信的间隙,就可以趁着这个间隙把报文发出去。这种拆分发送的方式,本质上是在时间维度上对信道进行分片复用,让多台主机能够交错占用信道,而不是某台主机长时间独占,从而显著提升信道的整体利用率。

报文不会一次性完整发送,会拆分成多个小段、分多次发送,借此利用其他主机的通信间隙完成传输。局域网环境不建议传输过长报文 ,因为长报文会让单台主机长期独占信道,大幅提升数据碰撞概率。碰撞变多后,网络有效收发报文总量下降,单位时间吞吐量降低,就会造成网络出现卡顿的情况。此外,长报文一旦在传输中途发生碰撞,整个报文都需要重传,重传成本远高于短报文,这也是以太网限制帧长上限的重要原因之一。

那是不是报文拆分得越小,传输效率就越高?

答案是否定的。传输需要在效率、可靠性之间寻找平衡点。以太网 46~1500 字节的 MTU 区间,是经过大量实验测算得出的最优标准。如果报文过小,虽然碰撞概率降低了,但每个帧都要携带固定的 18 字节头部开销,有效载荷占比过低,传输效率反而大幅下降;如果报文过大,虽然头部开销被摊薄,但碰撞重传成本急剧上升。因此 46~1500 字节这个区间,正是以太网在头部开销、碰撞概率和重传成本三者之间权衡后的最优解。

1.6 交换机

交换机是二层隔离设备,能把一整个大以太网拆分成多个独立区域。 如果以太网里没有交换机,所有主机处在同一个碰撞域,所有收发的数据全部混杂广播,极易产生信号碰撞。接入交换机后就能做流量隔离。

举个例子:以太网里有 A、B、C、D、E 五台主机,交换机把 A、B、D 划分为左侧区域,C、E 划分为右侧区域。 当 A 和 D 互相通信时,交换机识别帧目的 MAC 在左侧区域,只会在 ABD 区间转发数据帧,不会把流量扩散到右侧 C、E 区域;C 和 E 互相通信同理,流量只限制在右侧。

这就带来一个关键优势:A-D、C-E 两组通信可以同时并行传输,互相不会产生数据碰撞。

交换机工作时存在自动学习机制:它会记录每个接口对应的 MAC 地址表。交换机识别 MAC 地址,收到数据帧后对比帧内目的 MAC 和自身各接口 MAC 表:

  • 目的 MAC 和源 MAC 在交换机同一侧接口:直接丢弃,不转发;
  • 目的 MAC 在另一侧接口:仅转发到对应接口

数据链路层只解决两件事:在局域网正常发出数据、规避同一碰撞域的数据碰撞。 它不会保障传输可靠性,丢包、错包重传这类可靠性工作不归数据链路层负责,但数据链路层需要处理基础异常场景。

二、地址解析协议ARP

我们只知道下一跳 IP,怎么拿到对方 MAC?

网络通信里,目标主机 IP ≠ 下一跳设备 IP。主机查询路由表,只能查到转发网关(下一跳)的 IP 地址。 但报文向下封装以太网帧时,必须填写下一跳的 MAC 地址才能完成传输。 所以我们需要一套机制,通过已知的下一跳 IP,查询对应的硬件 MAC 地址,ARP 地址解析协议就是为此诞生的。

ARP 是仅运行在局域网内的数据链路层协议,封装在以太网帧载荷中,全程只工作在数据链路层,不会上传到网络层。 它的工作原理是先在局域网中先广播请求,收到匹配回复后再一对一单播应答。

ARP 原始报文本身只有 28 字节,低于以太网载荷最小 46 字节的硬性标准,封装成帧时会在报文末尾填充 PAD 字段,补齐至 46 字节再发送。

由于ARP协议的大小只有28字节,不够46字节,所以就必须在后面添加PAD字段,将报文补充至46字节。

2.1 ARP协议格式解析

硬件类型:固定值 1,代表当前网络为以太网;

协议类型:上层承载 IP 报文,固定填 0x0800;

硬件地址长度、协议地址长度:分别标识 MAC、IP 的字节长度;

OP 操作字段:区分报文类型,1=ARP 请求报文,2=ARP 应答报文;

arp协议报文中还记录了发送端Mac地址和发送端IP地址,目的Mac地址和目的IP地址。

2.2 ARP协议交互完整流程

一台主机想要发起 ARP 请求时,必须先构建 ARP 请求报文。构建好 ARP 请求之后,这份报文会向下交付给 MAC 层,由 MAC 层封装成 MAC 数据帧。封装完成后,该 MAC 帧会以广播方式在整个局域网中传播。

主机发送 ARP 请求后,只有目标 IP 主机在线的情况下,才会收到 ARP 应答;如果目标设备不在线、IP 不存在,就不会收到应答。

当局域网内的主机收到这份 MAC 广播帧后,会先在 MAC 层进行解包。解析到帧类型为 0806 时,代表上层协议是 ARP,于是设备会把报文向上交付给 ARP 层处理。

ARP 层开始解析报文内容,首先比对报文中的目的 IP 地址: 如果目的 IP 和本机 IP 不匹配,直接丢弃该报文; 如果目的 IP 和本机 IP 匹配,说明该报文是发给自己的。

此时主机并不知道当前报文是请求还是应答,所以会优先解析 OP 字段。通过 OP 字段的值,最终判断出这是 ARP 请求报文,还是 ARP 应答报文,再执行对应的处理逻辑。

2.3 ARP 协议中的细节

主机构造 ARP 报文广播完成交互后,设备会把获取到的 IP 与 MAC 地址映射关系存入 ARP 缓存表 。这份缓存并不是永久保存 的,不同操作系统设定的缓存老化时间不一样,Linux、Windows 各自有独立的默认超时时长。缓存存在的核心意义,是短时间内再次通信时不用重复发 ARP 广播 ,提升局域网传输效率。

给缓存设置过期时间,是因为局域网内设备的 IP、MAC 都可能发生变动。首先是局域网内设备的IP不是一成不变的。例如日常生活中,我们的家用设备接入路由器时,DHCP 会随机分配内网 IP。当我们的设备离线后重新联网,分配到的 IP 大概率和之前不同。如果 ARP 缓存永久留存旧映射,就会出现 IP 和 MAC 匹配错乱的问题。旧缓存里记录的 IP 对应的 MAC 还是原先设备,但这个 IP 现在可能分配给了另一台主机,按照旧的映射来转发数据时就会出现通信失败的情况。其次,也会存在 MAC 地址变化的情况。局域网内的部分设备的 IP 可能固定不变,但当主机的网卡损坏更换新网卡后,硬件的 MAC 地址会随之发生变化。所以 ARP 协议定时淘汰过期缓存的操作,能够保证缓存表里存储的 IP-MAC 映射都是最新有效的。

这里补充一个常用指令ping。ping命令工作在网络层,原理是主动向目标主机发送 IP 报文,以此检测两台主机之间网络是否连通。下面是实际演示效果:

但是,不是只要 ping,就一定会产生 ARP 缓存记录。 就像上面截图里的例子,我们 ping 192.168.1.1,目标主机没有响应。主机发出 ARP 广播去询问这个 IP 对应的 MAC,但是收不到 ARP 应答。没有应答,就获取不到 IP-MAC 映射,这条映射就不会存入 ARP 缓存,执行arp -a自然看不到这条记录。

这次我们 ping 一个与我们的云服务器处于同一网段的地址:ping 172.19.63.1,结果依旧是100% 丢包,目标无法连通。 执行arp -a查看 ARP 缓存,会发现与上面截然不同的信息:172.19.63.1对应的 MAC 地址是ee:ff:ff:ff:ff:ff。

这里的ee:ff:ff:ff:ff:ff并不是目标主机真实的 MAC 地址,这是ARP 的不完整缓存(失败缓存)。 当我们发起 ping,系统会先发送 ARP 广播,尝试查询172.19.63.1的 MAC。目标设备没有应答 ARP 请求,但是 Linux 系统依旧会把这条 IP 记录放进 ARP 缓存,填入一个占位的 MAC 地址。

假设目标主机172.19.63.1正常开机在线。 执行ping 172.19.63.1,在发送 IP 报文之前,本机先向外发送 ARP 广播报文,询问172.19.63.1对应的 MAC 地址。 目标主机收到 ARP 广播,识别到目的 IP 是自己,就会回复 ARP 应答报文,把自身真实的 MAC 地址传回给我们这台主机。

本机收到 ARP 应答之后,就会把真实的 IP-MAC 映射关系写入 ARP 缓存表。 此时再执行arp -a查看缓存,172.19.63.1后面,就会出现目标主机真实的 MAC 地址,不再是ee:ff:ff:ff:ff:ff这种占位假 MAC。

有了这条正确的缓存记录,后续 ping 的 IP 报文就可以直接封装成以太网帧,填入拿到的真实目的 MAC,直接发给目标主机,不需要反复发送 ARP 广播。 ping 报文可以正常送达对方,对方也会回复 ping 应答,最终我们就能收到返回数据包,不再是 100% 丢包。

三、RARP反向地址解析协议

我们前面学的 ARP 是通过已知 IP 地址,去查询对应的 MAC 地址。那反过来,如果一台主机只知道自己的 MAC 地址,不清楚自身 IP 地址,该怎么获取 IP?这就需要用到 RARP 反向地址解析协议。

RARP 和 ARP 一样,都属于局域网内的数据链路层协议,报文同样封装在 MAC 帧里传输,帧类型字段固定为 0835,用来区分这是 RARP 报文。

有些设备开机仅自带 MAC 地址,不知道自身 IP,这时就会发起 RARP 请求。主机先组装一份 RARP 请求报文,再往下交给 MAC 层封装成以太网帧,随后在局域网内广播发送。

局域网所有设备都会接收这条广播帧,设备先在 MAC 层完成解帧,识别帧类型字段数值为 0835,就能确定帧内承载的是 RARP 报文,再把报文向上交给 RARP 模块解析。

RARP 模块读取报文,先判断本机是否为 RARP 服务器:普通主机不具备应答能力,直接丢弃这条报文;只有专门的 RARP 服务器,才会继续处理这份数据。

服务器无法直接区分收到的是请求还是应答报文,因此第一步也是先读取 OP 字段,依靠 OP 的数值区分报文类型,再根据报文类型执行后续匹配、回复操作。

服务器检索本地 MAC 与 IP 映射表,找到请求主机 MAC 对应的 IP,构造 RARP 应答报文,以单播帧的形式发回请求主机,设备就能拿到自己的 IP 地址。

四、ARP欺骗

假设主机X(A\D\E)的IP地址是IPX,MAC地址是MACX。在局域网通信时可能会出现一种情况,就是当主机A要给主机E发送消息时,主机D可以欺骗主机A,伪装成主机E。由于ARP协议存在一个核心特点,那就是设备缓存的地址数据永远以最新的为准。如果主机D持续发送伪造报文冲刷主机A的ARP缓存,不断向主机A宣称自己的IP地址是IPE、MAC地址是MACD,那么主机A在刷新更新ARP缓存时,就会留存这条最新的地址映射记录。这也就意味着,后续主机A向主机E发送所有消息时,都会误将数据发送给主机D。

同时,主机D也会向主机E发送大量伪造报文冲刷其ARP缓存。原本主机E的ARP缓存中,记录的主机A地址信息为IPA、MACA,经过大量报文冲刷覆盖后,该记录就会被替换为IPD、MACD。所以后续主机E需要向主机A回应报文、传输应答数据时,也会先将数据发送至主机D。此时主机D就成功介入了主机A与主机E的通信链路,成为二者通信的中间人,这就是完整的ARP欺骗过程。

自此之后,主机A与主机E双向通信过程中收发的所有数据,都会经过主机D,被主机D获取、截留并转发至对应目标主机,这种依托ARP欺骗实现的劫持攻击,就是典型的中间人攻击!

相关推荐
头发还在的女程序员1 小时前
【无标题】
网络·数据库·短剧小程序·短剧系统·海外短剧·短剧后台
Gauss松鼠会1 小时前
【GaussDB】破除gaussdb ugin索引支持中文模糊查询的迷思-字符序
java·运维·服务器·网络·数据库·gaussdb·经验总结
程序员z71 小时前
【从0开始学计算机网络】| HTTP 协议的进化史
网络协议·计算机网络·http
luiyarch1 小时前
汽车电子ISO 21448 SOTIF系列(第26期):未知危险场景的确认方法(下)——AI驱动的场景发现
网络·人工智能·安全·车载系统·汽车
砚凝霜2 小时前
【软考信息安全】第十六章 网络安全风险评估项目流程与应用
网络·安全·web安全
Mr_韩2 小时前
子网路由实战:无需公网 IP,异地直接访问家庭内网全部设备
运维·网络·物联网·nas
Bruce_Liuxiaowei2 小时前
内网“影子资产“:串口服务器安全盲区剖析
服务器·网络·安全·iot
云计算练习生2 小时前
什么是操作系统安全?身份认证、访问控制与审计机
服务器·网络·安全·访问控制·操作系统安全
乐橙开放平台3 小时前
通道国标 ID 贴反会串店:海康大华宇视摄像头怎么用 GB28181 统一接入?
网络·笔记·物联网·自动化·音视频·智能家居