1

当我们正在向其发送数据的计算机突然更改其 IP 地址时,TCP/IP 协议栈的标准行为是什么?发生这种情况时,我们系统中的 ARP 表已经过期,但是这个 IP 的条目没有超时?

有没有办法发现新的 IP-mac 映射,或者我们只是删除排队的数据并返回错误?

4

1 回答 1

10

假设 A 和 B 之间有一个 TCP 连接。A 的 IP 地址突然改变。

从 B 的角度来看,发生的事情很简单:B 继续将其数据发送到 A 的旧 IP 地址。有两种可能:

  • 如果 A 的旧 IP 地址现在未被使用,那么这些数据包将无处可去。它们掉在地板上。B 没有得到任何确认。最终,B 决定连接超时。从B的角度来看,这与A的网络连接完全消失或A崩溃或断电等情况没有区别......
  • 如果 A 的旧 IP 地址已被另一台机器(例如 C)占用,那么 B 发送给 C 的数据包对 C 没有任何意义。它们不会启动新的 TCP 连接(它们没有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 在同一个本地网络上还是在远程网络上,都是一样的。

于 2013-03-03T14:01:17.723 回答