OS X 在Cisco无线环境下丢包分析 part 1
补发一篇博客,之前遇到的没有写成博文的一个情况。我擦,那一阵儿真是被无线搞疯了。
现象:苹果OS X用户连入WiFi之后莫名丢包,而且有规律的丢,丢个5s恢复正常,再过会儿再丢5s左右。
就如同这样
64 bytes from 10.11.12.13: icmp_seq=135 ttl=63 time=3.705 ms 64 bytes from 10.11.12.13: icmp_seq=136 ttl=63 time=3.473 ms 64 bytes from 10.11.12.13: icmp_seq=137 ttl=63 time=3.811 ms 64 bytes from 10.11.12.13: icmp_seq=138 ttl=63 time=4.110 ms Request timeout for icmp_seq 139 Request timeout for icmp_seq 140 Request timeout for icmp_seq 141 Request timeout for icmp_seq 142 Request timeout for icmp_seq 143 64 bytes from 10.11.12.13: icmp_seq=144 ttl=63 time=5.417 ms 64 bytes from 10.11.12.13: icmp_seq=145 ttl=63 time=3.587 ms 64 bytes from 10.11.12.13: icmp_seq=146 ttl=63 time=3.744 ms 64 bytes from 10.11.12.13: icmp_seq=147 ttl=63 time=3.486 ms 64 bytes from 10.11.12.13: icmp_seq=148 ttl=63 time=3.466 ms
尼玛,当时真把我吓得虎躯一震,因为那个WiFi和那个VLAN以及地址池刚建好。
分析:发现那部分丢包的OS X用户所连的WiFi背后的VLAN,在核心交换上启用了ip arp inspection vlan xxx,这下感觉问题来了,但是奇怪的是,核心交换上并没有出现任何的相关日志。因为之前其实对arp inspection并不了解的太多,在核心交换上虽然没有口直接和WiFi背后那个VLAN相连,但是还是把那个VLAN也在核心交换上inspection了,同时还启用了针对这个VLAN的dhcp snooping。我把针对这个VLAN的arp inspection和dhcp snooping去掉之后这现象就没了。
google也搜到的类似现象:
https://discussions.apple.com/thread/5483424
https://www.reddit.com/r/sysadmin/comments/1yc6n1/packet_losses_with_new_os_x_mavericks_make_sure
抓包分析:
万事靠抓包,此话一点不假。抓出来包和上面两个链接里的分析完全一样!!!下面是抓包的截图,这个抓包里我只保留了arp的包,因为从arp的包里就能看的很清楚了。
通常是先丢5个包,这5个arp请求包都是用的单播,大家都知道arp是广播,但是我也觉得是见了鬼了,竟然能见到单播的arp请求。而这些单播的arp请求都没有得到网关的回复。直到5次尝试之后,采用的broadcast ARP去请求,这时才得到的回复,如上图所以。等到下次再去请求时,又是同样的场景重演,5次尝试失败,再开启broadcast请求。当然两次5个包的请求之间的其他包我过滤掉了,我这里只看了ARP的包。
ps. OS X的ARP超时时间貌似是30s,因为它的架构方式还是和Linux有挺大区别的,找了半天也没找到在哪看,我是用sysctl -A这个命令去看的,出来看到这样一条“net.link.ether.inet.arp_llreach_base: 30”,然后去Google了一下这个值是代表了啥,从这个网页(http://www.opensource.apple.com/source/xnu/xnu-2050.9.2/bsd/net/if_llreach.c?txt)的解释来看应该是ARP超时时间(请在这个网页搜索 “net.link.ether.inet.arp_llreach_base”然后结合上下文)。
回到这个问题上来,这种单播的ARP到底长啥样呢,如下图
我是这么理解这个单播ARP请求的:它为了在ARP超时之前更新自己的ARP record, 它会“明知故问”的去向网关请求,你看它的目的mac和目的IP都是很明确的,就是发给你网关,也就是说我这个时候知道你就是网关,但是我还是要问你谁是网关,当然如果网关上没有什么特殊配置的话,网关就会回复当然我是网关啦,然后OS X的ARP表就得以更新了,而且是用的单播发出的,这样可以避免使用广播、减少带宽占用。但是如果网关上有arp inspection,网关就会觉得很奇怪,你明明目的地址是我,你还问who has 我的IP,我网关认为你的这个包是很可疑的,我就丢弃掉,且不回答你,直到你用正常的broadcast去问who has 我的IP,这时候我再告诉你。
下面是正常的broadcast ARP请求账啥样