TCP粘包、拆包与通信协议详解
那么根据协议,我们可以判断出来,这里包含了3个有效的请求报文,如下:
在定长协议中:
提示:Netty中提供了FixedLengthFrameDecoder,支持把固定的长度的字节数当做一个完整的消息进行解码 3.2 特殊字符分隔符协议 在包尾部增加回车或者空格符等特殊字符进行分割 。例如,按行解析,遇到字符n、rn的时候,就认为是一个完整的数据包。对于以下二进制字节流:
那么根据协议,我们可以判断出来,这里包含了2个有效的请求报文
在特殊字符分隔符协议中:
在使用特殊字符分隔符协议的时候,需要注意的是,我们选择的特殊字符,一定不能在消息体中出现,否则可能会出现错误的拆包。例如,发送方希望把”12rn34”,当成一个完整的报文,如果是按行拆分,那么就会错误的拆分为2个报文。一种解决策略是,发送方对需要发送的内容预先进行base64编码,由于base64编码只包含64个字符:0-9、a-z、A-Z、+、/,我们可以选择这64个字符之外的特殊字符作为分隔符。 提示:netty中提供了DelimiterBasedFrameDecoder根据特殊字符进行解码。事实上,我们熟悉的的缓存服务器redis,也是通过换行符来区分一个完整的报文。 3.3 变长协议 (编辑:西安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |