Netty 和 TCP - 如何正确发送空消息

Netty and TCP - How to properly send an empty message

我们在 AWS 网络 ELB 后面有一个简单的 TCP 服务器(类似于具有长期连接的 Echo 服务器),用 Netty 编写,我正在尝试实现类似于 TCP 保活机制的保活机制以保持我们的空闲连接打开。不幸的是,我们不能依赖 TCP 保活机制,因为 NELB 不会将保活 TCP 数据包转发到负载均衡器的另一端。
我想做的是监视空闲连接并向客户端发送一个空字符串(空字节数组)。到目前为止我在代码中所做的是:

  1. 添加带有一些超时值的 IdleStateHandler
  2. 注册 GprsKeepAliveHandlerChannelDuplexHandler 的子 class,覆盖 userEventTriggered 方法发送 (ctx.writeAndFlush) Unpooled.EMPTY_BUFFER

这样,如果连接断开,我希望收到 RST 数据包。否则连接将再次激活。

问题是 Netty 不对空消息做任何事情,它不向客户端发送任何数据包(使用 Wireshark 监控)。如果我将消息更改为 Unpooled.wrappedBuffer(new byte[]{0}),我就会看到我期望看到的内容。

问题

  1. 我找不到更好的方法来实现我的 objective(保持连接活动并检测死连接)。如果有更好的方法请告诉我。
  2. 在 Netty 中发送空消息的正确方法是什么? (我看到了 个问题,但没有帮助)
  3. 如果问题是由于 OS TCP 堆栈行为引起的,是否有解决此问题的方法?

从我的角度来看,您需要发送一些有意义的东西,因为您尝试这样做(例如 ping/pong,心跳行为)。另见 Is it is possible to force TCP socket to send 0 bytes in case of packet losses - python

Netty 似乎不会在空消息的情况下进行任何系统调用。 (参见 this