jas*_*foo 1 sockets linux tcp-ip
当我们发送数据的计算机突然改变其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绝对没有任何关于它的事情.简单地无法使用其旧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是在同一本地网络上还是在远程网络上,都是一样的.