首页 > 解决方案 > 当 IP 地址改变时 TCP 套接字会发生什么?

问题描述

IP地址更改后写入套接字时是否有任何错误?

在我的我使用 TCP 套接字,读/写(非被动),没有 TCP 或应用程序保持活动。

为了检查这种情况,我使用socat连接到本地网络上的简单回显服务器。在我更改路由器上的客户端 IP 地址并重新启动网络接口之前,连接正常。此时,尽管客户端的 IP 已更改,但我可以毫无错误地写入套接字,但不再传递任何消息。我等了几分钟,然后把 IP 改回来。正在发送所有无法发送的“隐藏”消息。

据我了解,当客户端 IP 更改时,TCP 连接不再存在。为什么更改 IP 后写入套接字时没有错误?这是特定于 Linux TCP 堆栈还是由 TCP/IP 指定?

标签: linuxsocketstcp

解决方案


TCP 连接由源 IP、源端口、目标 IP 和目标端口定义。更改路由器上客户端的 IP 地址不会导致客户端和服务器上的连接立即停止存在;但是,如果您将路由器保持在此状态足够长的时间,则在发生一定数量的重试和超时后,连接最终将不复存在。确切的数量是通过客户端和回显服务器上的可配置内核参数确定的。您可以检查这些参数sysctl -a | grep tcp

在您在路由器上更改客户端的 IP 地址后,客户端仍然能够向服务器发送数据包,并且服务器也能够接收这些数据包,但服务器尝试回复/确认回客户端的尝试无法被路由回客户端。这会导致客户端重试达到一定限制(这就是您在客户端没有看到错误的原因)。一旦您将客户端的 IP 恢复到路由器上,服务器就能够再次与客户端通信,因为路由器现在能够正确地将服务器的数据包路由到客户端。

此重试行为并非特定于 Linux TCP 堆栈。rfc 2988定义了发送者需要用来计算和管理其重传计时器的标准算法。


推荐阅读