ARP协议详解:从MAC地址解析到华为设备排障实战
1. ARP到底在解决什么问题1.1 为什么有了IP地址还不够很多刚接触网络的朋友都会有这个疑问两台设备通信直接用IP地址定位不就行了为什么还要搞一个ARP去解析MAC地址这个问题想明白了ARP就学懂了一半。IP地址是逻辑地址它解决的是“这台设备在哪个网络里”的问题。但数据在局域网里传输靠的是以太网帧以太网帧在链路上寻址用的是MAC地址也就是物理地址。你可以这么理解IP地址是人的姓名MAC地址是人的身份证号。你在一个小区里找人光喊名字是不够的你得知道对方具体住哪栋楼、哪一户才能真正把东西递到手上。ARP干的事情就是“根据姓名查到身份证号”或者说“根据IP地址查到对应的MAC地址”。从HCIA考试的角度看ARP是数据链路层和网络层之间的桥梁协议它本身工作在数据链路层但服务对象是网络层的IP协议。这个定位很容易考到也是理解后续所有ARP细节的基础。1.2 ARP在通信流程中的位置假设有两台主机A和BIP分别是192.168.1.10和192.168.1.20它们在同一个网段中间可能只隔着一台交换机。A要向B发送数据流程是这样的A检查自己的路由表发现B跟自己同网段不需要走网关A需要构造一个以太网帧帧里有源MAC和目的MAC但A只知道B的IP不知道B的MACA先发一个ARP请求广播问“谁是192.168.1.20请把你的MAC地址告诉我”B收到这个请求后发现问的是自己就回一个ARP应答把自己的MAC地址告诉AA拿到这个MAC地址把数据封装成以太网帧发出去同时把这个IP和MAC的对应关系放进自己的ARP缓存表里下次再通信就不用重新问了。如果A和B不在同一个网段情况又不一样了。A会把数据先发给网关这时候ARP解析的对象就不是B而是网关的MAC地址。很多初学者在这里容易懵明明我要访问的是远处那台服务器为什么抓包看到的ARP请求问的是网关的IP因为跨网段通信时数据帧的目的MAC必须是下一跳设备的MAC只有到了路由器路由器才会再通过ARP去解析下一跳或最终主机的MAC。2. ARP报文结构和原理拆解2.1 ARP报文格式逐字段分析HCIA考试对ARP报文格式的考查不像思科认证那么深但你要能说出来每个字段是干什么的至少要能看懂抓包结果。ARP报文分为两部分前面的ARP头部加上后面的四个地址字段总共28字节。先看硬件类型占2字节以太网环境下值为1表示以太网。协议类型占2字节表示上层协议IP协议对应的值是0x0800。紧跟着是硬件地址长度和协议地址长度各占1字节以太网环境下分别固定为6和4——这个“6和4”很好记MAC地址是48位也就是6字节IP地址是32位也就是4字节。接下来是操作码占2字节取值1表示ARP请求2表示ARP应答。这一个字段在抓包时最重要你看到Opcode等于1就知道这是请求等于2就知道这是应答。后面依次是发送端MAC地址6字节、发送端IP地址4字节、目的MAC地址6字节、目的IP地址4字节这4个字段合起来占20字节。需要注意一点ARP请求里“目的MAC地址”字段是全0因为请求方本来就想问“这个IP对应的MAC是谁”所以在请求报文里这个字段是空的。而“发送端MAC”和“发送端IP”是填写请求方自己的信息应答方收到之后可以顺便学习到请求方的MAC地址这也是ARP缓存表填充的一个来源——不一定非要主动发请求才能学到对端信息收到别人的请求也能学到。2.2 请求为什么是广播应答为什么是单播这是HCIA常考的一个细节也是理解ARP行为逻辑的关键。ARP请求帧的目的MAC地址是FF-FF-FF-FF-FF-FF也就是广播地址。为什么必须用广播因为A不知道B的MAC地址也不知道B在哪儿只能在本地网络里“喊一嗓子”让所有人都听到然后等待目标自己回应。广播域内所有设备都会收到这个帧网卡发现目的MAC是广播地址就会把帧交给上层协议栈处理。但这不代表局域网里每个人都会回应。协议栈收到ARP请求后会检查“目的IP地址”字段是不是自己的IP只有IP匹配的设备才会回应其他设备默默丢弃不回复。应答帧就不一样了。B既然收到了A的广播请求自然就知道了A的MAC地址所以B可以直接构造一个单播帧回复给A目的MAC填A的MAC地址。这个设计很聪明避免了一台设备广播应答造成网络上的无谓流量。如果应答也广播每台主机发起一次解析整个广播域就要跟着广播一轮二层网络早就被淹没了。2.3 ARP缓存机制ARP缓存是为了避免每次通信都发广播解析地址。发一次广播是有成本的尤其是大广播域里一次ARP广播要打扰到所有设备。所以每台设备都会把最近解析到的IP-MAC对应关系缓存起来下次通信直接查缓存没有命中才再发ARP。华为设备上用命令display arp查看ARP表项输出的每一行基本包含IP地址、MAC地址、VLAN、接口、类型和老化时间这几列。这个命令是HCIA实操考试里极可能考到的也是日常排障第一步必敲的命令。缓存表项分两类动态表项是设备通过ARP协议自动学习的会老化静态表项是管理员手工配置的不会老化。老化时间在华为设备上默认是120秒也就是说一条动态ARP表项如果120秒没有被使用就会被删除。下次再通信需要重新走一遍ARP解析流程。我之前遇到过不少同事在排障时忽略老化时间明明ping断了但只要还有ARP缓存某些业务还是能通信反过来有些设备ARP表项刚老化突然要发包第一包丢了、第二包才通就是因为新解析需要时间第一包等不到应答就被缓存的报文上报丢弃了。这个问题后面在排障部分还会展开说。3. 华为设备上的ARP分类与配置3.1 动态ARP、静态ARP和代理ARP华为设备的ARP体系从考试角度核心要掌握三类动态ARP、静态ARP、代理ARP。免费ARP也算一个特殊的类型后面单独说。动态ARP是默认工作方式设备自动发送ARP请求、自动接收ARP应答、自动维护缓存表。优点是不用手工干预网络拓扑变化后能自适应。缺点也明显ARP报文没有认证机制任何人都可以伪造动态学习到的表项不一定可信这就为ARP欺骗留下了空间。静态ARP是管理员手动指定的固定映射关系。命令格式大概是这样[Huawei] arp static 192.168.1.20 00e0-fc12-3456这样配置之后设备查ARP表时优先用静态表项不再动态学习这条映射。静态ARP适用于对安全性要求高的场景比如网关设备的MAC地址手工固定下来防止网关被伪造。但它的维护成本高IP地址如果变了要及时同步修改静态表否则整段通信直接断掉。代理ARP是路由器代答的一种机制。当设备发出的ARP请求找不到目标时如果路由器接口开了代理ARP功能路由器就会代替目标来应答“你要找的那个IP我知道你把帧发给我就行我来转。”这种情况下设备以为对方跟自己在一个二层网络里实际上数据是先发给路由器转发的。华为接口下开启代理ARP的命令是[Huawei-GigabitEthernet0/0/0] arp-proxy enable代理ARP在HCIA里更多是概念性考查让你判断在某种组网下设备能不能通信。记住一个核心场景主机配置了错误的子网掩码以为目标跟自己同网段实际不在如果不开代理ARP通信就失败开了之后路由器代答数据发到路由器路由器替它转发通信就通了。3.2 免费ARP的作用免费ARPGratuitous ARP是指主机在接口up或IP地址配置完成后主动发一个ARP请求询问自己的IP地址对应的MAC地址是谁。这个请求有两个作用一是通告自己。主机主动把自己的IP-MAC映射广播出去让局域网里其他设备的ARP缓存表都刷新成自己的信息这样后续别人想找我直接查缓存就能拿到正确MAC。二是探测IP地址冲突。如果局域网里已经有别的设备占用了这个IP那台设备会回应这个免费ARP发请求的设备就知道自己IP跟别人冲突了接口会被置为down状态或者打印冲突告警。抓包软件里看到免费ARP的特征是ARP请求的发送端IP和目的IP都是本机自己的IP。这一点太好认了一眼就能看出来。在华为设备上如果接口下配置了IP地址系统会自动发送免费ARP。日常看到“IP address conflicts”之类的日志提示多半就是免费ARP探测出来的。4. 实际业务中的ARP排障实战4.1 网关ARP表项丢失去哪查先说一个最常见的故障场景电脑能ping通同一交换机下的其他电脑但ping不通网关也就上不了外网。第一步先确认网关设备是否正常这个不展开。第二步看电脑的ARP表——Windows下用arp -a命令查看。重点看默认网关的IP对应的MAC地址是否正常。如果网关的MAC地址显示为全0或者显示成了另外一台设备的MAC那基本就可以判断ARP解析出了问题。如果电脑里根本查不到网关的ARP表项说明电脑发出的ARP请求没有回应。可能是网关接口down了也可能是中间的二层链路有问题还可能网关设备开启了类似“抑制ARP广播”的安全策略把请求拦掉了。这时候在网关设备上做抓包或者直接在网关设备上ping一下这台电脑触发网关主动发起ARP解析看能不能学到电脑的MAC。4.2 ARP欺骗的判断和应对ARP欺骗是最常见的二层攻击手段原理就是利用了ARP无认证的特性。攻击者不停发送伪造的ARP应答说自己就是网关于是受害者的ARP缓存表里网关IP对应的MAC被改成了攻击者的MAC。受害者发出去的流量都会先经过攻击者的网卡数据被截获后再转发出去中间人攻击就成立了。在华为交换机上排ARP欺骗最直接的方法是查看端口下的ARP表项数量和MAC地址是否异常。一个物理端口下有大量不同的IP对应同一个MAC或者一个MAC地址在多个端口上反复横跳这都是典型特征。更稳妥的防范思路是三层设备上开启ARP表项严格学习限制接口下动态学习ARP表项的数量安全要求更高的网络核心设备网关的MAC最好配置成静态ARP。这些配置在HCIA阶段不用实操但理解思路对日后工作很有帮助。有人问过ARP欺骗是不是只能靠防火墙防防火墙有专门的防ARP欺骗模块但这不是唯一手段。交换机端口安全、动态ARP检测DAI都是有效方案只是不同方案的部署位置和原理不一样。HCIA不要求这么深但至少要知道“有这些手段存在”。4.3 常见ARP问题速查表现象可能原因排查方向电脑能ping同网段ping不通网关网关接口故障或网关IP错误检查网关设备接口状态和IP配置首次ping不通第二次通ARP缓存老化后重新解析丢第一包延长老化时间或业务侧重试规避电脑频繁掉线但设备本身正常ARP表项被伪造或冲突抓包看重复MAC检查端口安全抓包看到大量ARP广播局域网内主机过多且流量模型碎片化划分VLAN缩小广播域ping外网通访问业务系统卡顿核心设备ARP表项过多导致CPU处理慢清理无用ARP表项配置ARP表项限制5. HCIA考试中ARP的高频考点与实操要点5.1 笔试考点逐条梳理HCIA笔试对ARP这块考得不难但覆盖面广容易出概念辨析题。我把做模拟题和实际考试中反复出现的考点整理一下。第一个考点是“ARP解决了什么问题”。选项一般设置成“IP地址和MAC地址的映射”之类这个就算不懂网络也能选对算是送分题。第二个考点是“ARP请求和应答的寻址方式”。请求是广播、应答是单播这个知识点我前面强调过考试会直接考而且会换着花样考比如给你一个抓包截图让你判断这个帧是请求还是应答。第三个考点是“ARP缓存老化”。题目会给一个场景设备A和B通信过了一段时间又断了一会儿再通信时第一包丢了问原因。记忆点就是老化时间到期后重新解析的时延。第四个考点是“免费ARP”。会问你免费ARP的功能重点记住“IP冲突检测”和“通告自身映射”这两个作用。第五个考点是“代理ARP”。一般会结合子网划分的题目一起出判断在不开代理ARP的情况下两台主机能不能通信。5.2 实验考试中必会的三条命令任子网络实验操作题里跟ARP相关的操作就这么几条熟练了就行。第一条就是display arp。任何涉及网络连通性排查的实验敲这个命令能看到当前设备的ARP学习情况。如果实验要求你验证某台主机是否在线ping完之后用这个命令查看能看到对应IP的MAC已经被学习到就说明二层通信正常。第二条是display arp packet statistics查看ARP报文统计信息。这个命令可以看总的学习报文数、表项刷新次数等。如果发现表项一直在刷新说明网络里有设备在频繁发送ARP报文很可能有异常。第三条是静态ARP配置也就是前面写过的[Huawei] arp static 192.168.1.20 00e0-fc12-3456实验场景里如果需要固定某个IP的MAC就用这个。配置完记得用display arp确认表项类型是静态的。5.3 一个容易忽略的细节ARP表项的老化时间配置华为设备默认ARP动态表项老化时间是120秒但这个值是可以调的。老化时间配置在系统视图下用arp expired-time调整可以设置的范围一般是0到1440分钟。你没看错单位是分钟不是秒。有些现场网络对时延敏感业务报文一有丢包就告警排下来发现是ARP老化重解析导致的第一包丢失。很多运维为了避免这个问题直接把老化时间调大比如调到240分钟甚至更大。但调大的代价是主机换IP或者换网卡之后设备里的ARP表项长期不变在一段时间内会持续往旧MAC地址上发数据业务中断时间反而更长。所以这个参数不是越大越好要根据业务实际情况折中。默认的120秒对大部分场景是合理的如果现场确实第一包丢包影响业务建议先抓包确认是不是ARP重解析导致的再决定要不要调老化时间不要盲调。6. 我个人的一点实操体会做运维这些年Arp相关的坑踩了不少有几个体会不得不说。排网络故障第一步永远是查ARP表。很多看似复杂的“怎么会不通”“怎么时通时断”的问题最后落地就是一串ARP表项的事情。先把二层地址对应关系理清楚再往上层查效率高很多。我之前有个现场组网前端设备反复报错后台查了一圈IP路由都正常最后就是前端设备的ARP缓存里网关MAC变成了另一台终端的MAC被伪造了。这种问题如果不从ARP入手可能排查一整天都找不到方向。另外在广播域较大、终端数量很多的网络里ARP广播报文本身就是一个不可忽视的负载来源。几百台终端同时上线ARP请求瞬间爆发核心交换机的CPU占用率会明显上升。这种场景下不仅要合理规划VLAN减小广播域还可以关注设备CPU是否承担了不必要的ARP处理。你在规划网络时把ARP因素考虑进去比事后加防护策略从容得多。