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的三次握手:
client 发送 SYN 到 server,将状态修改为 SYN_SEND,如果 server 收到请求,则将状态修改为 SYN_RCVD,并把该请求放到 syns queue 队列中。
server 回复 SYN+ACK 给 client,如果 client 收到请求,则将状态修改为 ESTABLISHED,并发送 ACK 给 server。
server 收到 ACK,将状态修改为 ESTABLISHED,并把该请求从 syns queue 中放到 accept queue。
在linux系统内核中维护了两个队列:syns queue
和 accept 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。
如何查看该参数值
查看所有内核参数及值
1 |
|
查看 net.core.somaxconn
1 |
|
该参数值默认是128
如何修改该参数值
立即生效
1 |
|
该方法在重启系统之后会失效,参数值重新恢复成最初的128
永久生效
在/etc/sysctl.conf文件中新增一行 net.core.somaxconn=1024
;执行 sysctl -p
1 |
|