您当前的位置:首页 > 电脑百科 > 网络技术 > 网络知识

Netty:遇到TCP发送缓冲区满了 写半包操作该如何处理

时间:2023-03-13 16:23:21  来源:掘金  作者:Ashleejy
Netty:遇到TCP发送缓冲区满了 写半包操作该如何处理

什么是写半包

写半包:一份数据,一次发送没有把他全部发送,需要循环发送,那么第一次的操作称为写半包

什么情况下会出现写半包:

发送方发送200byte,但是接收方只能接受100byte,因此发送方只会发送小于100byte的数据。

说到这里,机智的小伙伴已经想到了这跟TCP滑动窗口和消息中间件中常见的消息堆积是一个道理。

总的来说:接收方顶不住来自发送方的数据压力

image.png 对.NETty来说就是,这个时刻TCP发送缓冲区满了,无法再接收整包数据,剩下的数据则会通过Channel去监听写操作,当触发写操作的时候,再把这部分数据给带上,那么这部分数据才完整地传输。

Netty中的写半包处理

前提知识:Netty中的网络数据读写,都先经过ByteBuf image-20230227222618518

  • 读操作:从ByteBuf中读取数据
  • 写操作:将数据写入到ByteBuf,然后再通过其他方式把ByteBuf的数据写入(#doWrite

Netty中的网路操作都是通过Channel和里面聚合的对象Unsafe对象进行操作,简单介绍一下。

Channel

Channel的作用:给Netty用来进行网络网络

JDK 也有自己原生的Channel,但是为了方便框架扩展使用,Netty采用的是封装了一层Facade(门面模式)。

最重要的是能够支持Netty的自定义Channel来应对不同的业务场景。

Channel会被注册到EventLoop上,在注册的时候定义好感兴趣的事件,他采用的是基于事件触发的方式,当Channel上触发相对应的事件时,就会主动回调通知,然后交给对应的ChannelHandler进行处理。

由于本篇讲的是写半包,因此不再过多解释。

image.png

总的来说: Channel就是Netty用来处理网络数据流的

回到本篇的主题:写半包

AbstractNioByteChannel

主要负责处理写半包

总的流程如图:

image.png

ChannelOutboundBuffer:环形发送数组

  1. 不停地从ChannelOutboundBuffer读取数据,看是否有可以发送的数据

  2. 如果有,并且是ByteBuf类型的,可以选择发送数据

    • 如果一次发送没有发送完,则采取一定次数的循环发送(写半包)
  3. 数据最后还是没有发送完,则会开一条新线程专门进行剩余数据的发送

  4. 在最后会去同步数据写入进度

源码解析 #doWrite

image-20230311150751449

不停地去环形发送数组里面取数据出来

  • 如果是空了,代表发送完了,把写标志位置空(clearOpWrite

image-20230311150858669

如果不是空数据,则判断是不是ByteBuf数据

  • 对其进行强转,若可读字节数是0,代表消息不可读(reidIndex >= writeIndex),则把他在环形发送数组中移除

第一次读的时候,会先去获取循环发送次数writeSpinCount。循环发送次数就是指:第一次发送没有完成时(写半包)进行循环发送的次数。

给他设置一个阈值,为的就是当循环发送的时候,IO线程会一直尝试写操作,此时IO线程无法处理其他操作,相当于局部阻塞、死锁、假死的情况

像这种处理手法非常常见,比如一般我们会给分布式锁设置一个锁的超时时间,除此之外还需要设置一个客户端的超时时间,避免客户端在拿到锁的时候,这把锁已经过期了。客户端的超时时间会比锁的超时时间要短

image-20230311151404816

然后就是进行循环发送了

image-20230311151426008

消息发送操作完成时候,会调用ChannelOutboundBuffer更新发送进度的消息,并且还会判断是否需要写半包处理

image-20230311151525404

如果没有发完,则设置写半包标识位,启动专门的写半包线程继续发后续的消息

总结

写半包问题本质上是:对于接收方来说,来自发送方的数据压力太大了,因此不得不采取的一种降保护措施

可以在发送方进行解决、也可以在接收方进行解决

Netty并没有采取说,遇到TCP缓冲区满了之后,这个数据包就等下一次再等发,而是能发多少就发多少,不够的 下次再发,是一种追求性能的选择。

像消息中间件遇到消息堆积问题,在消接收方(消费者)增大消费的速度,比如:加消费队列或扩充消费者群组等。

又或者限制发送方(生产者)的发送速度,比如TCP的滑动窗口。

所以互联想的技术都是有相关联的,能看到互相的影子。


 


Tags:TCP   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
什么是写半包写半包:一份数据,一次发送没有把他全部发送,需要循环发送,那么第一次的操作称为写半包什么情况下会出现写半包:发送方发送200byte,但是接收方只能接受100byte,因此发送...【详细内容】
2023-03-13  Tags: TCP  点击:(0)  评论:(0)  加入收藏
TCP是面向连接的、可靠的、基于字节流的传输层通信协议:面向连接:一定是一对一才能连接,不能像UDP协议可以一个主机同时向多个主机发送消息,即一对多是无法做到的可靠的:无论的网...【详细内容】
2023-01-25  Tags: TCP  点击:(60)  评论:(0)  加入收藏
上文对于网络问题分析的还不够精细,比如有时候网络资源可能没有达到瓶颈,并且没有丢包产生,但这个时候网络传输速率就是很慢或者是有丢包产生了,但是却无法知道丢的是具体哪个包...【详细内容】
2022-10-31  Tags: TCP  点击:(89)  评论:(0)  加入收藏
经过《如果让你来设计网络》这篇文章中的一番折腾,只要你知道另一位伙伴 B 的 IP 地址,且你们之间的网络是通的,无论多远,你都可以将一个数据包发送给你的伙伴 B...【详细内容】
2022-10-21  Tags: TCP  点击:(148)  评论:(0)  加入收藏
TCP 协议是我们每天都在使用的一个网络通讯协议,因为绝大部分的网络连接都是建立在 TCP 协议上的,比如你此刻正在看的这篇文章是建立在 HTTP(Hypertext Transfer Protocol,超文...【详细内容】
2022-10-07  Tags: TCP  点击:(135)  评论:(0)  加入收藏
大家好,我是小林。之前有读者在字节面试的时候,被问到:TCP 和 UDP 可以同时监听相同的端口吗? 关于端口的知识点,还是挺多可以讲的,比如还可以牵扯到这几个问题: 多个 TCP 服务进...【详细内容】
2022-09-24  Tags: TCP  点击:(128)  评论:(0)  加入收藏
以太网首部目地MAC地址(8字节)源MAC地址(8字节)类型(2字节)1、IP头的结构 (1)字节和数字的存储顺序是从右到左,依次是从低位到高位,而网络存储顺序是从左到右,依次从低位到高位。(2)版本:...【详细内容】
2022-08-29  Tags: TCP  点击:(257)  评论:(0)  加入收藏
Python文件操作和读写操作Python文件读写模式r,只读方式打开,必须确保文件存在,否则报错。w,写入方式打开,如果文件存在会清空,不存在会创建。a,追加方式打开,如果不存在会创建,追加...【详细内容】
2022-08-27  Tags: TCP  点击:(129)  评论:(0)  加入收藏
ARP欺骗 ARP欺骗 简介 ARP欺骗(ARP spoofing),又称ARP毒化(ARP poisoning,网络上多译为ARP病毒)或ARP攻击,是针对以太网地址解析协议(ARP)的一种攻击技术,通过...【详细内容】
2022-08-20  Tags: TCP  点击:(130)  评论:(0)  加入收藏
我们通过了解TCP各个状态,可以排除和定位网络或系统故障时大有帮助。1、TCP状态了解TCP之前,先了解几个命令:linux查看tcp的状态命令: 1) netstat -nat 查看TCP各个状态的数量 2...【详细内容】
2022-08-03  Tags: TCP  点击:(179)  评论:(0)  加入收藏
▌简易百科推荐
什么是写半包写半包:一份数据,一次发送没有把他全部发送,需要循环发送,那么第一次的操作称为写半包什么情况下会出现写半包:发送方发送200byte,但是接收方只能接受100byte,因此发送...【详细内容】
2023-03-13  Ashleejy  掘金  Tags:TCP   点击:(0)  评论:(0)  加入收藏
一 加密知识 1.1 单向加密 1.2 对称加密 1.3 非对称加密 二 加密知识总结 从一个需求开始 相信很多人,对 https 的过程弄不清楚,只是知道 https 是安全加密的,背后的...【详细内容】
2023-03-09  浮生若梦3  今日头条  Tags:HTTPS   点击:(6)  评论:(0)  加入收藏
802.1x协议源于802.11协议,它是一种基于C/S结构的访问控制协议,工作在数据链路层(二层)的协议。制订802.1x协议是为了解决无线局域网用户的接入认证问题,即:限制未经授权的用户/设...【详细内容】
2023-03-09  IT一指禅  今日头条  Tags:协议   点击:(10)  评论:(0)  加入收藏
前言在智能家居里,网关作为必不可少的设备,有不少小伙伴们,可能还对网关不太了解。比如,网关是什么?网关起到什么作用?网关该怎么选购?...【详细内容】
2023-03-01    什么值得买  Tags:网关   点击:(19)  评论:(0)  加入收藏
Arbitrum 是目前市场上最受关注的以太坊扩展解决方案之一,社区对Arbitrum 推出实用性代币、以及后续潜在的代币空投十分期待。 Arbitrum 是目前市场上最受关注的以太坊扩展解...【详细内容】
2023-02-28  蒲公英互联  网易号  Tags:Arbitrum   点击:(19)  评论:(0)  加入收藏
背景 纯内网环境,无法连互联网 待初始化maven私服在内网,无法通过配置代理完成初始化 通过nexus部署私服,初始化maven依赖和npm依赖初始化思路 通过nexus管理端上传组件功能上...【详细内容】
2023-02-27  Hard Bird  今日头条  Tags:maven   点击:(17)  评论:(0)  加入收藏
端口大全(2023)转载:网络工程师俱乐部...【详细内容】
2023-02-17  网络工程师俱乐部    Tags:端口号   点击:(23)  评论:(0)  加入收藏
一、RSTP 概述RSTP使用了IEEE 802.1W协议,视为STP的改进版本,收敛速度快,兼容STP。RSTP可以兼容STP,但是会丧失快速收敛等优势;1、RSTP对STP的改进;1.1、端口角色的增补、简化了生...【详细内容】
2023-02-14  GLAB带你学网络  搜狐号  Tags:RSTP   点击:(12)  评论:(0)  加入收藏
网络层的传输单位是数据报(包),任务是为不同网络主机之间提供通信服务,把数据从源端传到目的端。使用 IP 地址来标识网络上的设备。​一.计算机网络的分层在计算机网络体系中,采...【详细内容】
2023-02-13  一枫说码  51CTO  Tags:网络分层   点击:(24)  评论:(0)  加入收藏
想想看,在不到20年的时间里,以太网、Web2.0和3G网络在很大程度上已经像恐龙一样消失了。这就引发了我们的思考,现在的网络是怎么回事,未来五年又会发生什么?继2001年网络繁荣和萧...【详细内容】
2023-02-08    51CTO  Tags:   点击:(26)  评论:(0)  加入收藏
站内最新
站内热门
站内头条