我是靠谱客的博主 虚幻钥匙,最近开发中收集的这篇文章主要介绍Netty ChannelOption.SO_BACKLOG配置未连接队列 和 已连接队列backlog 设置注意点Netty 应用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

ChannelOption.SO_BACKLOG对应的是tcp/ip协议, listen函数 中的 backlog 参数,用来初始化服务端可连接队列。

函数:

// backlog 指定了内核为此套接口排队的最大连接个数;
// 对于给定的监听套接口,内核要维护两个队列: 未连接队列和已连接队列
listen(int socketfd,int backlog)

backlog 用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的最大长度。

未连接队列 和 已连接队列

在linux系统内核中维护了两个队列:syns queue和accept queue

服务端处理客户端连接请求是顺序处理的,所以同一时间只能处理一个客户端连接,多个客户端来的时候,服务端将不能处理的客户端连接请求放在队列中等待处理。

syns queue:保存一个SYN已经到达,但三次握手还没有完成的连接。

用于保存半连接状态的请求,其大小通过/proc/sys/net/ipv4/tcp_max_syn_backlog指定,一般默认值是512。不过这个设置有效的前提是系统的syncookies功能被禁用。

互联网常见的TCP SYN FLOOD恶意DOS攻击方式就是建立大量的半连接状态的请求,然后丢弃,导致syns queue不能保存其它正常的请求。

accept queue:保存三次握手已完成,内核正等待进程执行accept的调用的连接。

用于保存全连接状态的请求,其大小通过/proc/sys/net/core/somaxconn指定。

在使用listen函数时,内核会根据传入的backlog参数与系统参数somaxconn,取二者的较小值。
 

注意

  1. 如果未设置或所设置的值小于1,Java将使用默认值50。

  2. 如果accpet queue队列满了,server将发送一个ECONNREFUSED错误信息Connection refused到client。

backlog 设置注意点

服务器TCP内核 内维护了两个队列,称为A(未连接队列)和B(已连接队列)

 

如果A+B的长度大于Backlog时,新的连接就会被TCP内核拒绝掉。

所以,如果backlog过小,就可能出现Accept的速度跟不上,A,B队列满了,就会导致客户端无法建立连接。

需要注意的是,backlog对程序的连接数没影响,但是影响的是还没有被Accept取出的连接。

Netty 应用

在netty实现中,backlog默认通过NetUtil.SOMAXCONN指定;

也可以在服务器启动启动时,通过option方法自定义backlog的大小。

例如:

// server 启动引导
ServerBootstrap serverBootstrap = new ServerBootstrap();
// 配置启动的参数
serverBootstrap.group(bossGroup,workerGroup)
        // 设置非阻塞,用它来建立新accept的连接,用于构造ServerSocketChannel的工厂类
        .channel(NioServerSocketChannel.class)
        // 临时存放已完成三次握手的请求的队列的最大长度。
        // 如果未设置或所设置的值小于1,Java将使用默认值50。
        // 如果大于队列的最大长度,请求会被拒绝
        .option(ChannelOption.SO_BACKLOG,128)
        .childOption(ChannelOption.SO_KEEPALIVE,true)
        .handler(new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel ch) throws Exception {

            }
        });

最后

以上就是虚幻钥匙为你收集整理的Netty ChannelOption.SO_BACKLOG配置未连接队列 和 已连接队列backlog 设置注意点Netty 应用的全部内容,希望文章能够帮你解决Netty ChannelOption.SO_BACKLOG配置未连接队列 和 已连接队列backlog 设置注意点Netty 应用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部