如果一台计算机更改了我们要发送数据的IP地址,TCP / IP应该怎么办?

时间:2013-03-03 12:39:27

标签: linux sockets tcp-ip

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

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

1 个答案:

答案 0 :(得分:8)

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

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

  • 如果A的旧IP地址现在未使用,则这些数据包无处可去。他们被丢弃在地板上。 B没有得到任何确认。最终,B决定连接超时。从B的角度来看,这与A的网络连接完全消失或A崩溃或电源关闭等情况无法区分......
  • 如果A的旧IP地址已被其他计算机声明,例如C,则B发送给C的数据包对C没有任何意义。它们不会启动新的TCP连接(它们不会t设置了SYN标志)并且它们与C已知的任何现有TCP连接都不匹配.C将使用RST数据包进行响应,并且B将立即返回“按对等方重置连接”错误插座。

无论哪种方式,TCP连接都被破坏,无法恢复。此外,A或B绝对没有任何关于它的事情。简单地无法使用其旧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是在同一个本地网络上还是在远程网络上是一样的。