客户端绑定如何影响tcp连接?

客户端绑定如何影响tcp连接?,c,linux,sockets,bind,connect,C,Linux,Sockets,Bind,Connect,我有一个带有两个IP地址的客户端系统:10.172.12.13和58.53.12.15 服务器还配置为具有两个IP地址:10.172.12.18和58.53.12.17 现在,在客户端,我首先绑定到本地地址和端口(端口为0),然后执行TCP非阻塞连接 奇怪的行为是,如果我指定10.172.12.13作为要绑定的本地地址,然后连接到服务器中的58.53.12.17,那么它将无法连接,导致错误为“主机不可访问” 但是,如果我在客户机中将本地地址指定为58.53.12.15&然后尝试连接到服务器中的5

我有一个带有两个IP地址的客户端系统:10.172.12.13和58.53.12.15

服务器还配置为具有两个IP地址:10.172.12.18和58.53.12.17

现在,在客户端,我首先绑定到本地地址和端口(端口为0),然后执行TCP非阻塞连接

奇怪的行为是,如果我指定10.172.12.13作为要绑定的本地地址,然后连接到服务器中的58.53.12.17,那么它将无法连接,导致错误为“主机不可访问”

但是,如果我在客户机中将本地地址指定为58.53.12.15&然后尝试连接到服务器中的58.53.12.17,它就会连接

最有趣和令人惊讶的方面是,在执行上述操作之后,如果我再次将10.172.12.13作为本地地址绑定并连接到58.53.12.15,它现在将成功连接。但是,这种情况只发生几分钟。一段时间后,10.172.12.13作为本地地址的连接再次失败


请某人解释发生了什么事?绑定如何影响TCP连接?

通常您从不将客户端套接字绑定到特定接口。通过将其绑定到10.172.12.18(局域网接口),由于专用网络的可见性,您将只能与局域网连接通信

要通过Internet连接到服务器,您只需创建套接字并将其直接连接到外部IP,在您的情况下,外部IP为58.53.12.17

若您想确保客户端将连接到本地可见的服务器,而不是通过Internet,那个么绑定到本地IP可能很有用

这两个IP地址也不一样。阅读一些关于私有和公共IP地址以及它们存在的原因的信息


通过仍然绑定的客户端套接字访问外部IP可能是路由器优化的结果,这些优化将捕获一些路由,并且在没有大的更改的情况下从捕获中使用它们。几分钟后,它会发现路由数据略有不同,并将清除缓存。(这只是想法,可能是完全错误的)

您的服务器端知道如何达到10.172.12.13吗?10.0.0.0/8是专用地址。公共互联网不知道如何路由到它们。我希望
ip路由显示
ip路由显示缓存
ip路由从58.53.12.15获得58.53.12.15
ip路由从10.172.12.13获得58.53.12.15
ip路由刷新缓存
会有所启发。