- TCP是一个“流”协议。所谓流,就是没有界限的一长串二进制数据。
- 拆包和粘包:TCP作为传输层协议,并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分,所以在业务上认为是一个完整包的,可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP拆包和粘包问题。
- 半包:Netty在轮询读事件的时候,每次从Channel中读取的数据,不一定是一个完整的数据包,这种情况就叫作半包。
- 粘包:Client往Server发送数据包时,如果发送频繁很有可能会将多个数据包的数据都发送到通道中,Server在读取的时候可能会读取到超过一个完整数据包的长度,这种情况叫作粘包。
TCP 粘包/拆包问题说明
假设客户端分别发送了两个数据包 Dl 和 D2 给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下 4 种情况。
- 服务端分两次读取到了两个独立的数据包,分别是 D1 和 D2,没有粘包和拆包;
- 服务端一次接收到了两个数据包, D1 和 D2 粘合在一起,被称为 TCP 粘包;
- 服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为 TCP 拆

TCP作为流协议可能导致粘包和拆包问题,影响数据包的正确解析。Netty通过LineBasedFrameDecoder等手段,能有效地解决这个问题。LineBasedFrameDecoder依据换行符定位数据包边界,实现文本数据的正确解码。
最低0.47元/天 解锁文章
579

被折叠的 条评论
为什么被折叠?



