第十一課 粘包分包分析,如何避免socket攻擊

1、消息如何在管道中流轉

當前的一個handler如何往下面的一個handler傳遞一個對象

一個管道中會有多個handler

handler往下傳遞對象的方法是sendUpstream(event)
服務端

bootstrap.setPipelineFactory(new ChannelPipelineFactory() {

            @Override
            public ChannelPipeline getPipeline() throws Exception {

                ChannelPipeline pipeline = Channels.pipeline();
                //handler傳遞
                pipeline.addLast("FirstHandler", new FirstHandler());
                pipeline.addLast("SecondHandler", new SecondHandler());
                return pipeline;
            }
        });

public class FirstHandler extends SimpleChannelHandler {

    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
        //第一個handler
        ChannelBuffer buffer = (ChannelBuffer)e.getMessage();

        byte[] array = buffer.array();
        String message = new String(array);
        System.out.println("FirstHandler:" + message);

        //傳遞   發送到下一個Handler 

        // public UpstreamMessageEvent(Channel channel, Object message, SocketAddress remoteAddress)
        ctx.sendUpstream(new UpstreamMessageEvent(ctx.getChannel(), "abc", e.getRemoteAddress()));
        ctx.sendUpstream(new UpstreamMessageEvent(ctx.getChannel(), "def", e.getRemoteAddress()));
        ctx.sendUpstream(new UpstreamMessageEvent(ctx.getChannel(), "ghn", e.getRemoteAddress()));
    }
}
public class SecondHandler extends SimpleChannelHandler {

    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
        //這裏接收從FirstHandler轉發過來的請求
        String message = (String)e.getMessage();

        System.out.println("SecondHandler:" + message);
    }
}

2、看下粘包和分包是怎麼樣一個情況

hello hello
hellohe llo
服務端接收到的數據不穩定
解決方法:

  • 定義一個穩定的結構 length + hello

  1. 爲什麼FrameDecoder return的對象就是往下傳遞的對象 (還是調用了sendUpstream)

  2. buffer裏面數據未被讀取完怎麼辦? (cumulation緩存)

  3. 爲什麼return null就可以緩存buffer (cumulation緩存)

  4. FrameDecoder裏面的cumulation其實就是一個緩存的buffer對象


把長度定義的很大,這種數據包,通常被稱爲socket攻擊,字節流式攻擊
解決方法傳輸的數據添加包頭

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章