netty中的拆包与粘包(一)

2020-02-12  本文已影响0人  梁佳凝

什么是TCP拆包和粘包

使用TCP协议在传输数据的时候,如果数据块比较大,就会考虑将其切分。把一个大的数据包进行切割成一个个小的数据包发送。这时候就会遇到拆包和粘包的问题。

比如说在这里客户端发送了两个数据包D1和D2到服务端,在传输的时候就可能会遇到下列问题:

TCP

以流的方式进行数据传输,上层应用协议为了对消息进行区分,往往采用如下4种方式。

(1)消息长度固定:累计读取到固定长度为LENGTH之后就认为读取到了一个完整的消息。然后将计数器复位,重新开始读下一个数据报文。

(2)回车换行符作为消息结束符:在文本协议中应用比较广泛。

(3)将特殊的分隔符作为消息的结束标志,回车换行符就是一种特殊的结束分隔符。

(4)通过在消息头中定义长度字段来标示消息的总长度。

netty主要解决方法

(1)通过FixedLengthFrameDecoder 定长解码器来解决定长消息的黏包问题;

(2)通过LineBasedFrameDecoder和StringDecoder来解决以回车换行符作为消息结束符的TCP黏包的问题;

(3)通过DelimiterBasedFrameDecoder 特殊分隔符解码器来解决以特殊符号作为消息结束符的TCP黏包问题;

(4)最后一种,也是本文的重点,通过LengthFieldBasedFrameDecoder自定义长度解码器解决TCP黏包问题

    在后面一篇描述

上一篇下一篇

猜你喜欢

热点阅读