TCP粘包:socket读取时,读到了实际意义上的两个或多个数据包的内容,同时将其作为一个数据包进行处理。
TCP拆包:socket读取时,没有完整地读取一个数据包,只读取一部分。
粘包/拆包问题一般的处理方式有四种:
- 数据段定长处理,位数不足的空位补齐。
- 消息头+消息体,消息头中一般会包含消息体的长度,消息类型等信息,消息体为实际数据体。
- 特殊字符(如:回车符)作为消息数据的结尾,以实现消息数据的分段。
- 复杂的应用层协议,这种方式使用的相对较少,耦合了网络层与应用层。 上面的四种方式目的都是为了将数据在流中精确分开以便进一步解析处理,在自定义的协议中,第二种方式用的比较多,因为它更能满足定制化协议开发需求,比如自定义Netty协议时可以将具体数据报文放入消息体,消息头中根据需要放入其他变量(如:消息类型,此处可以具体对应到维护netty长链接的心跳消息、客户端请求消息、服务端处理结果消息等)