设置 TCP 空闲超时时需要考虑什么?

设置 TCP 空闲超时时需要考虑什么?

TCP 空闲超时设置为 [低] 的目的是什么?例如,为什么防火墙或负载均衡器要设置 60 秒超时?是内存管理还是性能优化问题?超时时间过长是否会带来安全风险?

如何确定最大设置是否合适或可接受?

答案1

长时间空闲的连接可能意味着连接已断开(任一侧应用程序崩溃、网线拔出等),但资源仍会被分配,这意味着:

  • 性能会受到轻微影响。
  • 您的应用程序可能会限制同时连接数为 X 个,因此,您可能会拒绝实际上没有连接的新客户端的访问。
  • 如果您对源端口和目标端口都使用固定端口,则可能无法重新连接客户端(虽然不常见,但有可能)。
  • 您可能会达到连接/路由限制,阻碍与任何其他端口的新连接或导致意外行为或服务器本身崩溃。
  • 许多应用程序只有在所有连接正确关闭后才会停止,因此关闭或重新启动服务将需要更长时间
  • 如果不检查一段时间的 TPC 流量或依赖应用程序日志,您将无法区分断开的连接和活动连接
  • 大多数客户端应用程序不知道如何对断开的连接做出反应:有些会等待内部超时,但其他的会永远等待,如果客户端需要重新启动,则会导致潜在的数据丢失。

如果您设置的 TCP 空闲超时时间低于所需时间,也会发生最后一种情况,因为某些系统会简单地从其 TCP 表中删除连接,而其他系统会向另一部分发送 RST 数据包。

根据您管理的流量类型使用空闲超时(例如,Apache 服务器的默认超时时间为 5 分钟,因此任何连接都不会空闲超过 5 分钟 [几秒钟]),但绝不设置比应用程序超时更低(或完全相同)的 TCP 空闲超时。至少每隔几分钟在长时间连接上实现保持活动,以确保连接处于活动状态(在套接字创建时定义的 TCP 保持活动具有两个小时的超时,我认为这太高了)。用户交互软件(如 ssh 会话、远程桌面、FTP)在用户阅读时会空闲几分钟,因此我不会少于 15 分钟。

注意:除了高度密集的连接(空闲时间不会超过几秒钟)外,我不建议将任何 TCP 空闲超时时间设置为低于几分钟。如果可能,请根据您的流量设置不同的空闲超时时间(例如,对于 Web 服务器为 6 分钟,对于 ssh 会话为 15 分钟,等等)。

如果需要更高的超时时间(有人请求“永久” TCP 连接),请尝试在应用层使用 keepalive。

相关内容