gpt4 book ai didi

c++ - 网络之间的套接字连接超时有所不同

转载 作者:太空宇宙 更新时间:2023-11-04 04:27:03 25 4
gpt4 key购买 nike

我有一个相当有趣的问题。我们有 2 个正在工作的网络,它们是彼此的物理拷贝(网络 A 和网络 B)。它们只是在不同的子网上运行。

我正在为网络上相互集群的设备进行一些容错改进。我正在练习的测试用例之一是这些设备在引入错误配置时的行为。例如,假设我有两台具有以下接口(interface)配置的设备:

设备 XIP:10.200.234.127子网掩码:255.255.254.0默认网关:10.200.234.1

设备 YIP:10.200.234.127子网掩码:255.255.254.0默认网关:10.200.234.1

这两个设备通过集群心跳广播来发现对方。心跳包含设备的 IP 地址等,这允许它们相互建立通信。相当标准的东西。现在,假设我引入了网络配置错误,其中一个设备被配置为不同的 sunbet:

设备 XIP地址:192.168.1.115子网掩码:255.255.255.0默认网关:192.168.1.1

这里发生的情况是,两个设备仍然从集群广播中相互了解(它们在同一交换机上物理连接在一起)。但是,正如您所期望的那样,它们无法按预期相互通信。但是,当这些设备尝试相互通信时,我看到一些关于连接超时的奇怪行为。例如,如果设备连接在网络 A 上,连接尝试会在几秒钟内超时,这很好。现在,如果我将两个设备都放在网络 B 上,我会看到完全不同的行为。在网络 B 上,用于在设备之间建立套接字连接的 connect() 调用不会很快失败。相反,它们会陷入这种退避和重传周期,需要 189 秒才能最终放弃(经wireshark验证,在 3、6、12、24、48 和 96 秒重传)。

所以我想知道的是,为什么 connect() 调用在网络 A 中失败得如此之快,而在网络 B 中却不然。我尝试过使用阻塞套接字和调用 connect() 以及非阻塞套接字和调用 connect() 然后调用 select()。在这两种情况下,我都无法在 189 秒内放弃连接。我知道我可以在调用中施加更短的超时来选择并更快地放弃,但这不是重点。我试图了解这两个网络上可能存在哪些不同导致了此问题。

最佳答案

也许你应该提供更多地址?目前还不清楚这些 IP 到底是什么。

我的猜测是:

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

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

关于c++ - 网络之间的套接字连接超时有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7891436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com