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

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

问题描述:

当我们发送数据的计算机突然改变其IP地址时,TCP/IP协议栈的标准行为是什么?发生这种情况时,我们系统中的ARP表已过时,但是此IP的条目未超时?如果一台计算机更改了我们发送数据的IP地址,TCP/IP应该做什么?

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

+0

你是在谈论一个TCP连接(或者UDP)或者更低层的任何东西? – Bruno 2013-03-03 12:41:35

+0

我的意思是当一台计算机有很多数据发送到同一本地网络区域中的另一个终端系统,并且它改变了它的IP地址时,我们将为剩余数据包添加到以太网标头的mac地址是什么样子的呢@bruno – 2013-03-03 12:48:47

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

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

  • 如果A的旧IP地址现在没有使用,那么这些数据包将无处可用。他们被扔在地板上。 B没有得到任何确认。最终,B决定连接超时。从B的角度来看,这与A的网络连接完全消失或者A崩溃或电源关闭等情况是无法区分的。
  • 如果A的旧IP地址被另一台机器声称,例如C ,那么B发送给C的数据包对C没有任何意义。它们不会启动新的TCP连接(它们没有设置SYN标志),它们也不匹配已知的任何已知的TCP连接到C. 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表现在具有旧的IP地址的陈旧条目。尽管他们第一次尝试发送数据包到这个IP地址,他们会很快获得A的新IP地址的有效条目,所以这不是问题。陈旧的条目可能会导致旧IP地址的流量在A处被误导,但是如果其他节点拿起A的旧IP地址,那么免费ARP也会照顾到这一点。

最后,问题:“有没有办法发现新的IP-mac映射,或者我们简单地删除排队的数据并返回错误?”没有意义。当然,有一种方法可以发现新的IP-mac映射:它被称为ARP。这是ARP的唯一功能。但它与排队数据无关,这是一个概念,它只在协议栈上具有两层或更多层的含义。

在一则评论中,您澄清说您所谈论的是A和B在同一个本地网络上的情况,但这对答案没有任何影响。 A和B在同一本地网络上还是在远程网络上都是一样的。

+0

假设连接是TCP,节点B稍后会检测到更改,但对于UDP,即使A没有更改它的IP地址也没有响应,那么B怎么知道它。我提到了ARP,因为我不知道当它收到一个带有正确以太网报头但IP地址错误的数据包时,A是否可以发送一些错误消息? @Celada – 2013-03-03 14:17:53

+0

对于UDP,B永远不会知道它。如果这是应用程序的功能,它会很乐意继续将数据报发送到A的旧IP地址。 – Celada 2013-03-03 14:31:24

+0

不,如果收到一封没有发给它的数据包,它不会发送错误。如果A启用了IP转发(将其配置为充当路由器),则它会尝试适当地路由该数据包。如果它禁用了IP转发(它被配置为主机),那么它只会假定数据包被误导并丢弃它。 – Celada 2013-03-03 14:34:19