TCP 连接的奇怪行为

Strange behaviour of TCP-connection

我们有以下配置:服务器、客户端、DHCP 服务器。服务器以“客户端模式”在静态 IP 上运行。这意味着,该服务器具有所有客户端(主机名)的列表并建立 TCP 连接。客户端具有动态 IP。

它是如何工作的:1) 服务器创建到客户端的连接,以及 2) 服务器等待来自客户端的任何数据(我们使用 ACE 框架和反应器模式)。为了让客户端列表保持最新,我们添加了一个额外的计时器,它会向所有客户端发送心跳信号。

还有一种奇怪的行为: 假设主机名“somehost.internal”的 IP 为“10.10.100.50”

  1. Time = t:连接到主机名“somehost.internal”
  2. Time = t+1: 修改客户端IP为“10.10.100.60”
  3. Time = t+2: heartbeat timer 发送数据到已有端点(10.10.100.50)并成功returns(为什么???这个IP无法访问)
  4. 在 Wireshark 中我可以看到,重传包
  5. Time = t+5:几秒钟后事件处理程序 returns 出现错误,与端点 (10.10.100.50) 的连接将关闭

您有什么建议吗,为什么当远程端点不再存在时阻止发送功能成功 returns?

我假设在第 3 步中您只向客户端发送心跳消息,但实际上并未等待客户端对 心跳消息.

的响应

套接字send()函数只转发数据给OS。并不代表数据真的被发送出去或者已经被对端接收到。

OS缓冲数据、通过网络传输数据、等待确认、重传数据等。这都需要时间。最终 OS 将决定另一端不再响应并将连接标记为无效。

只有当您对该连接执行套接字功能时,应用程序才会收到有关任何问题的通知。