首页 > 其他分享 >netty系列之ChannelOption

netty系列之ChannelOption

时间:2023-08-29 14:46:33浏览次数:40  
标签:netty 系列 Netty TCP SO 参数 默认值 ChannelOption

netty系列之ChannelOption 

1、概述
在netty 启动的时候会设置相关的ChannelOption, 无论是在ServerBootstrap还是在Bootstrap,
接下来解释一下常用的ChannelOption

2、常用ChannelOption
ChannelOption.SO_BACKLOG (一般用于option–>boss)
BACKLOG用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程都处于工作是(用完了),用于临时存放已完成三次握手的请求的队列的最大长度。如果未设置或所设置的值小于1,Java将使用默认值50。

ChannelOption.SO_REUSEADDR (一般用于option–>boss)
SO_REUSEADDR 对应的是socket选项中SO_REUSEADDR,这个参数表示允许重复使用本地地址和端口,例如,某个服务占用了TCP的8080端口,其他服务再对这个端口进行监听就会报错,SO_REUSEADDR这个参数就是用来解决这个问题的,该参数允许服务公用一个端口,这个在服务器程序中比较常用,例如某个进程非正常退出,对一个端口的占用可能不会立即释放,这时候如果不设置这个参数,其他进程就不能立即使用这个端口。

ChannelOption.ALLOCATOR
Netty参数,ByteBuf的分配器(重用缓冲区),默认值为ByteBufAllocator.DEFAULT,4.0版本为UnpooledByteBufAllocator,4.1版本为PooledByteBufAllocator。该值也可以使用系统参数io.netty.allocator.type配置,使用字符串值:“unpooled”,“pooled”。
额外解释, Netty4.1使用对象池,重用缓冲区(可以直接只用这个配置)
bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);

ChannelOption.RCVBUF_ALLOCATOR (一般用于option->boss)
Netty参数,用于Channel分配接受Buffer的分配器,默认值为AdaptiveRecvByteBufAllocator.DEFAULT,是一个自适应的接受缓冲区分配器,能根据接受到的数据自动调节大小。可选值为FixedRecvByteBufAllocator,固定大小的接受缓冲区分配器。

ChannelOption.TCP_NODELAY (一般用于childOption)
TCP_NODELAY 对应于socket选项中的TCP_NODELAY,该参数的使用和Nagle算法有关,Nagle算法是将小的数据包组装为更大的帧进行发送,而不会来一个数据包发送一次,目的是为了提高每次发送的效率,因此在数据包没有组成足够大的帧时,就会延迟该数据包的发送,虽然提高了网络负载却造成了延时,TCP_NODELAY参数设置为true,就可以禁用Nagle算法,即使用小数据包即时传输。
或者
TCP_NODELAY就是用于启用或关闭Nagle算法。如果要求高实时性,有数据发送时就马上发送,就将该选项设置为true关闭Nagle算法;如果要减少发送次数减少网络交互,就设置为false等累积一定大小后再发送。默认为false。

ChannelOption.SO_SNDBUF 和ChannelOption.SO_RCVBUF (一般用于childOption)
SO_SNDBUF 和 SO_RCVBUF对应socket中的SO_SNDBUF和SO_RCVBUF参数,即设置发送缓冲区和接收缓冲区的大小,发送缓冲区用于保存发送数据,直到发送成功,接收缓冲区用于保存网络协议站内收到的数据,直到程序读取成功。
或者
SO_RCVBUF参数,TCP数据接收缓冲区大小。该缓冲区即TCP接收滑动窗口,linux操作系统可使用命令:cat /proc/sys/net/ipv4/tcp_rmem查询其大小。一般情况下,该值可由用户在任意时刻设置,但当设置值超过64KB时,需要在连接到远端之前设置。
SO_SNDBUF参数,TCP数据发送缓冲区大小。该缓冲区即TCP发送滑动窗口,linux操作系统可使用命令:cat /proc/sys/net/ipv4/tcp_smem查询其大小。

ChannelOption.CONNECT_TIMEOUT_MILLIS: (一般用于Bootstrap或者childOption)
Netty参数,连接超时毫秒数,默认值30000毫秒即30秒。

ChannelOption.SO_LINGER (一般用于childOption)
Socket参数,关闭Socket的延迟时间,默认值为-1,表示禁用该功能。-1表示socket.close()方法立即返回,但OS底层会将发送缓冲区全部发送到对端。0表示socket.close()方法立即返回,OS放弃发送缓冲区的数据直接向对端发送RST包,对端收到复位错误。非0整数值表示调用socket.close()方法的线程被阻塞直到延迟时间到或发送缓冲区中的数据发送完毕,若超时,则对端会收到复位错误。

ChannelOption.SO_KEEPALIVE
  Socket参数,连接保活,默认值为False。启用该功能时,TCP会主动探测空闲连接的有效性。可以将此功能视为TCP的心跳机制,需要注意的是:默认的心跳间隔是7200s即2小时。Netty默认关闭该功能。

ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK (一般用于childOption)
  Netty参数,写高水位标记,默认值64KB。如果Netty的写缓冲区中的字节超过该值,Channel的isWritable()返回False。

ChannelOption.WRITE_BUFFER_LOW_WATER_MARK (一般用于childOption)
  Netty参数,写低水位标记,默认值32KB。当Netty的写缓冲区中的字节超过高水位之后若下降到低水位,则Channel的isWritable()返回True。写高低水位标记使用户可以控制写入数据速度,从而实现流量控制。推荐做法是:每次调用channl.write(msg)方法首先调用channel.isWritable()判断是否可写。

ChannelOption.AUTO_READ (一般用于childOption)
  Netty参数,自动读取,默认值为True。Netty只在必要的时候才设置关心相应的I/O事件。对于读操作,需要调用channel.read()设置关心的I/O事件为OP_READ,这样若有数据到达才能读取以供用户处理。该值为True时,每次读操作完毕后会自动调用channel.read(),从而有数据到达便能读取;否则,需要用户手动调用channel.read()。需要注意的是:当调用config.setAutoRead(boolean)方法时,如果状态由false变为true,将会调用channel.read()方法读取数据;由true变为false,将调用config.autoReadCleared()方法终止数据读取。

ChannelOption.MAX_MESSAGES_PER_READ
  Netty参数,一次Loop读取的最大消息数,对于ServerChannel或者NioByteChannel,默认值为16,其他Channel默认值为1。默认值这样设置,是因为:ServerChannel需要接受足够多的连接,保证大吞吐量,NioByteChannel可以减少不必要的系统调用select。

ChannelOption.WRITE_SPIN_COUNT
  Netty参数,一个Loop写操作执行的最大次数,默认值为16。也就是说,对于大数据量的写操作至多进行16次,如果16次仍没有全部写完数据,此时会提交一个新的写任务给EventLoop,任务将在下次调度继续执行。这样,其他的写请求才能被响应不会因为单个大数据量写请求而耽误。

ChannelOption.MESSAGE_SIZE_ESTIMATOR
  Netty参数,消息大小估算器,默认为DefaultMessageSizeEstimator.DEFAULT。估算ByteBuf、ByteBufHolder和FileRegion的大小,其中ByteBuf和ByteBufHolder为实际大小,FileRegion估算值为0。该值估算的字节数在计算水位时使用,FileRegion为0可知FileRegion不影响高低水位

ChannelOption.SINGLE_EVENTEXECUTOR_PER_GROUP
  Netty参数,单线程执行ChannelPipeline中的事件,默认值为True。该值控制执行ChannelPipeline中执行ChannelHandler的线程。如果为True,整个pipeline由一个线程执行,这样不需要进行线程切换以及线程同步,是Netty4的推荐做法;如果为False,ChannelHandler中的处理过程会由Group中的不同线程执行。

 

 

ChannelOption.SO_LINGER

ChannelOption.SO_LINGER参数对应于套接字选项中的SO_LINGER,Linux内核默认的处理方式是当用户调用close()方法的时候,函数返回,在可能的情况下,尽量发送数据,不一定保证会发送剩余的数据,造成了数据的不确定性,使用SO_LINGER可以阻塞close()的调用时间,直到数据完全发送

关闭Socket的延迟时间。值含义如下:

  • -1:表示socket.close()方法立即返回,但OS底层会将发送缓冲区的数据全部发送到对端。
  • 0: 表示socket.close()方法立即返回,OS放弃发送缓冲区的数据直接向对端发送RST包,对端收到复位错误。
  • 非0整数值:表示调用socket.close()方法的线程被阻塞直到延迟时间到或发送缓冲区中的数据发送完毕,若超时,则对端会收到复位错误。

默认值:

默认值为-1,表示禁用该功能

 

参考地址:
https://blog.csdn.net/mastershaw/article/details/79723214
http://blog.ivysboy.com/?p=593
https://www.jianshu.com/p/0bff7c020af2
————————————————

 

标签:netty,系列,Netty,TCP,SO,参数,默认值,ChannelOption
From: https://www.cnblogs.com/kelelipeng/p/17664708.html

相关文章

  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-14-playwright操作iframe-番外
    1.简介通过前边三篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe的一些特殊情况的介绍和讲解,主要从iframe的定位、监听事件和执行js脚本三个方面进行展开介绍。2.iframe定位2.1动态id属性如何定位有时候,我们可能看到的iframe的id不是固定的,是动......
  • 信驰达CC2340系列低功耗蓝牙模块选型指南
    自信驰达发布基于TI最新一代芯片研发的CC2340系列低功耗蓝牙模块后,您可能需要了解该系列模块之间有何差异,对您的项目来说,哪个模块最匹配且最有竞争力?本篇我们将对信驰达科技CC2340家族无线模块作对比分析,希望可以帮您在项目中选择最适合的蓝牙模块。图1信驰达CC2340系列蓝牙模块►......
  • Flutter系列文章-Flutter在实际业务中的应用
    不同场景下的解决方案1.跨平台开发:在移动应用开发中,面对不同的平台(iOS和Android),我们通常需要编写两套不同的代码。而Flutter通过一套代码可以构建适用于多个平台的应用,大大提高了开发效率,降低了维护成本。2.混合开发:在一些已有的原生应用中,引入Flutter可以用于开发某些特定......
  • Cisco ISR 4000 Series IOS XE Release Dublin-17.12.1a ED - 思科 4000 系列集成服
    CiscoISR4000SeriesIOSXEReleaseDublin-17.12.1aED思科4000系列集成服务路由器请访问原文链接:https://sysin.org/blog/cisco-isr-4000/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org思科4000系列集成服务路由器让您的分支机构站点为实施全数字化转型......
  • 模拟集成电路设计系列博客——1.3.2 增益提升
    1.3.2增益提升之前在电流镜章节提到过应用放大器来增加电流镜输出阻抗,同样的技术被用于增加Cascode增益级的输出阻抗,如下图所示:其增益由下式给出:\[A_v(s)=\frac{V_{out}(s)}{V_{in}(s)}=-g_{m2}(R_{out}(s)||\frac{1}{sC_L})\tag{1.3.20}\]其中\(R_{out}(s)\)由下式给出:\[......
  • 5999元起、21项重大变化!iPhone 15系列售价配置全曝光:9月12日发布 选购指南来了
    距离iPhone15发布会只剩下半个月左右的时间,近期有关新机的爆料进入高潮期。MR近日根据名记的马克·古尔曼(MarkGurman)、DSCC的罗斯·杨(RossYoung)、苹果分析师郭明錤(Ming-ChiKuo)等可靠来源的信息,汇总了iPhone15Pro版机型带来的21项重大变化。以下是iPhone15Pro、iPhone1......
  • netty WebSocket客户端实践
    在之前的Socket学习中,主要都是基于两个Socket客户端:WebSocket和Socket.IO。在做测试的时候也是基于WebSocket消息的发送和接收为主要测试对象。但是对于超多Socket连接没有涉及。在实践中会发现,这两个实现类都存在一个问题,为了维护1个Socket连接及其功能,通常需要创建多个线程。在......
  • 【NestJS系列】核心概念:Middleware中间件
    前言用过express与koa的同学,对中间件这个概念应该非常熟悉了,中间件可以拿到Request、Response对象和next函数.一般来讲中间件有以下作用:执行任何代码对请求与响应拦截并改造结束request-response周期通过next()调用下一个中间件如果当前中间件没有结束当前request-respons......
  • RocketMQ系列(一) 基本介绍
    RocketMQ系列(一)基本介绍1、MQ作用MQ的应用场景主要包含以下3个方面:1.1、异步与解耦当我们下了一个订单之后,订单服务会进行RPC同步调用支付服务、库存服务、物流服务等,那么服务之间就会有耦合性,耦合性越高的话,容错性就越低,比如我们的支付服务如果宕机了,就会导致我们......
  • 永嘉微电高抗干扰/抗电压波动VK36系列 1/2/3/4/6/10/18键/通道/触摸触控芯片 适用于厨
    触摸芯片是一种可感应人体触摸的微处理器,其工作原理是通过感应人体触摸带来的电容变化而实现的;当人体接近触摸屏幕表面时,会引起触摸屏与人体间的电容改变,并且形成了一个新的电场分布,芯片会根据这个电容改变来计算出具体的触摸位置和操作手势。目前触摸芯片应用涉及于消费类电子、......