4.Netty TCP(TcpServer、TcpClient)Option和childOption参数设置

目录


Netty专栏目录(点击进入…)


Option和childOption参数设置

ChannelOption、EpollChannelOption、KQueueChannelOption

1.通用参数(ChannelOption)

(1)CONNECT_TIMEOUT_MILLIS:连接超时毫秒数

Netty参数,连接超时毫秒数,默认值30000毫秒即30秒

(2)MAX_MESSAGES_PER_READ:一次读取的最大消息数

Netty参数,一次Loop读取的最大消息数。

对于ServerChannel或者NioByteChannel,默认值为16,其他Channel默认值为1。默认值这样设置,是因为:ServerChannel需要接受足够多的连接,保证大吞吐量,NioByteChannel可以减少不必要的系统调用select

Loop表示一个不断循环执行处理任务的线程

(3)WRITE_SPIN_COUNT:一个写操作执行的最大次数

Netty参数,一个Loop写操作执行的最大次数。

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

(4)ALLOCATOR:ByteBuf分配器

Netty参数,ByteBuf的分配器。默认值为ByteBufAllocator.DEFAULT;该值也可以使用系统参数io.netty.allocator.type配置,使用字符串值:“unpooled”,“pooled”

4.0版本为UnpooledByteBufAllocator
4.1版本为PooledByteBufAllocator

(5)RCVBUF_ALLOCATOR:Channel接受Buffer配器

Netty参数,用于Channel分配接受Buffer的分配器。

默认值为AdaptiveRecvByteBufAllocator.DEFAULT,是一个自适应的接受缓冲区分配器,能根据接受到的数据自动调节大小。可选值为FixedRecvByteBufAllocator,固定大小的接受缓冲区分配器

(6)AUTO_READ:自动读取

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()方法终止数据读取

(7)WRITE_BUFFER_HIGH_WATER_MARK:写操作的最大值

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

(8)WRITE_BUFFER_LOW_WATER_MARK:写操作的最小值

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

(9)MESSAGE_SIZE_ESTIMATOR:消息大小估算器

Netty参数,消息大小估算器。默认为DefaultMessageSizeEstimator.DEFAULT。

估算ByteBuf、ByteBufHolder和FileRegion的大小,其中ByteBuf和ByteBufHolder为实际大小,FileRegion估算值为0。该值估算的字节数在计算水位时使用,FileRegion为0可知FileRegion不影响高低水位

(10)SINGLE_EVENTEXECUTOR_PER_GROUP:单线程执行ChannelPipeline中的事件

Netty参数,单线程执行ChannelPipeline中的事件,默认值为True。

该值控制执行ChannelPipeline中执行ChannelHandler的线程。如果为Trye,整个pipeline由一个线程执行,这样不需要进行线程切换以及线程同步,是Netty4的推荐做法;如果为False,ChannelHandler中的处理过程会由Group中的不同线程执行。


2.SocketChannel参数

(1)SO_RCVBUF:TCP数据接收缓冲区大小

Socket参数,TCP数据接收缓冲区大小。该缓冲区即TCP接收滑动窗口,linux操作系统可使用命令:cat /proc/sys/net/ipv4/tcp_rmem查询其大小。一般情况下,该值可由用户在任意时刻设置,但当设置值超过64KB时,需要在连接到远端之前设置。

(2)SO_SNDBUF:TCP数据发送缓冲区大小

Socket参数,TCP数据发送缓冲区大小。该缓冲区即TCP发送滑动窗口,linux操作系统可使用命令:cat /proc/sys/net/ipv4/tcp_smem查询其大小。

(3)TCP_NODELAY:无延迟发送数据

TCP参数,立即发送数据,默认值为Ture(Netty默认为True而操作系统默认为False)。该值设置Nagle算法的启用,改算法将小的碎片数据连接成更大的报文来最小化所发送的报文的数量,如果需要发送一些较小的报文,则需要禁用该算法。Netty默认禁用该算法,从而最小化报文传输延时。

(4)SO_KEEPALIVE:连接保持活动

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

(5)SO_REUSEADDR:地址是否复用

Socket参数,地址复用,默认值False

有四种情况可以使用:
①当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你希望启动的程序的socket2要占用该地址和端口,比如重启服务且保持先前端口
②:有多块网卡或用IP Alias技术的机器在同一端口启动多个进程,但每个进程绑定的本地IP地址不能相同
③:单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同
④:完全相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP

(6)SO_LINGER:关闭Socket的延迟时间

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

(7)IP_TOS:设置IP头部的Type-of-Service字段

IP参数,设置IP头部的Type-of-Service字段,用于描述IP包的优先级和QoS选项。

(8)ALLOW_HALF_CLOSURE:一个连接的远端关闭时本地端是否关闭

Netty参数,一个连接的远端关闭时本地端是否关闭,默认值为False。值为False时,连接自动关闭;为True时,触发ChannelInboundHandler的userEventTriggered()方法,事件为ChannelInputShutdownEvent。


3.ServerSocketChannel参数

(1)SO_RCVBUF:TCP数据接收缓冲区大小

注意:当设置值超过64KB时,需要在绑定到本地端口前设置。该值设置的是由ServerSocketChannel使用accept接受的SocketChannel的接收缓冲区。

(2)SO_REUSEADDR:地址是否复用

Socket参数,地址复用,默认值False

有四种情况可以使用:
①当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你希望启动的程序的socket2要占用该地址和端口,比如重启服务且保持先前端口
②:有多块网卡或用IP Alias技术的机器在同一端口启动多个进程,但每个进程绑定的本地IP地址不能相同
③:单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同
④:完全相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP

(3)SO_BACKLOG:服务端接受连接的队列长度

Socket参数,服务端接受连接的队列长度,如果队列已满,客户端连接将被拒绝。默认值,Windows为200,其他为128。


## 4.DatagramChannel参数 ### (1)SO_BROADCAST:广播模式 Socket参数,设置广播模式

(2)SO_RCVBUF:TCP数据接收缓冲区大小

Socket参数,TCP数据接收缓冲区大小。该缓冲区即TCP接收滑动窗口,linux操作系统可使用命令:cat /proc/sys/net/ipv4/tcp_rmem查询其大小。一般情况下,该值可由用户在任意时刻设置,但当设置值超过64KB时,需要在连接到远端之前设置。

(3)SO_SNDBUF:TCP数据发送缓冲区大小

Socket参数,TCP数据发送缓冲区大小。该缓冲区即TCP发送滑动窗口,linux操作系统可使用命令:cat /proc/sys/net/ipv4/tcp_smem查询其大小。

(4)SO_REUSEADDR:地址是否复用

Socket参数,地址复用,默认值False

有四种情况可以使用:
①当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你希望启动的程序的socket2要占用该地址和端口,比如重启服务且保持先前端口
②:有多块网卡或用IP Alias技术的机器在同一端口启动多个进程,但每个进程绑定的本地IP地址不能相同
③:单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同
④:完全相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP

(5)IP_MULTICAST_LOOP_DISABLED:

对应IP参数IP_MULTICAST_LOOP,设置本地回环接口的多播功能。由于IP_MULTICAST_LOOP返回True表示关闭,所以Netty加上后缀_DISABLED防止歧义。

(6)IP_MULTICAST_ADDR:

对应IP参数IP_MULTICAST_IF,设置对应地址的网卡为多播模式。

(7)IP_MULTICAST_IF

对应IP参数IP_MULTICAST_IF2,同上但支持IPV6。

(8)IP_MULTICAST_TTL

IP参数,多播数据报的time-to-live即存活跳数。

(9)IP_TOS

(10)DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION:

Netty参数,DatagramChannel注册的EventLoop即表示已激活


Socket Options:Socket参数

(1)TCP_NODELAY:无延迟发送数据

禁用Nagle算法。对(client)Socket有效。

Nagle算法的规则:
①:如果包长度达到MSS,则允许发送
②:如果该包含有FIN,则允许发送
③:设置了TCP_NODELAY选项,则允许发送
④:未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送
上述条件都未满足,但发生了超时(一般为200ms),则立即发送。

(2)SO_LINGER:

指定延迟关闭超时。对(client)Socket有效。

(3)SO_TIMEOUT:

指定阻塞套接字操作的超时时间。(不要永远阻止)
对所有套接字有效:Socket、ServerSocket、DatagramSocket。

(4)SO_BINDADDR

获取套接字的本地地址绑定。
对所有套接字有效:Socket、ServerSocket、DatagramSocket。

(5)SO_REUSEADDR

为套接字启用重用地址。
对所有套接字有效:Socket、ServerSocket、DatagramSocket。

(6)SO_BROADCAST

使套接字能够发送广播消息。对DatagramSocket有效。

(7)SO_SNDBUF

为传出网络I/O设置底层缓冲区大小的提示。
对所有套接字有效:Socket、ServerSocket、DatagramSocket。

(8)SO_RCVBUF

获取在此套接字上接收数据时平台实际使用的缓冲区大小。
对所有套接字有效:Socket、ServerSocket、DatagramSocket。

(9)SO_KEEPALIVE

打开套接字保持连接。对Socket参数

(10)SO_OOBINLINE

启用TCP紧急数据的内联接收。对Socket有效

(11)IP_MULTICAST_IF

指定多播数据包的传出接口(在多宿主主机上)。
对多播套接字有效。

(12)IP_MULTICAST_LOOP

启用或禁用多播数据报的本地环回。对MulticastSocket有效。

(13)IP_TOS

在TCP或UDP套接字的IP标头中设置服务类型或流量类别字段。对Socket、DatagramSocket有效

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未禾

您的支持是我最宝贵的财富!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值