TCP 连接的奇怪行为
Strange behaviour of TCP-connection
我们有以下配置:服务器、客户端、DHCP 服务器。服务器以“客户端模式”在静态 IP 上运行。这意味着,该服务器具有所有客户端(主机名)的列表并建立 TCP 连接。客户端具有动态 IP。
它是如何工作的:1) 服务器创建到客户端的连接,以及 2) 服务器等待来自客户端的任何数据(我们使用 ACE 框架和反应器模式)。为了让客户端列表保持最新,我们添加了一个额外的计时器,它会向所有客户端发送心跳信号。
还有一种奇怪的行为:
假设主机名“somehost.internal”的 IP 为“10.10.100.50”
Time = t
:连接到主机名“somehost.internal”
Time = t+1
: 修改客户端IP为“10.10.100.60”
Time = t+2
: heartbeat timer 发送数据到已有端点(10.10.100.50)并成功returns(为什么???这个IP无法访问)
- 在 Wireshark 中我可以看到,重传包
Time = t+5
:几秒钟后事件处理程序 returns 出现错误,与端点 (10.10.100.50) 的连接将关闭
您有什么建议吗,为什么当远程端点不再存在时阻止发送功能成功 returns?
我假设在第 3 步中您只向客户端发送心跳消息,但实际上并未等待客户端对 心跳消息.
的响应
套接字send()
函数只转发数据给OS。并不代表数据真的被发送出去或者已经被对端接收到。
OS缓冲数据、通过网络传输数据、等待确认、重传数据等。这都需要时间。最终 OS 将决定另一端不再响应并将连接标记为无效。
只有当您对该连接执行套接字功能时,应用程序才会收到有关任何问题的通知。
我们有以下配置:服务器、客户端、DHCP 服务器。服务器以“客户端模式”在静态 IP 上运行。这意味着,该服务器具有所有客户端(主机名)的列表并建立 TCP 连接。客户端具有动态 IP。
它是如何工作的:1) 服务器创建到客户端的连接,以及 2) 服务器等待来自客户端的任何数据(我们使用 ACE 框架和反应器模式)。为了让客户端列表保持最新,我们添加了一个额外的计时器,它会向所有客户端发送心跳信号。
还有一种奇怪的行为: 假设主机名“somehost.internal”的 IP 为“10.10.100.50”
Time = t
:连接到主机名“somehost.internal”Time = t+1
: 修改客户端IP为“10.10.100.60”Time = t+2
: heartbeat timer 发送数据到已有端点(10.10.100.50)并成功returns(为什么???这个IP无法访问)- 在 Wireshark 中我可以看到,重传包
Time = t+5
:几秒钟后事件处理程序 returns 出现错误,与端点 (10.10.100.50) 的连接将关闭
您有什么建议吗,为什么当远程端点不再存在时阻止发送功能成功 returns?
我假设在第 3 步中您只向客户端发送心跳消息,但实际上并未等待客户端对 心跳消息.
的响应套接字send()
函数只转发数据给OS。并不代表数据真的被发送出去或者已经被对端接收到。
OS缓冲数据、通过网络传输数据、等待确认、重传数据等。这都需要时间。最终 OS 将决定另一端不再响应并将连接标记为无效。
只有当您对该连接执行套接字功能时,应用程序才会收到有关任何问题的通知。