Netty源码解析-累加器(Cumulator)处理粘包半包问题
1.前言
Netty将网络中的bytes数据转换成对应的消息数据,这个在Netty中叫做解码过程。在基于流的传输(如TCP/IP)中,接收到的数据存储在套接字接收缓冲区中。不幸的是,基于流的传输的缓冲区不是包队列,而是字节队列。这意味着,即使您将两个消息作为两个独立的包发送,操作系统也不会将它们视为两个消息,而只是将它们视为一串字节。因此,不能保证您所读的内容与远程同行所写的内容完全一致。而Netty中的累加器就是为了解决这个问题。我们将从一下几个方面结合来分析
2.什么是粘包、半包
粘包:比如发送方应该发送ABC、DEF,接收方期望接收到的是ABC、DEF。但是由于粘包可能接收到的是ABCDEF
半包:比如发送方应该发送ABCDEF,接收方期望接收到的是ABCDEF。但是由于存在半包的情况可能接收到的是ABC、DEF
3.如何导致粘包、半包
应用A发送消息给应用B的过程:
- 应用A把流数据发送到TCP发送缓冲区。
- TCP发送缓冲区把数据发送到达B服务器TCP接收缓冲区。
- 应用B从TCP接收缓冲区读取流数据。
粘包的原因:
- 发送方每次写入数据 < Socket缓冲区大小
- 接收方读取Socket缓冲区数据不够及时
半包的原因:
- 发送方每次写入数据 > Socket缓冲区大小
- 发送的数据大于协议的 MTU (Maximum Transmission Unit,最大传输单元),因此必须拆包