我正在构建一个客户端/服务器应用程序,该应用程序并行使用多个网络接口来实现冗余,并且我注意到,当一个网络接口关闭或启动时,其他接口上的通信会挂起几秒钟。
我可以不用我的应用程序以简单的方式重现这种行为:
- 计算机 1 上有 2 个可用接口(以太网和 WiFi)
- 从计算机 2 ping 计算机 1 的以太网连接的 IP 地址
- 断开计算机1的WiFi
- ping 挂起几秒钟,然后数据包再次在两台计算机之间传输。
如果我重新打开计算机 1 上的 WiFi 连接,也会发生挂起的情况。如果我 ping WiFi IP,然后关闭/打开以太网连接(或拔下/插入电缆),也会发生这种情况。
我在两台计算机上都使用 Linux Ubuntu 12.04。
知道为什么会发生这种情况吗?如何避免?
答案1
这是由于 Linux 的“混杂 ARP”行为和 ARP 缓存的有趣组合造成的。本质上,发生的事情是,尽管 wifi 本身没有 IP 地址,但它正在接收 ARP 请求并发送 ARP 响应。如果这是本地子网上的另一台机器(通常是路由器)首先收到的 ARP 响应,那么它将进入 ARP 缓存。当 ARP 条目过时并且重复 ARP 请求时,流量暂停问题得到解决,此时另一个接口给出唯一的响应,一切正常进行。
要停止 Linux 执行“在所有接口上对任何配置的地址执行 ARP”操作,您需要将 sysctl 设置net.ipv4.conf.<interface>.arp_ignore
为1
。