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