Linux 中奇怪的临时网络中断

Cla*_*dio 8 linux networking linux-kernel

我正面临一个非常烦人的问题,一周后我注意到了这个问题,但我找不到答案:我的网络突然停止响应,通常在 25 秒后才恢复。我正在使用内核 3.10.4,现在迁移到 3.11-rc4 以查看是否有更改,但没有,行为是相同的。而且由于通常的网上冲浪处于“突发”状态并且中断是完全随机的,因此很难发现问题,因此我无法确定以前的内核中也存在此问题(我总是使用自定义但来自 kernel.org 的未打补丁的内核,全部由我自己编译)

我也不能说内核是罪魁祸首,但我可以说系统日志上没有任何线索(我检查了两者/var/log/syslog/var/log/messages并且那里没有任何异常)并且硬件似乎没有问题,因为问题显示使用我的任一网卡:

lspci output:

02:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5751 Gigabit Ethernet PCI Express (rev 01)
04:00.0 Ethernet controller: 3Com Corporation 3c905B 100BaseTX [Cyclone] (rev 30)
Run Code Online (Sandbox Code Playgroud)

我已经尝试交换以太网交换机端口,但除了我之外,我工作的其他人仍然没有问题(虽然我们使用类似的机器,但我是唯一使用 Linux 的机器,所以我不得不拿一些臭名昭著的笑话作为嗯……呵呵)。

我在我的机器上运行了wireshark,让它不断地ping我们的网关和同一网段上的另一台机器。然后,在网络故障的第一个迹象时,我会检查它并验证网关停止响应 ping,但另一台机器仍然正常响应。其他时候是另一台机器停止响应,网关正常,其他时候都停止响应。我不知道还能做什么,所以我想要一些关于如何进一步调试的帮助或提示,因为系统日志完全正常。

我有我的内核配置文件和来自 wireshark 的捕获文件,显示了这种情况。我可以在这里或在一些 pastebin 站点上发布,以防有​​人发现它对理解案例有用,请让我知道我应该使用的详细级别(我想没有原始数据的数据包级别就足够了)。

Gil*_*il' 10

这些症状与 IP 地址冲突一致。当您的机器和同一网络上的其他机器尝试使用相同的IP 地址时,就会出现 IP 地址冲突。

在本地链路网络上,寻址基于MAC 地址。每个以太网卡都有自己的 MAC 地址(除非配置严重错误或恶意)。决定向何处发送IP数据包的路由器将在其所有端口上向目标 IP 地址发送ARP请求。该消息有时被称为“谁拥有”:路由器试图找出哪个对等点负责该 IP 地址。一旦路由器收到包含 MAC 地址的回复,它就可以构建一个包含 IP 数据包的以太网帧(以太网数据包)并将其发送到该 MAC 地址。由于此交换需要一段时间,因此路由器会缓存最近的 ARP 信息。(还有其他类型的 ARP 消息,但我在这里解释的内容足以理解当前的问题。)

因此,简而言之,路由器需要知道每个物理设备的 IP 地址是它们发送 IP 数据包的目标。那么当有两个设备声明相同的 IP 地址时会发生什么?路由器收到来自其中一个设备的回复,然后它决定这个 IP 地址属于那个设备,直到相应的缓存条目过期。缓存条目过期后,路由器会发送一个新的 ARP 请求,这次可能对方设备回复得更快。这解释了为什么这种情况不稳定:前一分钟路由器正在与您交谈,下一分钟它正在与另一个人交谈。

如果您不断 ping 某人,则路由器几乎一直将您的 IP 地址保存在其 ARP 缓存中。因此,当您 ping 时,只有一个小窗口,在此期间另一个人可以在缓存中替换您(在您的缓存条目过期后,在下一个 ping 到来之前)。这就是为什么观察问题会使问题大部分消失,这可能会令人沮丧,直到您意识到问题可能是什么。

在您的情况下,您的本地路由器似乎将条目保留在其缓存中 25 秒。当你在缓存中时,你有 25 秒的时间。然后有时另一个人来了,看起来很随意,你会离开它 25 秒。

当您尝试联系同一本地链接上的多台机器时,每台机器都有自己的 ARP 表,因此您可能会观察到不一致的结果,其中一台机器决定您拥有 IP 地址,而另一台机器决定另一个人拥有。

高端路由器会记录 IP 地址冲突,因此如果您认为遇到了冲突,请寻求系统管理员的帮助。首先确保不是您的机器尝试使用它不应该使用的 IP 地址!