TCP 会话和 IP 更改

TCP 会话和 IP 更改

当客户端的 IP 发生变化时,TCP 会话会发生什么?

我做了一个简单的测试,让 netcat 监听一个端口,然后从客户端机器连接到该端口。然后我在 nc 会话打开时更改了客户端的 IP 并发送了一些数据,更改 IP 后服务器没有收到任何数据。

  1. 我知道它们是不同的层,但是 TCP 是否使用 IP 来区分会话?
  2. 我的示例是否因为应用程序的处理方式而无法工作,或者是否因为 TCP/IP/以太网层发生了某些事情而无法工作?
  3. 这取决于操作系统的实现吗?(我目前最感兴趣的是 Linux)

答案1

我的理解是 TCP 套接字由 IP+端口号组成,因此更改 IP 会中断该连接。nc 无法知道 IP 是否已更改,因此它会继续向原始 IP 发送数据,直到会话超时。

RFC 793(传输控制协议),具体来说是第 2.7 节:

2.7. 连接建立和清除

为了识别 TCP 可能处理的单独数据流,TCP 提供了端口标识符。由于端口标识符由每个 TCP 独立选择,因此它们可能不是唯一的。为了在每个 TCP 中提供唯一地址,我们将标识 TCP 的互联网地址与端口标识符连接起来,以创建一个在所有连接在一起的网络中都是唯一的套接字。

我建议使用 Wireshark 或其他数据包嗅探器来亲自观察流量并查看其实际运行情况。

答案2

前面的答案会告诉你,当 IP 地址更改时,TCP 连接无法保持活动状态。这在 2009 年写下这些答案时是正确的。

然而在 2013 年 1 月RFC 6824已发布,其中介绍了一种在 IP 地址更改时保持 TCP 连接有效的方法。截至 2014 年 6 月,该方法尚未得到广泛支持。最值得注意的是,参考实现作为 Linux 补丁存在,iOS7 默认支持 MPTCP。维基百科列出了总共五种实现方式

答案3

会话将终止。TCP 套接字包括目标端口、目标 IP、源端口、源 IP。如果其中任何一个发生变化,连接应该被断开(至少,根据 Stevens 的说法)。

编辑:任何符合 RFC 的实现都是如此。RFC 793,第 2.7 节

答案4

TCP 会话由连接两端的 IP 地址和端口号标识。更改一方的 IP 地址将中断该会话。

相关内容