繁体   English   中英

当 IP 地址改变时,TCP 套接字会发生什么变化?

[英]What happens to TCP socket when IP address changes?

IP地址变化后写入套接字是否有错误?

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM