当客户端的 IP 发生变化时,TCP 会话会发生什么?
我做了一个简单的测试,让 netcat 监听一个端口,然后从客户端机器连接到该端口。然后我在 nc 会话打开时更改了客户端的 IP 并发送了一些数据,更改 IP 后服务器没有收到任何数据。
- 我知道它们是不同的层,但是 TCP 是否使用 IP 来区分会话?
- 我的示例是否因为应用程序的处理方式而无法工作,或者是否因为 TCP/IP/以太网层发生了某些事情而无法工作?
- 这取决于操作系统的实现吗?(我目前最感兴趣的是 Linux)
答案1
我的理解是 TCP 套接字由 IP+端口号组成,因此更改 IP 会中断该连接。nc 无法知道 IP 是否已更改,因此它会继续向原始 IP 发送数据,直到会话超时。
看RFC 793(传输控制协议),具体来说是第 2.7 节:
2.7. 连接建立和清除
为了识别 TCP 可能处理的单独数据流,TCP 提供了端口标识符。由于端口标识符由每个 TCP 独立选择,因此它们可能不是唯一的。为了在每个 TCP 中提供唯一地址,我们将标识 TCP 的互联网地址与端口标识符连接起来,以创建一个在所有连接在一起的网络中都是唯一的套接字。
我建议使用 Wireshark 或其他数据包嗅探器来亲自观察流量并查看其实际运行情况。
答案2
答案3
会话将终止。TCP 套接字包括目标端口、目标 IP、源端口、源 IP。如果其中任何一个发生变化,连接应该被断开(至少,根据 Stevens 的说法)。
编辑:任何符合 RFC 的实现都是如此。RFC 793,第 2.7 节
答案4
TCP 会话由连接两端的 IP 地址和端口号标识。更改一方的 IP 地址将中断该会话。