Linux 中奇怪的临时网络中断

Linux 中奇怪的临时网络中断

我面临着一个非常烦人的问题,一周后我注意到了这个问题,但我找不到答案:我的网络突然停止响应,通常会在 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)

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

我在我的机器上运行了wireshark,并让它不断地对我们的网关和同一网段上的另一台机器执行ping操作。然后,在出现网络故障的第一个迹象时,我会检查它并验证网关停止响应 ping,但另一台计算机仍然正常响应。有时是另一台机器停止响应而网关正常,有时则两者都停止响应。我不知道还能做什么,所以我需要一些有关如何进一步调试此问题的帮助或提示,因为系统日志完全正常。

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

答案1

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

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

简而言之,路由器需要知道哪些物理设备拥有它们向其发送 IP 数据包的每个 IP 地址。那么,当两个设备声明相同的 IP 地址时会发生什么情况呢?路由器收到其中一台设备的回复后,就判定该IP地址属于该设备,直到相应的缓存条目过期。缓存条目过期后,路由器将发送新的 ARP 请求,也许这次对方设备的回复速度会更快。这解释了为什么这种情况不稳定:前一分钟路由器还在与您通信,下一分钟它就与另一个人通信。

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

在您的情况下,您的本地路由器似乎将条目在其缓存中保留了 25 秒。当您位于缓存中时,您的可用时间为 25 秒。然后有时另一个人会在看似随机的时刻出现,然后你就会有 25 秒的失落。

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

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

答案2

我建议您在 中拥有 2 个“名称服务器”条目/etc/resolv.conf,第一个条目指的是出现故障或无法访问或定期出现故障的 DNS 服务器。 libc 中的解析器代码将尝试第一个名称服务器 IP 地址,超时后尝试第二个名称服务器 IP 地址,成功。

要测试这一点,您可以将“名称服务器”IP 地址替换为/etc/resolv.conf8.8.8.8,这是 Google 的公共 DNS 服务器。如果没有发生中断,则表明您的名称服务器有问题。

相关内容