tcp中非阻塞编程为啥出现粘包问题及netty如何解决

TCP非阻塞编程时,由于底层优化可能导致粘包问题。Netty通过使用缓存(如cumulation)解决此问题,确保每个Channel的数据独立处理。在新连接建立时,Netty的NioServerSocketChannel与NioSocketChannel会创建DefaultChannelPipeline,并通过ChannelInitHandler的channelRegister方法将解码器如LengthFieldBaseFrameDecoder加入pipeline,确保每个连接有自己的解码器实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在网络编程中我们调用send方法只是将数据存放到sendbuf中由底层tcp进行发送包,这里发送包底层会进行一些优化,尽可能一次发送多的数据,但是数据大小不能太大如果太大会拆分多次进行发送。所有在这个过程中就会出现一次发送包含大量数据包或者一次无法发送完整的数据包。这就是我们说的粘包问题。在阻塞编程中我们获取连接管道后不停去读取数据判断是否满足指定标记来结束一个包,而非阻塞编程中由于select模型会在不同管道中切换需要我们缓存上一次未解析完的包,我们用一个图来讲解:

上图是最简单的select模型,通过上面会发现一个问题,比如1号水龙头的水来了一半出现暂停,2号水龙头来水了,此时用户会先将1号水龙头的水倒掉处理马上再用水桶处理2号水龙头来接水。这样会导致1号还没接完就切换到二号。对应tcp中就是数据包来了一半就被处理了。如何解决这个问题我们可以改进为下图

现在我们添加每个管道一个小水池,每次接完水都是先缓存到对应的小水池中等对应水龙头(这是个高级水龙头)告诉我们这次水流完了,然后我们把水池中的水进行一次处理。对应tcp异步编程就是每个channel接收都创建一个缓存,数据都先存放到缓存池中等最后数据接收完才进行处理

netty是如何解决上面问题了

这个是LengthF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值