【Linux网络】深入理解数据链路层:从MAC帧到ARP协议的底层原理
草莓熊Lotso个人主页❄️个人专栏:《C知识分享》 《Linux 入门到实践零基础也能懂》✨生活是默默的坚持毅力是永久的享受 博主简介文章目录前言一. 数据链路层基础与以太网1.1 数据链路层的核心作用1.2 认识以太网1.3 以太网帧格式详解RFC 8941.4 局域网通信的基本原理1.5 数据碰撞与 CSMA/CD1.6 混杂模式与抓包原理1.7 MTU 对上层协议的影响二. ARP 协议IP 地址到 MAC 地址的映射2.1 ARP 协议的作用2.2 ARP 的工作原理2.3 ARP 报文格式详解2.4 ARP 缓存机制2.5 ARP 在跨网通信中的作用2.6 实战获取局域网内所有主机的 MAC 地址2.7 RARP 协议了解2.8 ARP 欺骗原理与安全问题三. Linux 内核 ARP 源码解读3.1 ARP 报文接收函数arp_rcv ()3.2 ARP 报文处理函数arp_process ()结尾前言当你在浏览器输入网址按下回车数据首先会被封装成 IP 数据报但 IP 数据报并不能直接在物理网络上传输。它必须被进一步封装成以太网帧通过 MAC 地址在局域网内找到下一跳设备。为什么我们的电脑能准确把数据发给路由器而不是隔壁室友的电脑为什么 IP 地址已经能标识全球主机还需要 MAC 地址这些问题的答案都藏在 TCP/IP 协议栈的数据链路层中。数据链路层负责解决 “怎么把数据从一个节点传到同一链路的另一个节点的问题是网络通信的” 最后一公里 。本文将从以太网帧格式讲起深入解析局域网通信原理、MTU 对上层协议的影响最后拆解 ARP 协议的工作机制与安全问题带你彻底搞懂数据链路层的核心逻辑。一. 数据链路层基础与以太网1.1 数据链路层的核心作用对比理解网络层和数据链路层网络层IP描述数据传输的全程起点和终点解决 “去哪里” 的问题数据链路层MAC描述数据传输的每一个区间的起点和终点解决 “怎么去下一跳” 的问题经典类比唐僧例子之白龙马唐僧要去西天取经IP 地址是 “长安→西天” 的全程路线而 MAC 地址是每一段路的具体交通工具。白龙马负责把唐僧从长安送到两界山第一跳再由孙悟空负责从两界山送到高老庄第二跳每一段都只关心当前区间的起点和终点。1.2 认识以太网“以太网” 不是一种具体的网络而是一套技术标准同时定义了数据链路层和物理层的规范物理层规定使用双绞线作为传输介质支持 10M/100M/1000M 等传输速率数据链路层定义了以太网帧格式、访问控制方式CSMA/CD等以太网是目前应用最广泛的局域网技术与之并列的还有令牌环网、无线 LAN 等但以太网凭借简单、高效的特点占据了绝对主导地位。1.3 以太网帧格式详解RFC 894以太网帧是数据链路层的基本传输单元标准格式如下字段长度字节作用目的 MAC 地址6接收方网卡的物理地址源 MAC 地址6发送方网卡的物理地址类型2标识上层协议类型0x0800IP0x0806ARP0x8035RARP数据46~1500上层协议数据IP 数据报、ARP 报文等CRC 校验4循环冗余校验检测传输错误关键细节MAC 地址48 位6 字节全球唯一的物理地址网卡出厂时固化格式为08:00:27:03:fb:19。虚拟机的 MAC 地址可能冲突部分网卡支持手动修改。数据长度限制最大 1500 字节即MTU最大传输单元超过则需要在网络层分片最小 46 字节不足时自动填充无用数据PAD接收方通过 IP 首部的总长度字段区分有效数据和填充1.4 局域网通信的基本原理局域网内的所有主机共享同一传输介质通信采用广播 单播的方式主机 A 要给主机 E 发送数据封装以太网帧目的 MAC 填主机 E 的 MAC 地址将帧发送到局域网中所有主机都会收到这个帧每台主机提取帧的目的 MAC 地址与自己的 MAC 地址对比不匹配直接在链路层丢弃上层协议完全不知道匹配接收帧剥离以太网首部将数据部分交给上层协议处理形象类比在教室里老师喊 “张三”所有人都听到了但只有张三会站起来回应其他人都会忽略这个喊话。1.5 数据碰撞与 CSMA/CD由于局域网是共享介质的多台主机同时发送数据会产生数据碰撞导致数据损坏。以太网采用CSMA/CD载波监听多路访问 / 碰撞检测机制解决这个问题载波监听发送数据前先监听信道是否空闲碰撞检测发送数据时同时监听信道如果检测到碰撞立即停止发送碰撞避免等待一个随机时间后重新尝试发送这就是为什么宿舍人多的时候网速会变慢碰撞概率增加单位时间内成功传输的数据量减少。1.6 混杂模式与抓包原理默认情况下网卡只会接收目的 MAC 是自己的帧。但可以将网卡设置为混杂模式此时网卡会接收所有经过的帧。抓包软件如 Wireshark就是利用这个原理工作的。这也意味着同一局域网内的任何主机都可以抓到你的数据这也是为什么应用层加密HTTPS如此重要。1.7 MTU 对上层协议的影响MTU最大传输单元是数据链路层对上层数据的最大长度限制以太网标准 MTU1500 字节。对 IP 协议的影响如果 IP 数据报长度超过 MTU会在网络层分片每个分片都有相同的 16 位标识不同的片偏移和 MF 标志任意一个分片丢失整个 IP 数据报都会被丢弃IP 层不负责重传对 UDP 协议的影响UDP 首部 8 字节IP 首部 20 字节因此 UDP 数据最大不能超过1500-20-81472字节超过 1472 字节会导致 IP 分片丢包率大幅上升UDP 本身不保证可靠性因此使用 UDP 时应尽量控制报文大小对 TCP 协议的影响TCP 通过MSS最大段大小机制避免 IP 分片MSS MTU - IP 首部长度 - TCP 首部长度标准以太网中 MSS1460 字节1500-20-20TCP 在三次握手时双方会在 SYN 包的选项字段kind2中交换自己支持的 MSS 值最终选择较小的 MSS 作为通信的最大段大小这就是为什么 TCP 的滑动窗口是一段段发送的每一段的大小都不超过 MSS确保 IP 层不需要分片。补充逻辑闭环二. ARP 协议IP 地址到 MAC 地址的映射2.1 ARP 协议的作用我们知道 IP 地址可以标识全球主机但数据链路层只能识别 MAC 地址。ARP地址解析协议的作用就是根据 IP 地址获取对应的 MAC 地址。ARP 是一个介于数据链路层和网络层之间的协议它的报文需要封装在以太网帧中传输。2.2 ARP 的工作原理ARP 采用先广播请求再单播应答的工作方式主机 A 要和主机 B 通信知道主机 B 的 IP 地址但不知道 MAC 地址主机 A 在局域网内广播ARP 请求包“谁是 IP 地址 192.168.1.2请告诉我你的 MAC 地址”局域网内所有主机都会收到这个请求只有主机 B 发现请求中的 IP 地址是自己的于是单播ARP 应答包给主机 A“我是 192.168.1.2我的 MAC 地址是 08:00:27:03:fb:19”主机 A 收到应答后就可以用主机 B 的 MAC 地址封装以太网帧进行通信了形象类比在教室里你不知道张三的学号于是大喊一声 “张三是谁告诉我你的学号”只有张三会回应你告诉你他的学号。2.3 ARP 报文格式详解ARP 报文长度为 28 字节封装在以太网帧的数据部分字段长度字节作用硬件类型2链路层网络类型1 以太网协议类型2要映射的协议类型0x0800IP硬件地址长度1MAC 地址长度6 字节协议地址长度1IP 地址长度4 字节操作码op21ARP 请求2ARP 应答发送端以太网地址6发送方 MAC 地址发送端 IP 地址4发送方 IP 地址目的以太网地址6接收方 MAC 地址请求时填全 0目的 IP 地址4接收方 IP 地址为什么 MAC 地址会出现两次细心的读者会发现源 MAC 和目的 MAC 在以太网首部和ARP 数据部分各出现了一次这不是多余的吗这是严格的分层设计原则决定的以太网首部的 MAC 地址是给网卡和交换机看的决定帧在物理上要发给谁ARP 数据部分的 MAC 地址是给操作系统的 ARP 协议看的用于更新 ARP 缓存表类比你寄快递时快递单以太网首部上写了收件人地址包裹里的退款单ARP 数据上也写了收件人地址。快递员只看快递单商家只看退款单各司其职。2.4 ARP 缓存机制如果每次发送数据都要发 ARP 请求效率会很低。因此每台主机都维护一个ARP 缓存表记录 IP 地址到 MAC 地址的映射关系。查看 ARP 缓存表arp -aWindows/Linux 通用缓存条目有过期时间不同系统默认 15-45 秒过期后会重新发送 ARP 请求为什么不能永久缓存因为 IP 地址是动态分配的主机可能更换网卡或下线2.5 ARP 在跨网通信中的作用ARP 不只是在目标子网才会发生每一跳转发都需要 ARP主机 A 要访问外网的百度服务器首先查路由表发现下一跳是网关 192.168.1.1主机 A 发送 ARP 请求获取网关的 MAC 地址网关收到 IP 数据报后查路由表发现下一跳是运营商路由器网关发送 ARP 请求获取运营商路由器的 MAC 地址这个过程会一直重复直到数据到达目标主机结论IP 地址是全程不变的而 MAC 地址每经过一跳都会被重写。2.6 实战获取局域网内所有主机的 MAC 地址我们可以通过ping 扫描 ARP 缓存的方式获取局域网内所有在线主机的 MAC 地址# 1. 扫描局域网内所有IP以192.168.1.0/24为例foriin{1..254};doping-c1-W1192.168.1.$i/dev/null21done# 2. 查看ARP缓存表获取所有在线主机的MAC地址arp-a原理ping 命令会触发 ARP 请求对方主机回复后MAC 地址就会被缓存到本地 ARP 表中。2.7 RARP 协议了解RARP逆地址解析协议的作用与 ARP 相反根据 MAC 地址获取 IP 地址。主要应用场景早期的无盘工作站启动时没有 IP 地址通过 RARP 向服务器请求分配 IP现在已被 DHCP 协议取代几乎不再使用2.8 ARP 欺骗原理与安全问题ARP 协议有一个致命的缺陷它不验证 ARP 应答的合法性只要收到 ARP 应答就会更新自己的缓存表。这就导致了ARP 欺骗攻击的可能。中间人攻击原理攻击者主机 M 向主机 A 发送大量 ARP 应答“我是网关 192.168.1.1我的 MAC 地址是 macM”同时向网关发送大量 ARP 应答“我是主机 A 192.168.1.2我的 MAC 地址是 macM”主机 A 和网关的 ARP 缓存都会被更新认为对方的 MAC 地址是攻击者的 MAC所有主机 A 和网关之间的流量都会经过攻击者主机 M攻击者可以窃听、篡改数据断网攻击原理攻击者向目标主机发送 ARP 应答将网关的 IP 地址映射到一个不存在的 MAC 地址导致目标主机无法上网。下面的图中这个通过打开百度看透全栈可以关注一下三. Linux 内核 ARP 源码解读Linux 内核中 ARP 协议的实现位于net/ipv4/arp.c文件中核心函数包括arp_rcv()处理接收的 ARP 报文和arp_send()发送 ARP 请求 / 应答。3.1 ARP 报文接收函数arp_rcv ()intarp_rcv(structsk_buff*skb,structnet_device*dev,structpacket_type*pt,structnet_device*orig_dev){structarphdr*arp;structnet*netdev_net(dev);// 检查报文长度是否合法if(skb-lensizeof(structarphdr))gotoout_free;arparp_hdr(skb);// 只处理以太网和IP地址的ARP请求/应答if(arp-ar_hrd!htons(ARPHRD_ETHER)||arp-ar_pro!htons(ETH_P_IP)||arp-ar_hln!ETH_ALEN||arp-ar_pln!4)gotoout_free;// 根据操作码处理请求或应答switch(ntohs(arp-ar_op)){caseARPOP_REQUEST:arp_process(net,skb,arp);// 处理ARP请求break;caseARPOP_REPLY:arp_process(net,skb,arp);// 处理ARP应答break;default:gotoout_free;}return0;out_free:kfree_skb(skb);return0;}核心逻辑检查报文长度和协议类型是否合法根据操作码区分 ARP 请求和应答调用arp_process()函数处理报文更新 ARP 缓存表3.2 ARP 报文处理函数arp_process ()staticvoidarp_process(structnet*net,structsk_buff*skb,structarphdr*arp){__be32 sip,tip;unsignedchar*sha,*tha;structneighbour*n;// 提取发送端IP、MAC和目的IPsip*(__be32*)arp-ar_sip;tip*(__be32*)arp-ar_tip;shaarp-ar_sha;thaarp-ar_tha;// 更新ARP缓存表无论请求还是应答都更新发送端的IP-MAC映射nneigh_lookup(arp_tbl,sip,dev);if(n){neigh_update(n,sha,NUD_REACHABLE,0,0);neigh_release(n);}// 如果是ARP请求且目的IP是自己则发送ARP应答if(arp-ar_ophtons(ARPOP_REQUEST)inet_addr_type(net,tip)RTN_LOCAL){arp_send(ARPOP_REPLY,ETH_P_ARP,tip,dev,sip,sha,tha);}}核心逻辑提取 ARP 报文中的发送端 IP、MAC 和目的 IP无条件更新ARP 缓存表中发送端的 IP-MAC 映射这就是 ARP 欺骗的根源如果是发给自己的 ARP 请求则发送 ARP 应答核心考点总结以太网帧格式目的 MAC (6B) 源 MAC (6B) 类型 (2B) 数据 (46-1500B) CRC (4B)MTU1500 字节最小帧长 64 字节14464MAC 地址与 IP 地址的区别IP 地址全程不变标识主机的网络位置MAC 地址每一跳都变标识同一链路内的节点MTU 与 MSSMTU数据链路层最大传输单元以太网 1500 字节MSSTCP 最大段大小标准值 1460 字节TCP 在三次握手时协商 MSS避免 IP 分片ARP 协议作用根据 IP 地址获取 MAC 地址工作方式广播请求单播应答ARP 缓存有过期时间不验证应答合法性ARP 欺骗利用 ARP 的无验证特性实现中间人攻击或断网攻击结尾 我是草莓熊 Lotso若这篇技术干货帮你打通了学习中的卡点 【关注】跟我一起深耕技术领域从基础到进阶见证每一次成长 ❤️ 【点赞】让优质内容被更多人看见让知识传递更有力量 ⭐ 【收藏】把核心知识点、实战技巧存好需要时直接查、随时用 【评论】分享你的经验或疑问比如曾踩过的技术坑一起交流避坑 ️ 【投票】用你的选择助力社区内容方向告诉大家哪个技术点最该重点拆解 技术之路难免有困惑但同行的人会让前进更有方向愿我们都能在自己专注的领域里一步步靠近心中的技术目标结语数据链路层是整个 TCP/IP 协议栈的基础它为上层网络层提供了可靠的链路传输服务。理解了数据链路层的工作原理你就掌握了局域网通信的核心逻辑。虽然我们平时上网时几乎感觉不到数据链路层的存在但它却是网络通信不可或缺的一部分。从以太网帧的封装到 ARP 地址解析每一个细节都体现了计算机网络设计者的智慧。如果你觉得本文对你有帮助欢迎点赞、收藏、关注我会持续分享更多 Linux 底层和网络编程的技术干货。✨把这些内容吃透超牛的放松下吧✨ʕ˘ᴥ˘ʔづきらど