如果 TCP 服务器与 TCP 客户端建立 TCP 连接,而 TCP 客户端从不向服务器发送任何数据包。
我大概知道 TCP 服务器附近的防火墙可能会向它发送 RST。或者存在强制 TCP 连接终止的保持活动超时。但我不知道具体会发生什么?有人能解释一下吗?
除非我希望它结束,否则是否可以维持这个 TCP 连接?
我只希望 TCP 服务器可以在其 TCP 堆栈上保持此 TCP 连接。但我不希望 TCP 客户端参与其中。我不希望它发送 KEEP-ALIVE。我不希望任何其他第三方实体参与其中。我只是希望当我编写 TCP 服务器的源代码时,源代码可以设法维持 TCP 连接。
答案1
除非发送 FIN 或 RST,否则标准 TCP 了解对方是否已退出或离开的唯一其他方法是超时到期。
如果您对“另一侧”做出的假设尽可能少,并且您与“另一侧”的唯一连接是单个网络接口,那么这确实是您在设计上可以做到的最佳效果。
OSI 模型中较低级别的事件可能会导致操作系统自行终止连接,或提供可能告诉客户端放弃的信息,例如移除相关网络适配器,或将链接状态更改为断开连接。不过,这种情况不一定会发生。
常规解决方案是通过连接发送不包含任何有意义数据的定期消息(称为“保持活动”)。TCP 支持此操作,但您也可以在应用层执行此操作。
- FileZilla 可以设置为发送 keepalive 消息。您可以看到它发送的命令不会执行任何有用的操作,而只是发出命令以将某些东西扔进管道并使其保持“忙碌”。
- 以 PuTTY 为例,有 keepalive 选项也一样。
- 您还可以设置保活选项在服务器上也是如此,但通常最好在 SSH 客户端上进行设置。
- 许多路由协议在应用层发送 Keepalive 消息,以验证其他路由是否正常工作且可用,边界网关协议,首先。
- TCP 也本身支持保持活动消息,它们基本上是每隔一段时间发送一次以验证连接的空以太网数据包。这个 tldp.org文章解释得很好。