Foreword
ARP相关的问题进行测试或者找问题的时候可真麻烦,很容易受到习以为常的一些操作的干扰,导致无法发现真实的原因
问题场景
设备不上线的问题太多了,各种各样的,还都是偶发,没有现场,无法复现,针对这个问题造成的情景很多,下面 一一列举:
- 设备上了AP,但是不上PC,重启电脑可以好
- 设备上了AP,但是不上PC,ping一下设备可以好
- 设备不上线,重启设备可以好
- 设备不上线,重启AP可以好
- 设备不上线,等待5分钟甚至更久自动就好了
以上问题大部分情况下基本都是同一个东西造成,mac表错误,设备发送的包全都被丢弃了,要理解这个问题需要知道下面的机制
机制
以下机制都经过了验证,确实会出现ARP广播
ARP机制
二层局域网中,如果设备之间通信不仅仅需要知道IP地址,还需要知道mac地址,ARP的作用就是在加入一个新的局域网的时候自动广播一次,告诉局域网内的其他设备,他加入了,其他设备就会存储他的mac和ip,下次通信时就知道包要发给哪个mac地址了。
ARP比较特殊,他是网络层协议,但是工作在数据链路层
有些路由器的控制软件,比如Winbox,就可以直接二层通信,只需要mac即可,完全不需要ip地址,这种就很方便,在IP配置错误的情况下,也能通过mac连接,然后修改正确
AP/路由的ARP机制
二层设备,AP一般都属于二层,他们都是不会主动进行ARP广播的,只会监听局域网内的ARP,并偷偷记录下来,遇到需要转发的包时就知道送给谁了,如果这个包的mac不存在就会直接丢掉
三次设备,路由器,这种设备会在内部维护路由表,联动ARP的mac表,他会自主进行维护,所以他会主动发起ARP广播
- 以上只是通常意义下的情况,特殊情况二层也是会广播的,比如在和二层设备通信时,他肯定需要主动广播ARP
还有一个特殊情况,ARP Proxy,这个东西会代理回复或者发起ARP,这个东西也算是搅局者,被干扰的话也比较难辨别
网口ARP机制
网卡被设置IP时会自动广播一次ARP,同样重启网卡、物理插拔也会重新广播ARP
- 相同设置再次设置时不会触发
设备端ARP
泛指客户端设备,比如WIFI模块、PC,他们在与PC或者其他东西通信时,内部会维护一个mac和ip的地址表,正常情况下这个表会在加入新网络或者网络断开时重新刷新,或者急速老化
Ping
Ping比较特殊,在主动发起Ping时,设备方如果mac表中不存在对应设备,那么就会发起一次ARP广播,询问这个IP的mac是什么
同理,当被ping的设备收到了这个ping包,也会更新自己的mac表,记录下这个来访者
Wireshark
Wireshark本身是被动抓包工具,默认不会主动发送ARP广播;但打开抓包后,可能出现“间接触发”的ARP流量,让你误以为是Wireshark发的;
可能的间接触发原因:
- 网卡被唤醒/切到D0全功率:驱动退出省电或关闭卸载后,操作系统/驱动可能立即发出GARP、ARP探测以刷新邻居表与交换机学习表;
- 关闭/调整硬件卸载:混杂模式与关闭RSC/合包等设置,会促使协议栈重新校验邻居条目,从而触发ARP;
- 地址/链路状态轻微抖动:开始抓包时网卡重配或状态切换,Windows可能发送GARP或进行DHCP续租,伴随ARP解析;
- 附带组件或其他工具:安装Npcap时若同时装了Nmap/nping并被调用,才可能主动发包;Wireshark自身不主动扫描;
开了Wireshark反而可能导致问题无法复现,主要还是改了网卡的设置,造成网卡重启了,ARP就广播了
问题成因
设备从SSID:A切换到SSID:B,发包时会重新问一次这个IP对应的mac是谁,如果相同就更新地址表的刷新时间,如果不同那就会替换成新的mac
我们目前出现不上线的问题,基本都是这里,设备端切换SSID后,没有更新他的目标mac地址(PC的mac地址),他发送的地址一直都是错误的,这个mac地址不存在,直接就被丢弃了,所以连上了AP,但是PC收不到。要等到设备主动更新他的mac地址、PC重启、网口重启、网口重设IP、电脑重启等任一条件发生,这个设备才会正常上线。
- 设备自身更新mac表要5分钟,所以就出现了等5分钟自己上线了
测试验证
测试验证设备是否正常上线
- 同一个AP同一个电脑同一个设备下2个SSID来回切换,没有问题
- 2个AP同一个电脑同一个设备下2个SSID来回切换,没有问题
- 2个AP分别连2个电脑,各开一个SSID,切换,有问题
- 2个AP分别连2个电脑,各开一个SSID,切换,ping一下飞机,没有问题
- 2个AP分别连2个电脑,各开一个SSID,切换,重启PC,没有问题
- 2个AP分别连2个电脑,各开一个SSID,切换,重启网卡,没有问题
- 2个AP分别连2个电脑,各开一个SSID,切换,缩短设备mac地址刷新时间,没有问题
- 2个AP分别连2个电脑,各开一个SSID,切换,打开Wireshark,没有问题
这里还混合了一个情况,PC自己有mac表管理,可能在测试的时候会出现pc自己主动发起了ARP,这个会搅和在测试中,某些情况就会受到影响,你分不清是谁让这个情况变好了
PC端ARP相关配置
查看网口设备
netsh interface ipv4 show interface
Idx Met MTU 状态 名称
--- ---------- ---------- ------------ ---------------------------
1 75 4294967295 connected Loopback Pseudo-Interface 1
7 25 1500 disconnected WLAN
19 25 1500 disconnected 本地连接* 9
10 25 1500 disconnected 本地连接* 10
11 25 1500 connected 以太网
23 5 1500 disconnected 以太网 2
14 35 1500 disconnected 以太网 3
22 35 2800 connected ZeroTier One [b6079f73c6ba32c3]
13 65 1500 disconnected 蓝牙网络连接 3
查询具体网络设备的配置
netsh interface ipv4 show interface 7
接口 WLAN 参数
----------------------------------------------
IfLuid : wireless_32768
IfIndex : 7
状态 : disconnected
跃点数 : 25
链接 MTU : 1500 字节
可访问时间 : 35000 毫秒
基本可访问时间 : 30000 毫秒
重传间隔 : 1000 毫秒
DAD 传输 : 3
站点前缀长度 : 64
站点 ID : 1
转发 : disabled
播发 : disabled
邻居发现 : enabled
邻居无法访问检测 : enabled
路由器发现 : dhcp
受管理的地址配置 : enabled
其他有状态的配置 : enabled
弱主机发送 : disabled
弱主机接收 : disabled
使用自动跃点数 : enabled
忽略默认路由 : disabled
播发的路由器生存期 : 1800 秒
播发默认路由 : disabled
当前跃点限制 : 0
强制 ARPND 唤醒模式 : disabled
定向 MAC 唤醒模式 : disabled
ECN 功能 : application
基于 RA 的 DNS 配置(RFC 6106) : disabled
DHCP/静态 IP 共存 : disabled
这里的可访问时间和基本可访问时间就是ARP表中的刷新时间
修改ARP时间
netsh interface ipv4 set interface 9 basereachable=60000
显示地址表
netsh interface ipv4 show neighbors
ARP表项修改
# 设置为 4096 个条目
netsh interface ipv4 set global neighborcachelimit=4096
# 验证修改结果
netsh interface ipv4 show global
neighborcachelimit 是新的取代ARP的,需要独立设置表项大小,PC上ARP的机制或者代号改来改去的,和系统有很大关系
Summary
一些大厂的WIFI模块,本身就有类似的测试用例,所以ARP相关机制都会补全,但是一些原生的WIFI模块,二次开发的,这块内容是否有验证,就很值得怀疑了,这个情况复杂,又不容易复现,很容易被各种推脱跳过去了。