我与互联网上的某个 TCP 服务器建立了 TCP 连接。TCP 客户端是我创建的一个简单的应用程序,可在我的计算机上运行。问题是,当我通过 Windows 网络和共享中心更改 IP 地址时,我的 TCP 连接会立即关闭,而不会使用任何超时。你知道为什么会发生这种情况吗?
我感觉当我通过 Windows 网络和共享中心更改 IP 地址时,Windows 正在向我的 TCP 连接发送关闭信号。但我无法证明这一点!我在互联网上搜索也没有找到任何东西。
编辑:如果我的连接物理关闭(拔掉电缆),tcp 服务器会等待一段时间(超时)。但如果我按照我提到的更改 IP 地址,连接会立即关闭。
答案1
TCP 是一种使用流套接字的面向连接协议。它由两端的 IP 地址和端口号绑定。
看RFC 793 (传输控制协议),具体来说是第 2.7 节:
2.7. 连接建立和清除
为了识别 TCP 可能处理的单独数据流,TCP 提供了端口标识符。由于端口标识符由每个 TCP 独立选择,因此它们可能不是唯一的。为了在每个 TCP 中提供唯一地址,我们将标识 TCP 的互联网地址与端口标识符连接起来,以创建一个在所有连接在一起的网络中都是唯一的套接字。
在面向连接的协议中,对等体之间在交换数据之前会建立一个逻辑通道。因此,如果 IP 地址发生变化,则必须拆除现有连接并重新建立新连接,这显然会造成破坏。
IP 地址变更将造成破坏,因为 TCP 等高级协议将被关闭。移动电话通过使用 GTP 或移动 IP 等专用协议来克服此类情况。
简而言之,更改发送方 IP 地址的过程的一部分涉及关闭所有使用旧地址的连接。
关闭不同于切断通信路径,因为对方会有序地得到套接字已经关闭的通知,并会立即关闭自己这边的套接字。
这与通信路径被粗暴切断的情况不同,在这种情况下,另一方将等待预定的时间才决定单方面关闭连接,甚至这也需要在连接上激活保持活动状态,否则可能会出现长时间的等待。
答案2
如果您更改 IP 地址,连接将无法再看到您。
它可能会轮询您几分钟,看看您是否还在那里,但您不在。
对你来说,连接似乎立即关闭了。此时它是否试图干净利落地关闭连接实际上并不重要……对于远程计算机来说,你只是消失了,它无法知道你去了哪里。