TCP 会话和 IP 更改

Kyl*_*ndt 5 networking tcpip nix netcat hijack

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

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

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

rom*_*das 10

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

请参阅RFC 793(传输控制协议),特别是第 2.7 节:

2.7. 连接建立和清除

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

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

  • 啊,我现在看到了 TCP+IP,来自 RFC 793“我们将标识 TCP 的互联网地址与端口标识符连接起来,以创建一个套接字,该套接字在所有连接在一起的网络中都是唯一的” (3认同)

kas*_*erd 5

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

然而,在 2013 年 1 月发布了RFC 6824,它引入了一种在 IP 地址更改时保持 TCP 连接活动的方法。截至 2014 年 6 月,它还没有得到广泛支持。最值得注意的是,参考实现作为 Linux 的补丁存在,iOS7 默认支持 MPTCP。维基百科共列出了五个实现