当前位置: 首页 > 知识库问答 >
问题:

安全切换/更换网络管道(不丢失消息)

濮阳翔
2023-03-14

在我们的应用程序中,我们有一个客户端/服务器对,它使用小型握手协议P1启动连接,之后它们切换到另一个协议P2。

对于 P1 协议,管道使用以下处理程序进行初始化:

LengthFieldBasedFrameDecoder
P1ProtocolMessageDecoder
LengthFieldPrepender
P1ProtocolMessageEncoder

P1 握手协议成功完成后,流量应切换到 P2 协议,在这种情况下,我们首先清除管道,然后添加一组单独的处理程序

P2MessageDecoder
P2MessageEncoder
IdleHandler

当接收到P1协议中的最后一条预期消息时,切换管道完成:

// switch traffic to P2 protocol
clearPipeline();
addNewHandlers();

遇到的问题是,删除LengthFieldBasedFrameDecoder会触发意外读取(因为处理程序的ByteBuf中有未读的字节)。但是,由于此时管道为空(已清除,但尚未添加新的处理程序),因此入站消息被丢弃。

在处理程序还没有到位的时候,有没有什么“安全”的方法来进行管道切换,而不触发不需要的读取?

谢谢

稍后编辑:

我在这里读到过关于替换解码器的内容:(标题为“在管道中用另一个解码器替换一个解码器”的部分)

http://netty.io/4.0/api/io/netty/handler/codec/ReplayingDecoder.html

我成功应用的解决方法是:

 removeOldNonByteToMessageHandlers();
 addNewHandlers()
 removeOldByteToMessageHandlers(); 
 // when the "leftover bytes" read is triggered the new handlers are already in place

我的解决方案似乎很粗糙。有没有更好的“netty-er”方式来实现这一点?

共有1个答案

凌修伟
2023-03-14

我注意到删除订单中的ByteToMessage处理程序对我来说还不够,因为它仍会尝试将它们用于当前消息中的剩余字节。

在我的情况下,我有一个FixedLengthFrameDecoder,我想在读取指定字节数后切换为LengthFieldBasedFrameDecoder。

如果我的消息是X字节,其中Y第一个字节是协议信号,或“握手”,Z是剩余字节的数量,我想使用ByteToMessage处理程序读取第一个Y,然后由新处理程序读取Z下一个字节。

@Override
protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
    Object handshake = super.decode(ctx, in);

    ctx.pipeline().addFirst(new LengthFieldBasedFrameDecoder(ByteOrder.BIG_ENDIAN, Integer.MAX_VALUE, 0, 4, 0, 4, true));
    if (in.isReadable()) {
        Object[] response = new Object[] { in.readBytes(in.readableBytes())};
        ctx.pipeline().remove(this);
        return response;
    } else {
        ctx.pipeline().remove(this);
        return handshake;
    }

}
 类似资料:
  • 在最新版本的Android(尤其是Pixel)上处理Wifi Manager时,我看到了一些有趣的行为。我正在尝试使WIFI manager连接到已知的热点(IOT设备)。 谷歌在一篇博客文章中清楚地列出了这些步骤,如果你在Lollipop上,你需要绑定到一个特定的网络,以确保你的网络请求通过一个给定的网络。你可以在这里找到步骤https://android-developers.googlebl

  • Here are the articles in this section:跨站脚本跨站请求伪造

  • 网络安全目前包括WAF策略。 WAF策略 WAF策略用于为Web应用提供集中式保护,使其免受常见攻击和漏洞的侵害。

  • 攻击方式 主动攻击 包括篡改数据流或伪造数据流,这种攻击试图改变系统资源或影响系统运行。 被动攻击 对信息的保密性进行攻击,即通过窃听网络上传输的信息并加以分析从而获得有价值的情报,但它并不修改信息的内容。它的目标是获得正在传送的信息,其特点是偷听或监视信息的传递。被动攻击只对信息进行监听,不对其进行修改。被动攻击包括信息内容泄露和业务流分析2大类 病毒类型 文件型 感染可执行文件,包括EXE和C

  • 有人能告诉我,是否有一些最小影响的解决方案来切换AWS和localstack环境?可能是无服务器本地堆栈吗? 我有一系列node.js-java-ee-and spring-boot服务,它们被部署为docker-containers(AWS ecs)并通过AWS sqs和其他AWS服务相互连接。 我只需要更改docker-compose-file中的一些选项,或者操作/etc/hosts文件,其

  • 我试图在Apache Beam中运行一个非常简单的程序来尝试它是如何工作的。 在运行此操作时,我得到以下错误 谢谢