【发布时间】:2011-10-25 15:07:24
【问题描述】:
我有一个相当有趣的问题。我们有 2 个网络在工作,它们是彼此的物理副本(网络 A 和网络 B)。它们只是在不同的子网上运行。
我正在为我们在网络上相互集群的设备进行一些容错改进。我正在执行的测试案例之一是这些设备在引入错误配置时的行为。例如,假设我有两个具有以下接口配置的设备:
设备 X IP:10.200.234.127 子网掩码:255.255.254.0 默认网关:10.200.234.1
设备 Y IP:10.200.234.127 子网掩码:255.255.254.0 默认网关:10.200.234.1
这 2 台设备通过集群心跳广播相互发现。心跳包含设备的 IP 地址等,这使它们能够相互建立通信。很标准的东西。现在,假设我引入了网络错误配置,使得其中一个设备配置为不同的 sunbet:
设备 X IP:192.168.1.115 子网掩码:255.255.255.0 默认网关:192.168.1.1
这里发生的情况是,两台设备仍然从集群广播中相互了解(它们在同一交换机上物理连接在一起)。但是,正如您所料,它们无法按预期相互通信。但是,当这些设备尝试相互通信时,我看到一些关于连接超时的奇怪行为。例如,如果设备连接在网络 A 上,则连接尝试会在几秒钟内超时,这很好。现在,如果我将两个设备都放在网络 B 上,我会看到完全不同的行为。在网络 B 上,用于在设备之间建立套接字连接的 connect() 调用不会很快失败。相反,它们会陷入这种退避和重传周期,需要 189 秒才能最终放弃(在 3、6、12、24、48 和 96 秒处重传,已通过wireshark 验证)。
所以我想知道的是,为什么 connect() 调用在网络 A 而不是在网络 B 中如此迅速地失败。我尝试使用阻塞套接字和对 connect() 的调用以及非阻塞套接字和调用 connect(),然后调用 select()。在这两种情况下,我都无法让连接在 189 秒内放弃。我知道我可以在调用中施加更短的超时来选择并更快地放弃,但这不是重点。我正在尝试了解导致此问题的这 2 个网络上可能存在的差异。
【问题讨论】:
-
防火墙可能会拒绝 TCP 段而不回复任何内容,因此连接的主机将继续尝试...
-
嗯......在网络 A 的情况下,当超时立即发生时,我实际上并没有看到任何数据包离开设备。所以也许问题是为什么在网络 A 中我看不到任何数据包,而在网络 B 上我看到了??