【问题标题】:Socket connect timeouts differ between networks套接字连接超时因网络而异
【发布时间】: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 上我看到了??

标签: c++ linux sockets


【解决方案1】:

也许您应该提供更多地址?目前尚不清楚这些 IP 是什么。

我的猜测是:

  • 在缓慢的情况下,您会遇到 ARP 故障(没有响应,因为目标的网络掩码不正确)
  • 在快速情况下,您会遇到路由故障。如果主机的网络掩码不正确,它甚至不会尝试 ARP。

请尝试 strace 阻塞套接字,错误代码应该不同。

【讨论】:

  • 感谢您唤起我对 arp 方面的记忆。我什至没有想到我的 10.200.234.0/16 网络中实际上可能有一个设备的 IP 为 192.168.1.1,这是我为我的静态设备配置选择的网关 IP。同样,这个想法是选择一个完全失败的配置。但是,一旦我捕获了所有的 arp 数据包,就可以立即发现某些 frickin 设备在 IP 192.168.1.1 的网络上。所以这就是所有超时问题的根源。再次感谢 cdleonard。
猜你喜欢
  • 2015-06-04
  • 1970-01-01
  • 2019-10-21
  • 2011-05-28
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
相关资源
最近更新 更多