当一个客户端的IP改变时,TCP会话会发生什么?
我做了一个简单的testing,让netcat监听端口,并从客户机连接到该端口。 然后我改变了客户端的IP,同时打开了nc会话并发送了一些数据,更改IP后服务器没有收到数据。
我的理解是,一个TCP套接字由IP +端口号组成,所以改变IP会中断连接。 NC没有办法知道IP改变,所以它继续发送数据到原来的IP直到会话超时。
参见RFC 793 (传输控制协议),特别是第2.7节:
2.7。 连接build立和清除
为了识别TCP可以处理的单独数据stream,TCP提供了一个端口标识符。 由于端口标识符是由每个TCP独立select的,因此它们可能不是唯一的。 为了在每个TCP中提供唯一的地址,我们将标识TCP的因特网地址与端口标识符连接在一起,以创build在所有连接在一起的networking中唯一的套接字。
我build议使用Wireshark或其他数据包嗅探器来观察自己的stream量,并看到它的行动。
会议将会死亡。 TCP套接字是dst端口,dst ip,src端口,src ip。 如果其中任何一个变化,连接应该被删除(至less,根据史蒂文斯)。
编辑:任何符合RFC的实现都是如此。 RFC 793,第2.7节
以前的答案会告诉你,当IP地址改变时,TCP连接不能保持活动状态。 这些答案是在2009年写的。
然而,在2013年1月发布了RFC 6824 ,其中介绍了一种在IP地址更改时保持TCP连接处于活动状态的方法。 截至2014年6月,尚未得到广泛支持。 最值得注意的是参考实现是作为Linux的补丁存在的,默认情况下iOS7支持MPTCP。 维基百科总共列出了五个实现 。
TCP会话由连接两端的IP地址和端口号标识。 改变一方的IP地址会中断该会话。
(源地址,源端口,目的地址,目的端口)组合称为套接字对 。 TCP堆栈使用它来识别连接。 一旦build立,TCP就无法更新其中的任何一个。
SCTP允许terminal在运行中更改其地址,但尚未广泛部署(至今还没有)。
其他人从IP +端口对识别连接的angular度回答。 让我稍微谈谈它是如何在分层结构中起作用的。
TCP是一个在不可靠的数据包层(IP)之上提供可靠stream“幻觉”的层。 为此,必须考虑多个variables来pipe理stream,并且还必须提供相关参数给下面的层。
所以,当你问TCP打开一个stream时,你给它的IP +端口的目的地。 它保留这个IP号码,并且每次它必须传送一些东西,组装一个IP包,并且告诉IP层把它发送到目标机器,只有原来的IP号码才能识别。
当你改变了一台机器的IP号时,另一台的TCP层没有任何意义来知道发生了什么事。 它只看到任何发送到原始IP号码的IP数据包不再被回答(也许它会得到一个ICMP消息,告诉没有这个IP号码的机器)。 而且,它不会再使用该IP号码获得更多的数据包。 很明显,连接会在一段时间后掉线。
更糟的是,它可能会开始从不同的来源(新的IP号码)获得一些不相关的数据包,但假设一个连接已经就位! 当然,机器可能得到的唯一答案(如果有的话)是一个RST包,使其立即停止和停止。