TCP协议中的粘包和拆包问题

一.问题定义

由于TCP协议是面向数据流的,即把应用层传输来的报文数据看出字节流,把字节流组织成大小不等的数据块进行传输。

所以,一个完整的报文可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送。这就是TCP拆包和粘包问题。

二.不考虑粘包拆包会带来的问题

假设现有一服务端要接收客户端请求,并给出相应。如果不考虑此问题,如果每次请求信息较短,会发送粘包问题,有可能客户端的多次请求会被当做一次,而客户端的多次相应也被当作一次。这样就不是正确的响应了。

三.解决策略

  • 消息定长,规定好每个报文的长度,如为200字节,如果不够则用空位补齐。这样在接受到tcp的数据时,凑够200字节就认为时一个完整报文。
  • 在包尾增加换行符进行分割,遇到换行符时认为时一个完整报文的结束
  • 将消息分为消息头和消息体,消息头中包含消息总长度

四.Netty中的解决策略

Netty作为一个NIO框架,提供了多种粘包、拆包的解决方案。有以换行符分割的LineBasedFrameDecoder,以指定分隔符分割的DelimiterBasedFrameDecoder和定长消息的FixedLengthFrameDecoder等多种解码器。

以LineBasedFrameDecoder为例,其工作原理是遍历得到的可读字节,判断是否有“\n”或者"\r\n",如果有,就以此位置为结束位置,确定一行信息。

关注公众号,第一时间接收我更多文章
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/vxzhg/article/details/97400214