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

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   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
从零开始了解网络协议:TCP/IP详解
从零开始了解网络协议:TCP/IP详解 在当今数字化的时代,网络协议已经成为我们生活中不可或缺的一部分。作为互联网的基础,网络协议规定了数据如何在不同的网络设备之间传输。TC...【详细内容】
2024-02-01  Search: TCP  点击:(59)  评论:(0)  加入收藏
从零开始学习Python网络编程:探索TCP协议与实例演示!
Python 是一种高级的编程语言,拥有广泛的网络编程库。这些库允许 Python 开发者能够使用 TCP 和其他网络协议进行通信。在本文中,我们将探讨 TCP 协议,并通过一个简单的例子来...【详细内容】
2023-11-23  Search: TCP  点击:(219)  评论:(0)  加入收藏
TCP分段技术:克服IP和MAC层内存限制的关键
IP和MAC层在发送数据包时都面临内存受限的问题,这就导致它们对消息的长度有所限制。为了克服这个限制,TCP在将数据传递给IP层之前,需要将可变长度的字节打包成多个段,确保每个段...【详细内容】
2023-11-22  Search: TCP  点击:(238)  评论:(0)  加入收藏
TCP发送窗口、接收窗口以及其工作原理
可用窗口的计算是理解TCP滑动窗口的关键,要了解可用窗口的计算,我们需要理解三个指针——SND.UNA、SND.NXT和RCV.NXT。上面的图表是从发送方的角度拍摄的快照。我们...【详细内容】
2023-11-13  Search: TCP  点击:(353)  评论:(0)  加入收藏
Wireshark抓包分析TCP协议:三次握手和四次挥手
前言 面试中我们经常会被问到TCP协议的三次握手和四次挥手的过程,为什么总喜欢问这个问题呢? 其实我们平时使用的很多协议都是应用层协议,比如HTTP协议,https协议,DNS协议,FTP协议...【详细内容】
2023-11-01  Search: TCP  点击:(234)  评论:(0)  加入收藏
一台服务器​最大并发 TCP 连接数多少
以一道运维面试题开局:你接触过的单机最大并发数是多少?操作系统最大文件打开数是65535,服务器又是怎么做到支持10w并发的?你认为当前正常配置的服务器物理机最大并发数可以到多...【详细内容】
2023-10-04  Search: TCP  点击:(71)  评论:(0)  加入收藏
C# 如何判断某个 TCP 端口是否被占用?
在C#中使用TcpClient或者其他通用的方式建立的Socket,该如何判断这个端口是否被占用?比如下面的代码:TcpClient tc = new TcpClient(ip,port);在C#中,可以使用 System.Net.Netwo...【详细内容】
2023-09-26  Search: TCP  点击:(54)  评论:(0)  加入收藏
网络层协议详解:理解TCP/IP、HTTP、FTP等协议的功能与工作原理
在计算机网络中,网络层是计算机通讯的重要组成部分,它负责处理数据包的传输和路由,是实现网络通信的必不可少的组件之一。网络层引入了三个协议:IP协议、ARP协议和路由协议。IP...【详细内容】
2023-09-06  Search: TCP  点击:(253)  评论:(0)  加入收藏
TCP与UDP协议:网络通信中的两大重要角色
引言在这个像点点滴滴组成的虚拟宇宙中,网络通信就像是我们的超级高速公路系统,让信息在世界间飞速穿梭。想象一下,如果网络是一条繁忙的交通道路,那么协议就是交通信号灯,确保数...【详细内容】
2023-09-01  Search: TCP  点击:(231)  评论:(0)  加入收藏
TCP、UDP是如何流量、拥塞控制的?今天一口气讲透!
一、TCP TCP首部 流量控制 拥塞控制 三次握手,四次挥手 tcp 怎样保证数据正确性?流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度1、TCP首部源端...【详细内容】
2023-07-18  Search: TCP  点击:(252)  评论:(0)  加入收藏
▌简易百科推荐
学生偷看“不良网站”,手机上3个痕迹无法清除,网友:咋不早说
众所周知,中国的常规教育中,总是“谈性色变”,但在这个信息爆炸的互联网时代,即便是一些年纪很小的孩子,也能轻易接触到一些所谓的不良网站,因此这一方面的教育缺失,其实是很可怕的...【详细内容】
2024-03-28    叶姐生活指南  Tags:不良网站   点击:(11)  评论:(0)  加入收藏
什么是网络中的路由器?核心功能解释
路由器是互联网连接的核心元素,是一种允许多个设备连接到互联网,并促进将数据包转发到各自的目标地址的设备。使用动态路由技术,路由器检查数据并在各种可用路径中选择最有效的...【详细内容】
2024-03-07    千家网  Tags:路由器   点击:(31)  评论:(0)  加入收藏
过年该不该升级Wi-Fi 7路由?看完就知道
打开电商网站不难发现,从2023年第三季度到现在,Wi-Fi 7路由器新品越来越多。而且价格不再是高高在上,已经基本和Wi-Fi 6路由价格差不多了。看到这些Wi-Fi 7新品路由,不少朋友就...【详细内容】
2024-02-27    中关村在线  Tags:Wi-Fi   点击:(36)  评论:(0)  加入收藏
聊聊 Kubernetes 网络模型综合指南
这篇详细的博文探讨了 Kubernetes 网络的复杂性,提供了关于如何在容器化环境中确保高效和安全通信的见解。译自Navigating the Network: A Comprehensive Guide to Kubernete...【详细内容】
2024-02-19  云云众生s  微信公众号  Tags:Kubernetes   点击:(38)  评论:(0)  加入收藏
SSL协议是什么?关于SSL和TLS的常见问题解答
SSL(安全套接字层)及其后继者TLS(传输层安全)是用于在联网计算机之间建立经过身份验证和加密的链接的协议。尽管SSL协议在 1999年已经随着TLS 1.0的发布而被弃用,但我们仍将这些...【详细内容】
2024-02-06  IDC点评网    Tags:SSL协议   点击:(69)  评论:(0)  加入收藏
从零开始了解网络协议:TCP/IP详解
从零开始了解网络协议:TCP/IP详解 在当今数字化的时代,网络协议已经成为我们生活中不可或缺的一部分。作为互联网的基础,网络协议规定了数据如何在不同的网络设备之间传输。TC...【详细内容】
2024-02-01    简易百科  Tags:TCP/IP   点击:(59)  评论:(0)  加入收藏
BGP路由属性:互联网路由的灵活控制器
在互联网的庞大网络中,边界网关协议(BGP)是确保不同自治系统(AS)间路由信息有效交换的关键协议。然而,BGP的功能远不止于此。其核心组成部分,即BGP路由属性,赋予了BGP强大的灵活性,使...【详细内容】
2024-01-26  诺诺爱生活    Tags:互联网路由   点击:(40)  评论:(0)  加入收藏
简易百科之什么是网络延迟?
简易百科之什么是网络延迟?随着互联网的普及和发展,网络已经成为我们生活中不可或缺的一部分。然而,我们在使用网络时可能会遇到一种情况,那就是网络延迟。那么,什么是网络延迟呢...【详细内容】
2024-01-24    简易百科  Tags:网络延迟   点击:(147)  评论:(0)  加入收藏
网络延迟与网络速度有什么区别?分享具体的答案
通常,许多人抱怨网速测试。速度还是不错的,但是他们玩游戏的时候怎么会卡住,还是断开连接等等问题,这一系列问题始终困扰着大家。那么,网络延迟与网络速度有什么区别呢?请不要担心...【详细内容】
2024-01-24  萌新小郭    Tags:网络延迟   点击:(50)  评论:(0)  加入收藏
揭秘IP地址的网络威胁与攻击类型
在当今数字化时代,网络攻击已经成为网络安全的一大挑战。IP地址,作为互联网通信的基础,也成为网络威胁和攻击的焦点之一。本文将深入探讨不同类型的网络威胁和攻击,以及如何防范...【详细内容】
2024-01-22  IP数据云    Tags:IP地址   点击:(77)  评论:(0)  加入收藏
站内最新
站内热门
站内头条