如何在AWS网络负载均衡器上保持TCP连接活动状态

4

架构:
我们有一堆通过AWS网络负载均衡器(NLB)连接到我们后端服务器的IoT设备。 这是一个双向通道(不是请求响应方式,而是从任意一方传递消息到另一方)。

目标:
如何在不活动期间保持连接(NLB的双方)。

描述: 经常客户端进入非活动模式,不发送(或接收)任何来自(或发往)服务器的信息。如果此状态持续时间超过 NLB 的连接空闲超时值 350 秒,则 LB 会默默地关闭连接。这很糟糕,因为我们随处看到 RST 数据包。

问题:

  1. 我知道SO_KEEPALIVE功能,并可以在我们的后端服务器上启用它。这将保持后端服务器和 NLB 之间的连接保持活动状态。但是客户端呢? NLBs是否会将 TCP keep-alive 数据包转发到另一方?(这里说它不会) 如果不行,如何保持客户端连接开放?(目前,我正在考虑发送空消息以保持连接。)
  2. 这种行为是特定于 AWS NLBs 还是负载均衡器一般都是这样工作的?
2个回答

3
AWS文档表示,NLB TCP监听器能够通过TCP keep-alive数据包保持连接活动状态:链接
对于TCP监听器,客户端或目标可以使用TCP keepalive数据包来重置空闲超时时间。
根据我的测试,客户端接收到服务器发送的TCP keep alive数据包并正确地做出响应。 服务器不会中断连接,这意味着它从客户端接收到了响应。 这意味着NLB TCP监听器实际上转发了keep-alive数据包。
根据同一份文档,NLB TLS监听器不应该对TCP keep-alive数据包做出相同的反应。
但是,当Wireshark显示通过TLS监听器连接的客户端接收到keep-alive数据包时,实际测试结果让我感到震惊。 我之前进行的测试结果距现在已有2个月之久,与我现在经历的情况不符,我认为可能更改了行为。(以前,在客户端以意外的方式变得不可用后,服务器仍然保持连接)。

1

不是答案,只是记录我发现/做的事情:

  1. NELB不会转发保持活动数据包。这意味着您必须在服务器和客户端上都启用它们。
  2. NELB的超时时间无法更改。它是350秒。
  3. 我找不到任何方法来伪造一个空的TCP数据包来欺骗LB将其转发到LB的另一侧。

最终,我们在应用层实现了保持活动功能(定期向客户端发送空消息)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接