ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

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

数据链路层--帧传输与链路控制 目录一、认识以太网1.1 以太网数据帧格式1.2 MAC 地址详解1.3 MAC 地址与 IP 地址对比理解1.4 MTU 最大传输单元1.5 数据帧在网络中的传播1.6 交换机二、地址解析协议ARP2.1 ARP协议格式解析2.2 ARP协议交互完整流程2.3 ARP 协议中的细节三、RARP反向地址解析协议四、ARP欺骗一、认识以太网以太网并不是某一种具体的物理网络而是一套完整的技术标准同时覆盖数据链路层与部分物理层规范其中定义了网络拓扑结构、介质访问控制方式、传输速率等全套规则。 举几个直观规范以太网传输介质统一采用双绞线标准传输速率分为 10M、100M、1000M 千兆等多个档位。 时至今日以太网是使用范围最广的局域网技术同层级的局域网技术还有令牌环网、无线 LAN 等。我们常说的跨网络通信本质就是将多个独立局域网串联互通而数据链路层传输的基本单元我们统一称为数据帧。1.1 以太网数据帧格式以太网帧头部为固定长度结构6 字节目的 MAC 地址 6 字节源 MAC 地址 2 字节类型字段尾部附带 4 字节 CRC 校验位头部 校验固定占用 662418 字节。 正因为帧头长度固定接收端只需要用整个帧总长度减去 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 地址始终保持不变这正是二层寻址与三层寻址分工协作的典型体现。一个局域网内不会只有一台主机传输数据多台设备同时收发报文是常态。多台主机同时向外发送光电信号时信号会互相干扰、数据出错这种冲突现象叫做数据碰撞。所有可能发生数据碰撞的设备范围我们称之为碰撞域因此传统以太网整体就是一个独立碰撞域。碰撞域的范围越大发生碰撞的概率就越高这也是为什么早期共享式以太网在设备数量增多后性能会急剧下降的根本原因。一旦数据发生碰撞了发生数据碰撞的主机就需要进行碰撞检测与避免而碰撞避免的本质是在数据链路层对数据进行延迟重发。具体来说当主机检测到碰撞发生后会立即停止发送并等待一段随机时间后再重新尝试发送这个随机退避机制可以有效避免多台主机在同一时刻再次同时发送从而降低连续碰撞的概率。碰撞检测与碰撞避让机制的核心逻辑就是当检测到当前信道已有主机在发送数据时其余主机暂停发送操作以此保证同一个碰撞域内同一时刻仅有一台主机占用信道传输数据从而从根本上减少数据碰撞。这种先听后发、边发边听的机制本质上是一种分布式信道访问控制策略它不依赖中心调度节点而是依靠每台主机的自觉监听与退避协作共同维护信道的有序使用。报文在发送时不是直接一次性发过去而是拆分成一个一个的小报文少量多次地发送过去。这样在别人通信的间隙就可以趁着这个间隙把报文发出去。这种拆分发送的方式本质上是在时间维度上对信道进行分片复用让多台主机能够交错占用信道而不是某台主机长时间独占从而显著提升信道的整体利用率。报文不会一次性完整发送会拆分成多个小段、分多次发送借此利用其他主机的通信间隙完成传输。局域网环境不建议传输过长报文因为长报文会让单台主机长期独占信道大幅提升数据碰撞概率。碰撞变多后网络有效收发报文总量下降单位时间吞吐量降低就会造成网络出现卡顿的情况。此外长报文一旦在传输中途发生碰撞整个报文都需要重传重传成本远高于短报文这也是以太网限制帧长上限的重要原因之一。那是不是报文拆分得越小传输效率就越高答案是否定的。传输需要在效率、可靠性之间寻找平衡点。以太网 461500 字节的 MTU 区间是经过大量实验测算得出的最优标准。如果报文过小虽然碰撞概率降低了但每个帧都要携带固定的 18 字节头部开销有效载荷占比过低传输效率反而大幅下降如果报文过大虽然头部开销被摊薄但碰撞重传成本急剧上升。因此 461500 字节这个区间正是以太网在头部开销、碰撞概率和重传成本三者之间权衡后的最优解。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 操作字段区分报文类型1ARP 请求报文2ARP 应答报文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地址是IPXMAC地址是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欺骗实现的劫持攻击就是典型的中间人攻击
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进