[转帖]TCP的全连接与半连接队列

tcp,连接,队列 · 浏览次数 : 0

小编点评

## TCP 全连接队列总结 **最大值:** * **min(somaxconn, backlog)**:当 **tcp_max_syn_backlog > accept_queue** 大小时,半连接队列最大值为 **accept_queue大小 * 2**。 * **min(min(somaxconn, backlog), tcp_max_syn_backlog)*2**:当 **tcp_max_syn_backlog < accept_queue** 大小时,半连接队列最大值为 **tcp_max_syn_backlog * 2**。 **其他参数:** * **net.ipv4.tcp_fin_timeout**: 套接字关闭时间,默认值 60秒。 * **net.ipv4.tcp_tw_reuse**: 开启重用,允许将TIME_WAIT sockets重新用于新的TCP连接,默认值为 0。 * **net.ipv4.tcp_syncookies**: 开启 SYN Cookies 功能,当 SYN 等待队列溢出时启用 Cookies 来处理,可防范少量SYN攻击。 * **net.ipv4.tcp_keepalive_time**: 设置 TCP 保持连接的频率,默认值 2小时。 * **net.ipv4.ip_local_port_range**: 设置允许系统打开的端口范围,默认值 4000-65000。 * **net.ipv4.tcp_max_syn_backlog**: 定义 SYN队列的最大长度,默认值 256。 * **net.ipv4.tcp_max_tw_buckets**: 定义 TIME_WAIT 套接字的最大数量,默认值为 180000。 * **net.ipv4.tcp_synack_retries**: 定义 SYN 包发送重发次数,默认值为 5。 * **net.ipv4.tcp_max_orphans**: 定义系统中最多允许创建的最大孤连接数量,默认值为 65536。

正文

TCP的全连接与半连接队列


总结

TCP 全连接队列的最大值: 
取决于 somaxconn 和 backlog 之间的最小值,
也就是 min(somaxconn, backlog)

TCP 半连接队列的最大值:
min(min(somaxconn,backlog),tcp_max_syn_backlog)*2
也就是: 
当 tcp_max_syn_backlog > accept_queue大小时, 
半连接队列最大值 max_qlen_log = accept_queue大小 * 2;
当 tcp_max_syn_backlog < accept_queue大小时, 
半连接队列最大值 max_qlen_log = tcp_max_syn_backlog * 2;

一个内核设置案例

net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
net.ipv4.tcp_abort_on_overflow = 0

参数含义

net.ipv4.tcp_fin_timeout 
表示套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,
默认值是60秒。 
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_fin_timeout 60
net.ipv4.tcp_tw_reuse 
表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,
默认值为0,表示关闭。 
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_reuse 0
net.ipv4.tcp_syncookies 
表示开启SYN Cookies功能。当出现SYN等待队列溢出时,启用Cookies来处理,
可防范少量SYN攻击,这个参数也可以不添加。 
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syncookies,默认值为1
net.ipv4.tcp_keepalive_time 
表示当keepalive启用时,TCP发送keepalive消息的频度。
默认是2小时,建议改为10分钟。 
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_keepalive_time,默认为7200秒。
net.ipv4.ip_local_port_range 
该选项用来设定允许系统打开的端口范围,即用于向外连接的端口范围。 
该参数对应系统路径为:/proc/sys/net/ipv4/ip_local_port_range 32768 61000
net.ipv4.tcp_max_syn_backlog 
表示SYN队列的长度,默认为256,建议加大队列的长度为8192或更多,
这样可以容纳更多等待连接的网络连接数。 该参数为服务器端用于记录那些尚未收到客户端确认信息的连接请求最大值。 
该参数对象系统路径为:/proc/sys/net/ipv4/tcp_max_syn_backlog
net.ipv4.tcp_max_tw_buckets 
表示系统同时保持TIME_WAIT套接字的最大数量,
如果超过这个数值,TIME_WAIT套接字将立刻被清除并打印警告信息。 
默认为180000,对于Apache、Nginx等服务器来说可以将其调低一点,如改为5000~30000,
不同业务的服务器也可以给大一点,比如LVS、Squid。 此项参数可以控制TIME_WAIT套接字的最大数量,
避免Squid服务器被大量的TIME_WAIT套接字拖死。 
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_tw_buckets
net.ipv4.tcp_synack_retries 
参数的值决定了内核放弃连接之前发送SYN+ACK包的数量。 
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_synack_retries,默认值为5
net.ipv4.tcp_syn_retries 
表示在内核放弃建立连接之前发送SYN包的数量。 
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syn_retries 5
net.ipv4.tcp_max_orphans 
用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。 
如果超过这个数值,孤立连接将被立即被复位并打印出警告信息。 
这个限制只有为了防止简单的DoS攻击。不能过分依靠这个限制甚至认为减少这个值,更多的情况是增加这个值。
该参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_orphans 65536
net.core.somaxconn 
该选项默认值是128,这个参数用于调节系统同时发起的TCP连接数,
在高并发的请求中,默认的值可能会导致链接超时或重传,因此,需要结合并发请求数来调节此值。
该参数对应系统路径为:/proc/sys/net/core/somaxconn 128
net.core.netdev_max_backlog 
表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包最大数。 
该参数对应系统路径为:/proc/sys/net/core/netdev_max_backlog,默认值为1000

From https://blog.csdn.net/crazymakercircle/article/details/125947088

与[转帖]TCP的全连接与半连接队列相似的内容:

[转帖]TCP的全连接与半连接队列

TCP的全连接与半连接队列 总结 TCP 全连接队列的最大值: 取决于 somaxconn 和 backlog 之间的最小值, 也就是 min(somaxconn, backlog) TCP 半连接队列的最大值: min(min(somaxconn,backlog),tcp_max_syn_back

[转帖]TCP的blacklog之全连接队列与半连接队列的深入研究

文章目录 Linux内核探测工具systemtap的安装与使用backlog、半连接队列、全连接队列是什么半连接队列、全连接队列基本概念 linux 内核是如何计算半连接队列、全连接队列的半连接队列的大小的计算模拟半连接队列占满全连接队列(Accept Queue) SYN+ACK重传次数全连接队列

[转帖]全连接和半连接

https://www.jianshu.com/p/6a0fcb1008d6 参考 关于TCP 半连接队列和全连接队列 深入浅出TCP中的SYN-Cookies ss命令和Recv-Q和Send-Q状态 本文主要摘抄自关于TCP 半连接队列和全连接队列 1. TCP的全连接和半连接队列 当服务端调用

[转帖]TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?

https://www.jianshu.com/p/072ed535b1dc 原文地址:TCP 半连接队列和全连接队列满了会发生什么? 一个端口上面的tcp连接创建,基本都只用一个线程处理。如果大并发连接请求过来,处理不了,那么会放入“待处理队列”。为什么不用多线程呢?因为创建连接基本都是内存操作,

[转帖]TCP三次握手详解,滑动窗口,拥塞窗口,网络包路由过程,全连接队列,半连接队列

众所周知,网络分层有传统的OSI七层模型和后来的基于TCP/IP的四层模型: 那么在一次网络的传输过程中具体的流程是怎么样的,我们先从一个数据包的传输说起(以TCP为例): TCP协议根据上层应用提供的信息生成TCP报文 TCP报文在交由下面的IP层(网络层)进行处理,委托IP模块将TCP报文封装成

[转帖]linux tcp 半连接队列和全连接队列

TCP建立连接的“三次握手”过程 上图就是tcp建联的三次握手过程。 Server端需要先调用bind()方法,绑定ip和端口号,再调用listen()方法,然后就可以等待来自Client连接了Client 调用connect()后,就会发送SYN包到Server,此时Client端处理SYN_SE

[转帖]TCP半连接队列和全连接队列

TCP半连接队列和全连接队列 文章很长,建议收藏起来慢慢读! 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备免费赠送 经典图书:《Java高并发核心编程(卷1)》 面试必备 + 大

[转帖]针对容器的nginx优化

针对容器的nginx优化 本篇文章介绍了 Nginx 在容器内使用遇到的CPU核数获取问题以及对应的解决方法。 回顾上篇文章:TCP 半连接队列和全连接队列 背景 容器技术越来越普遍,很多公司已经将容器技术作为基础架构的一部分,容器中可以运行任何软件,包括 Web Server、Applicatio

[转帖]性能分析之TCP全连接队列占满问题分析及优化过程(转载)

https://cloud.tencent.com/developer/article/1420726 前言 在对一个挡板系统进行测试时,遇到一个由于TCP全连接队列被占满而影响系统性能的问题,这里记录下如何进行分析及解决的。 理解下TCP建立连接过程与队列 从图中明显可以看出建立 TCP 连接的时

[转帖]性能分析之TCP全连接队列占满问题分析及优化过程

https://www.cnblogs.com/wx170119/p/12068005.html 前言 在对一个挡板系统进行测试时,遇到一个由于TCP全连接队列被占满而影响系统性能的问题,这里记录下如何进行分析及解决的。 理解下TCP建立连接过程与队列 从图中明显可以看出建立 TCP 连接的时候,有