如何让TCP程序绑定到任意网络接口?

如何让TCP程序绑定到任意网络接口?

我有一个使用 Boost ASIO TCP 套接字的客户端/服务器网络应用程序。客户端在嵌入式 Linux 系统上运行,该系统有多个可用的网络接口(WiFi、蜂窝等),任何时候都只有一个网络接口处于开启状态并有签名的 IP 地址,如果该接口关闭,则另一个接口处于开启状态并有签名的 IP 地址。我遇到的麻烦是,当应用程序在一个可用接口中创建 TCP 套接字时,它可以将数据传输到远程服务器,但是当该接口关闭时,另一个接口处于开启状态,客户端应用程序仍然使用相同的关闭接口将数据传输到远程服务器,导致服务器无法接收数据。我认为 Linux OS 路由应该能够处理网络接口故障转移,用户 TCP 应用程序不必担心网络接口的变化。感谢任何修复程序的提示。

我在运行 Ubuntu 18 的笔记本电脑上也看到了同样的问题,它同时具有以太网和 WiFi,如果我在以太网连接时运行 ssh 连接到远程站点,当我拔掉以太网电缆时,WiFi 仍然连接,但 ssh 冻结,它无法通过操作系统路由转移连接。

谢谢。

亲切的问候,


您是在说当一个接口关闭时,现有的 TCP 连接会切换接口吗?这行不通,TCP 不是多宿主的,所以这是协议的缺陷,而不是 Linux 的缺陷。另一方面,监听 TCP 套接字将默认使用所有接口,打开 TCP 连接也是如此。

是的,当一个接口出现故障时,现有的 TCP 连接将切换接口。

如果您在客户端-服务器应用程序中控制两侧,请考虑使用多宿主协议,如 SCTP 或 Multipath TCP。

是的,我控制客户端服务器应用程序的两端。我使用 Boost ASIO 套接字,将检查 boost 是否支持多路径 TCP。

还有其他方法可以处理物理链路的故障转移,比如绑定,但它们也要求您能够控制两侧。

是或否,我控制客户端服务器应用程序的两侧,但我只控制服务器平台站点而不是客户端平台站点我可以建议客户端站点更改网络操作,这样可行吗?

谢谢。

答案1

您是在说当一个接口出现故障时,现有的 TCP 连接会切换接口吗?这行不通,TCP 不是多宿主的,所以这是协议的缺陷,而不是 Linux 的缺陷。另一方面聆听TCP 套接字将默认使用所有接口,开幕TCP 连接。

如果你在客户端-服务器应用程序中控制两端,可以考虑使用多宿主协议,例如连续传输协议或者多路径 TCP

我认为 Linux OS 路由应该能够处理网络接口故障转移

它没有,也从未这样做过,其他现有的 TCP 和 UDP 实现也没有。同样,您不能轻松地同时使用多个 ISP,这是一个常见问题解答。

还有其他方法可以处理物理链路的故障转移,比如绑定,但它们也要求您能够控制两侧。

编辑

根据您的服务器和客户端之间的关系,网络的这一部分可能会或可能不会让 SCTP 通过(如有疑问,请测试)。

对于大多数嵌入式 Linux 系统,您应该能够重新编译内核,这是多路径 TCP 所需要的。

如果您不能这样做,您可能会陷入这个问题 - 那么唯一的解决方法是检测接口是否关闭,然后从客户端重新打开连接(假设服务器具有已知的 IP)。

相关内容