当我们正在向其发送数据的计算机突然更改其 IP 地址时,TCP/IP 协议栈的标准行为是什么?发生这种情况时,我们系统中的 ARP 表已经过期,但是这个 IP 的条目没有超时?
有没有办法发现新的 IP-mac 映射,或者我们只是删除排队的数据并返回错误?
假设 A 和 B 之间有一个 TCP 连接。A 的 IP 地址突然改变。
从 B 的角度来看,发生的事情很简单:B 继续将其数据发送到 A 的旧 IP 地址。有两种可能:
SYN
标志设置)并且它们与 C 已知的任何现有 TCP 连接都不匹配。C 将响应RST
数据包,B 将立即在套接字上返回“对等连接重置”错误。无论哪种方式,TCP 连接都已断开且无法恢复。此外,A或B绝对无能为力。A 根本无法使用其旧 IP 地址接收(或发送)任何更多流量。不可能在此 TCP 连接上实现任何进一步的通信。
从A的角度来看,它有点不同。更改 A 的 IP 地址后,它最终会出现这样一种情况,即它有一个绑定到本地 IP 地址和端口的套接字,而该本地系统上不再存在。这通常是不允许的(您不能调用bind()
绑定到不是系统有效本地 IP 地址的 IP 地址),但无论如何它已经通过了。TCP/IP 标准没有说明在这种情况下应该做什么,但实际行为是 A 会立即使套接字无效并立即向应用程序返回某种错误。
总结:A检测到问题并立即断开连接,而B可能需要一些时间才能检测到问题并返回错误。
至于 ARP 表,我不确定您为什么要提出这个问题,因为它位于较低层(数据链路层),与 IP(更不用说 TCP)层发生的事情没有太大关系. 但是,是的,与 A 位于同一本地网络(例如本地路由器)上的节点的 ARP 表现在有一个陈旧的 A 旧 IP 地址条目。他们很快就会为 A 的新 IP 地址获得一个新的有效条目(他们第一次尝试向该 IP 地址发送数据包时),所以这不是问题。陈旧的条目可能会导致旧 IP 地址的流量被错误地定向到 A,但如果其他一些节点获取 A 的旧 IP 地址,那么免费 ARP 也会处理这个问题。
最后,问题“有没有办法发现新的 IP-mac 映射,或者我们只是删除排队的数据并返回错误?” 没有意义。当然有一种方法可以发现新的 IP-mac 映射:它称为 ARP。这是 ARP 的唯一功能。但它与排队数据无关,这是一个仅在协议栈上具有两层或多层含义的概念。
在评论中,您澄清说您正在谈论 A 和 B 彼此位于同一本地网络上的情况,但这对答案没有任何影响。无论 A 和 B 在同一个本地网络上还是在远程网络上,都是一样的。