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请求账啥样

 

 

 
posted @ 2015-08-26 11:01  Vooom  阅读(666)  评论(0编辑  收藏  举报