Linux 内核参数之 net.core.somaxconn

介绍

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

net.core.somaxconn 是 Linux 中的一个内核(kernel)参数,表示socket监听(listen)的backlog上限。

什么是 backlog ? backlo g就是 socket 的监听队列,当一个请求(request)尚未被处理或者建立时,它就会进入backlog。

而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。

当Server处理请求较慢时,导致监听队列被填满后,新来的请求就会被拒绝。

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

  1. client 发送 SYN 到 server,将状态修改为 SYN_SEND,如果 server 收到请求,则将状态修改为 SYN_RCVD,并把该请求放到 syns queue 队列中。

  2. server 回复 SYN+ACK 给 client,如果 client 收到请求,则将状态修改为 ESTABLISHED,并发送 ACK 给 server。

  3. server 收到 ACK,将状态修改为 ESTABLISHED,并把该请求从 syns queue 中放到 accept queue。

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

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

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

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

如何查看该参数值

查看所有内核参数及值

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

查看 net.core.somaxconn

1
2
3
4
5
6
[root@localhost ]# sysctl -a | grep net.core.somaxconn
net.core.somaxconn = 128

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

该参数值默认是128

如何修改该参数值

立即生效

1
2
3
4
5
6
7
8
9
10
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

永久生效

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

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

Linux 内核参数之 net.core.somaxconn
https://flepeng.github.io/002-Linux-41-内核参数-Linux-内核参数之-net-core-somaxconn/
作者
Lepeng
发布于
2021年7月5日
许可协议