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如何支持呢

在这里插入图片描述
大家可以直接下载源码,进行查看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值