本文主要是介绍NETTY-Netty的粘包和半包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
写在前面
最近接触了几个开源的框架,看看代码,发现都用到了netty,于是,打算比较彻底的了解一下。
基本概念
TCP 传输中,客户端发送数据,实际是把数据写入到了 TCP 的缓存中,粘包和半包也就会在此时产生。
客户端给服务端发送了两条消息ABC和DEF,服务端这边的接收会有多少种情况呢?有可能是一次性收到了所有的消息ABCDEF,有可能是收到了三条消息AB、CD、EF。
粘包
- 发送方每次写入数据 < 套接字缓冲区大小
- 接收方读取套接字缓冲区数据不够及时
上面所说的一次性收到了所有的消息ABCDEF,类似于粘包。如果客户端发送的包的大小比 TCP 的缓存容量小,并且 TCP 缓存可以存放多个包,那么客户端和服务端的一次通信就可能传递了多个包,这时候服务端从 TCP 缓存就可能一下读取了多个包,这种现象就叫粘包。
半包
- 发送方写入数据>套接字缓冲区大小
- 发送的数据大于协议的MTU(Maximum Transmission Unit,最大传输单元),必须拆包
上面说的后面那种收到了三条消息AB、CD、EF,类似于半包。如果客户端发送的包的大小比 TCP 的缓存容量大,那么这个数据包就会被分成多个包,通过 Socket 多次发送到服务端,服务端第一次从接受缓存里面获取的数据,实际是整个包的一部分,这时候就产生了半包(半包不是说只收到了全包的一半,是说收到了全包的一部分)。
根本原因
为什么会出现粘包和半包呢?因为TCP是流式协议,消息无边界。
那么UDP呢?UDP像是邮寄包裹一样,虽然一次可以邮寄多个,但是每一个包裹都有一定的界限,一个一个签收,所以没有粘包和半包的问题。
如何解决
虽然TCP是流失协议,让消息没有了边界,但是每一个消息都是有界限的。所以那就让消息有一个明确的界限。这样消息的划分就很清楚了。
如何找出消息的边界呢?
Netty如何支持呢
大家可以直接下载源码,进行查看。
这篇关于NETTY-Netty的粘包和半包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!