backlog:linux系统中的net.core.somaxconn参数

文章介绍了Linux服务器出现Connectionrefused问题的三种原因,重点讨论了由于backlog设置过小导致的情况。通过`sysctl`命令查看和修改net.core.somaxconn参数以增大监听队列的上限,防止新请求被拒绝。同时,解释了TCP连接的三次握手和内核中的synsqueue、acceptqueue队列,以及backlog在socket监听中的作用。
摘要由CSDN通过智能技术生成

一、 Connection refused间歇性出现的问题定位

出现Connection refused的问题原因一般有三种:

1. 服务器的端口没有打开       这种直接就是一直会Connection refused,不会间歇出现,可以直接排除;

2. 服务器的防火墙没有开白名单    很多跟外部对接的时候,是需要将公司出口ip加到对方防火墙白名单,这种也会直接Connection refused,不会间歇出现,可以直接排除;

3. 服务器上的backlog设置的太小,导致连接队列满了,服务器可能会报Connection refused,或者Connecttion reset by peer,这个看服务器上的连接队列满时的设置;



1、如何查看该参数值#

1)查看所有内核参数及值#

sysctl -a	# 查看所有内核参数及值

2)查看net.core.somaxconn参数#

[root@localhost ]# sysctl -a | grep net.core.somaxconn
net.core.somaxconn = 128

or

[root@localhost ]# cat /proc/sys/net/core/somaxconn 
128

该参数值默认是128

2、如何修改该参数值#

1)立即生效#

sysctl -w net.core.somaxconn=1024
1
[root@localhost ]# sysctl -a | grep net.core.somaxconn
net.core.somaxconn = 128
[root@localhost ]# sysctl -w net.core.somaxconn=1024
net.core.somaxconn = 1024
[root@localhost ]# sysctl -a | grep net.core.somaxconn
net.core.somaxconn = 1024

该方法在重启系统之后会失效,参数值重新恢复成最初的128

2)永久生效#

在/etc/sysctl.conf文件中新增一行 net.core.somaxconn=1024;执行sysctl -p

# vim /etc/sysctl.conf
net.core.somaxconn=1024
# sysctl -p   -p选项使sysctl.conf配置文件生效

3、net.core.somaxconn 介绍#

1)概念介绍#

对于一个TCP链接,ServerClient需要通过三次握手来建立网络链接,当三次握手成功之后,我们就可以看到端口状态由LISTEN转为ESTABLISHED,接着这条链路上就可以开始传送数据了

net.core.somaxconn是Linux中的一个内核(kernel)参数,表示socket监听(listen)的backlog上限。
什么是backlogbacklog就是 socket的监听队列,当一个请求(request)尚未被处理或者建立时,它就会进入backlog
socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。
Server处理请求较慢时,导致监听队列被填满后,新来的请求就会被拒绝。

backlog参数主要用于底层方法int listen(int sockfd, int backlog), 在解释backlog参数之前,我们先了解下tcp在内核的请求过程,其实就是tcp的三次握手:

  1. client发送SYNserver,将状态修改为SYN_SEND,如果server收到请求,则将状态修改为SYN_RCVD,并把该请求放到syns queue队列中。
  2. server回复SYN+ACKclient,如果client收到请求,则将状态修改为ESTABLISHED,并发送ACKserver
  3. server收到ACK,将状态修改为ESTABLISHED,并把该请求从syns queue中放到accept queue

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

syns queue
用于保存半连接状态的请求,其大小通过/proc/sys/net/ipv4/tcp_max_syn_backlog指定,一般默认值是512,不过这个设置有效的前提是系统的syncookies功能被禁用。互联网常见的TCP SYN FLOOD恶意DOS攻击方式就是建立大量的半连接状态的请求,然后丢弃,导致syns queue不能保存其它正常的请求。

accept queue
用于保存全连接状态的请求,其大小通过/proc/sys/net/core/somaxconn指定,在使用listen函数时,内核会根据传入的backlog参数与系统参数somaxconn,取二者的较小值。

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

2)补充#

Linux系统中,该参数的值默认是128
如果Linux系统中部署了经常处理新请求(request)的高负载的服务,那么显然这个值是需要增加到更合适的值的

参考#

TCP SOCKET中backlog参数的用途是什么? – CFC4N的博客
linux tcp socket 请求队列大小参数 backlog 简介_tcpbacklog一般多大_whatday的博客-CSDN博客
https://www.cnblogs.com/leezhxing/p/5329786.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值