文章目录

  • 一、什么是 TCP 半连接队列和全连接队列
  • 二、TCP 全连接队列
    • 1、如何查看进程的 TCP 全连接队列大小?
      • 注意
    • 2、TCP 全连接队列溢出问题
      • 注意
    • 3、TCP 全连接队列最大长度
  • 三、TCP 半连接队列
    • 1、TCP 半连接队列溢出问题
    • 2、TCP 半连接队列最大长度
    • 3、引申问题

一、什么是 TCP 半连接队列和全连接队列

TCP 三次握手期间,Linux 内核会维护两个队列,分别是:

  • 半连接队列,也称 SYN 队列
  • 全连接队列,也称 Accept 队列
    在这里插入图片描述
    不管是半连接队列还是全连接队列,都有最大长度限制

二、TCP 全连接队列

1、如何查看进程的 TCP 全连接队列大小?

# -l:显示正在监听(listening)的 socket
# -n:不解析服务名称
# -t:只显示 tcp socket
$ ss -lnt  | grep 55535
State       Recv-Q Send-Q         Local Address:Port                        Peer Address:Port
LISTEN      0      5               192.168.5.28:55535                                  *:*

注意

ss 命令的 Recv-Q/Send-Q 在「LISTEN 状态」和「非 LISTEN 状态」所表达的含义是不同的

/* Linux Kernel 2.6.32 tcp_diag.c */
static void tcp_diag_get_info( ... )
{.../* LISTEN 状态 */if (sk->sk_state == TCP_LISTEN) {/* 当前全连接队列大小 */	    r->idiag_rqueue = sk->sk_ack_backlog;/* 当前全连接队列最大长度 */r->idiag_wqueue = sk->sk_max_ack_backlog;} else {/* 已收到但未被进程读取的字节数 */r->idiag_rqueue = tp->rcv_nxt - tp->copied_seq;/* 已发送但未收到确认的字节数 */r->idiag_wqueue = tp->write_seq - tp->snd_una;}...
}

「LISTEN 状态」的 Recv-Q/Send-Q 含义如下:

  • Recv-Q:当前全连接队列大小
  • Send-Q:当前全连接队列最大长度

2、TCP 全连接队列溢出问题

Linux 有个参数(tcp_abort_on_overflow),可以指定在 TCP 全连接队列满了的情况下使用什么策略回应客户端

/proc/sys/net/ipv4/tcp_abort_on_overflow 共有两个值:

  • 0:全连接队列满了的情况下,服务端丢弃客户端发来的 ACK 报文
  • 1:全连接队列满了的情况下,服务端回给客户端 RST 报文

注意

通常情况下,应该把参数 tcp_abort_on_overflow 设为 0,这样有利于应对突发流量

例如,TCP 全连接队列满了的情况下,服务端丢弃客户端发来的 ACK 报文,但此时客户端的连接状态却是 ESTABLISHED,客户端可以在建立好的 TCP 连接上发出请求,只要服务端没有对请求回复 ACK 应答,那么请求就会被客户端重发,如果服务端只是因为短暂的繁忙致使全连接队列满了,那么当全连接队列有空位时,再次接收到的请求报文中由于含有 ACK 标志,仍会触发服务端建立 TCP 连接,所以,tcp_abort_on_overflow=0 可以提高连接建立的成功率

3、TCP 全连接队列最大长度

min(somaxconn,backlog),其中,somaxconn 是 Linux 内核参数,可以通过 /proc/sys/net/core/somaxconn 调整,而 backlog 是 listen() 函数参数

/* Linux Kernel 2.6.32 socket.c */
SYSCALL_DEFINE2(listen, int, fd, int, backlog)
{.../* /proc/sys/net/core/somaxconn */somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;/* TCP 全连接队列最大长度 */if ((unsigned)backlog > somaxconn)backlog = somaxconn;...
}

三、TCP 半连接队列

1、TCP 半连接队列溢出问题

  1. 如果半连接队列满了,并且没有开启 tcp_syncookies,丢弃
  2. 如果全连接队列满了,并且没有重传 SYN+ACK 的连接请求多于 1 个,丢弃
  3. 如果没有开启 tcp_syncookies,并且 tcp_max_syn_backlog - 当前半连接队列长度 < (tcp_max_syn_backlog >> 2),丢弃
/* Linux Kernel 2.6.32 tcp_ipv4.c* TCP 第一次握手的 Linux 内核代码 */
int tcp_v4_conn_request( ... )
{.../* 条件 1* 如果半连接队列满了*/if (inet_csk_reqsk_queue_is_full(sk) && !isn) {
#ifdef CONFIG_SYN_COOKIESif (sysctl_tcp_syncookies) {want_cookie = 1;} else
#endif/* 如果半连接队列满了,并且没有开启 tcp_syncookies,丢弃 */goto drop;}/* 条件 2* 如果全连接队列满了,并且没有重传 SYN+ACK 的连接请求多于 1 个,丢弃*/if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1)goto drop;...if (want_cookie) {...} else if (!isn) {...if ( ... ) {...}/* 条件 3* 如果没有开启 tcp_syncookies,* 并且 tcp_max_syn_backlog - 当前半连接队列长度 < (tcp_max_syn_backlog >> 2),* 丢弃*/else if (!sysctl_tcp_syncookies && sysctl_max_syn_backlog - inet_csk_reqsk_queue_len(sk) <(sysctl_max_syn_backlog >> 2)) && ...) {...goto drop_and_release;}...}...
}

2、TCP 半连接队列最大长度

tcp_max_syn_backlog < min(somaxconn,backlog) ? tcp_max_syn_backlog * 2 : min(somaxconn,backlog) * 2,其中,tcp_max_syn_backlog 是 Linux 内核参数,可以通过 /proc/sys/net/ipv4/tcp_max_syn_backlog 调整
在这里插入图片描述

3、引申问题

半连接队列最大长度并不代表服务端处于 SYN_RCVD 状态的最大个数

我们在上述内容中总结过 TCP 第一次握手报文被丢弃的三种条件:

  1. 如果半连接队列满了,并且没有开启 tcp_syncookies,丢弃
  2. 如果全连接队列满了,并且没有重传 SYN+ACK 的连接请求多于 1 个,丢弃
  3. 如果没有开启 tcp_syncookies,并且 tcp_max_syn_backlog - 当前半连接队列长度 < (tcp_max_syn_backlog >> 2),丢弃

假设条件一不成立,也就是当前半连接队列长度没有超,而后的条件二也不成立,一旦满足条件三,”半连接队列最大长度并不代表服务端处于 SYN_RCVD 状态的最大个数“ 结论正确,例如 somaxconn = 128, backlog = 511,tcp_max_syn_backlog = 256,计算出半连接队列最大长度是 256,但是按照假设,一旦当前半连接队列长度 > tcp_max_syn_backlog - (tcp_max_syn_backlog >> 2),也就是 256 - 64 = 192,SYN 报文就会被丢弃,那么此时处于 SYN_RCVD 状态的最大个数是 193,而非 256

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87241.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87241.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87241.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下fabric环境搭建

参考教程&#xff1a; https://devpress.csdn.net/cloudnative/66d58e702045de334a569db3.html?dp_tokeneyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MjA2MzY4NywiZXhwIjoxNzQwMzY4MDc0LCJpYXQiOjE3Mzk3NjMyNzQsInVzZXJuYW1lIjoiaHVhbmd0dXBpIn0.oh8e4F6Sw_A4SV2ODQ5W0pYK0…

Redis Pipeline介绍:提高操作Redis数据库的执行效率

Redis Pipeline是一种用于提高Redis执行效率的技术&#xff0c;通过减少客户端与服务器之间的通信开销&#xff0c;显著提升批量操作的性能。本文将详细介绍Redis Pipeline的概念、使用场景、实现方式及其优势。 一、Redis Pipeline的概念 Redis Pipeline是一种批处理机制&am…

linux长时间锁屏无法唤醒

是的&#xff0c;您这么理解很直接&#xff0c;抓住了要点。 简单来说&#xff0c;就是这样&#xff1a; 电脑睡觉有两种方式&#xff1a; 打个盹&#xff08;挂起/Suspend&#xff09;&#xff1a; 把工作状态保存在内存里。这个一般和 Swap 分区没关系。睡死过去&#xff…

STM32F103_Bootloader程序开发11 - 实现 App 安全跳转至 Bootloader

导言 想象一下&#xff0c;我们的单片机 App 正在稳定地运行着&#xff0c;突然我们想给它升级一下&#xff0c;添加个新功能。我们该如何安全地通知它&#xff1a;“嘿&#xff0c;准备好接收新固件了” ? 这就需要 App 和 Bootloader 之间建立一个可靠的"秘密握手"…

Explain解释

参考官方文档&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/explain-output.html explain关键字可以分析你的查询语句的结构和性能。 explain select查询&#xff0c; 执行会返回执行计划的信息。 注意&#xff1a;如果from中有子查询&#xff0c;仍然会执行该子查询…

选择 PDF 转 HTML 转换器的 5 个关键特性

市面上有很多 PDF 转 HTML 的转换器&#xff0c;每一款产品都有不同的功能组合。要理清并理解每个功能可能会让人感到困惑。那么&#xff0c;真正重要的是什么呢&#xff1f; 这篇文章将介绍我们认为在选择最佳 PDF 转 HTML 转换器时最重要的 5 个关键特性&#xff1a; 1. 转换…

使用堡塔在服务器上部署宝塔面板-linux版

使用堡塔在服务器上部署宝塔面板-linux版 使用堡塔多机管理登录服务器 进入宝塔官网&#xff0c;获取安装脚本 wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh && sudo bash install_panel.sh ed8484bec3. 在堡塔多机管理中&#xff0c;…

【Unity高级】Unity多界面游戏场景管理方案详解

引言&#xff1a;游戏界面管理的挑战 在Unity游戏开发中&#xff0c;尤其是包含多个功能界面&#xff08;如主菜单、关卡选择、游戏页面、设置和商城&#xff09;的游戏&#xff0c;如何高效管理场景与界面是架构设计的核心挑战。本文将深入探讨三种主流实现方案&#xff1a;单…

WINDOWS最快布署WEB服务器:apache2

安装JDK下载 https://tomcat.apache.org/ Index of /dist/tomcat/tomcat-9 安装测试 http://localhost:8080/ 替换自己的文件 把自己的文件复制到&#xff1a; C:\Program Files\Apache Software Foundation\Tomcat 9.0\webapps\ROOT

Microsoft Edge 打开无反应、打开后显示兼容性问题、卸载重装 解决方案。一键卸载Microsoft Edge 。

背景&#xff1a;网络上的浏览器修复、重装、恢复默认应用测试后无用&#xff0c;以下卸载重装方案经实测可以正常使用Microsoft Edg。 卸载软件在资源里&#xff0c;请自取。 一、卸载软件&#xff1a;Remove-Edge_GUI.exe 双击卸载等待即可。 二、在微软商店重新安装Micro…

Spring Boot - 参数校验:分组校验、自定义注解、嵌套对象全解析

01 依赖配置 在构建高效的校验体系前&#xff0c;需先完善项目依赖配置。 以下是优化后的依赖示例&#xff1a; <dependencies><!-- Web 依赖&#xff0c;提供 RESTful 接口支持 --><dependency><groupId>org.springframework.boot</groupId>…

深入浅出多模态》(十一)之多模态经典模型:Flamingo系列

&#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料&#xff0c;配有全面而有深度的专栏内容&#xff0c;包括不限于 前沿论文解读、…

基于Pandas和FineBI的昆明职位数据分析与可视化实现(三)- 职位数据统计分析

文章目录 一、职位数据分析1. 一级分类职位数量统计分析2. 职位二级分类分布分析3. 职位分布分析4. 工作经验需求分布分析5. 学历要求职位分布分析6. 企业职位供给前507. 不同规模公司的职位数量统计8. 区域职位分布分析9. 各区域平均薪资范围分布分析10. 不同工作经验平均薪资…

大数据Hadoop之——安装部署hadoop

目录 前期准备 一、JDK的安装 1、安装jdk 2、配置Java环境变量 3、加载环境变量 4、进行校验 二、hadoop的环境搭建 1、hadoop的下载安装 2、配置文件设置 2.1. 配置 hadoop-env.sh 2.2. 配置 core-site.xml 2.3. 配置 hdfs-site.xml 2.4. 配置 yarn-site.xml 2.…

Spring IoC DI介绍

文章目录 IoC & DI 介绍IoC介绍DI 介绍 组件注册Bean 命名约定方法注解 Bean总结 扫描路径DI 详解属性注入构造方法注入Setter 注入三种注入优缺点分析 当同一类型存在多个Bean时,直接使用Autowired会存在问题使用Primary注解使用Qualifier注解使用Bean的名称使用Resource注…

【Flutter】解决 flutter_inappwebview在 Windows 上使用导致应用闪退问题

问题背景 在 Windows 11 上运行 Flutter 桌面应用时&#xff0c;应用出现闪退现象。通过系统事件日志分析&#xff0c;发现是 MSVCP140.dll 模块的访问冲突异常&#xff08;错误代码 c0000005&#xff09;导致的崩溃。 问题分析 1. 错误现象 应用启动后立即闪退Windows 事件…

使用 JavaScript、Mastra 和 Elasticsearch 构建一个具备代理能力的 RAG 助手

作者&#xff1a;来自 Elastic JD Armada 了解如何在 JavaScript 生态系统中构建 AI 代理。 Elasticsearch 与业界领先的生成式 AI 工具和服务商有原生集成。查看我们的网络研讨会&#xff0c;了解如何超越 RAG 基础&#xff0c;或使用 Elastic 向量数据库构建可投入生产的应用…

Active Directory 环境下 Linux Samba 文件共享服务建设方案

Active Directory 环境下 Linux Samba 文件共享服务建设方案 目录 需求分析方案总体设计技术架构与选型详细部署规划共享文件性能测试非域终端共享配置运维与权限安全管理建议1. 需求分析 因某公司(编的)新增多个部门,各部门之间存在多类型终端系统,但又有同时访问文件库…

Python爬虫网安-项目-简单网站爬取

源码&#xff1a; https://github.com/Wist-fully/Attack/tree/pc pc_p1 目标&#xff1a; 1.进入列表页&#xff0c;顺着列表爬取每个电影详情页 2.利用正则来提取&#xff0c;海报&#xff0c;名称&#xff0c;类别&#xff0c;上映的时间&#xff0c;评分&#xff0c;剧…

Golang中的数组

Golang Array和以往认知的数组有很大不同。有点像Python中的列表 1. 数组&#xff1a;是同一种数据类型的固定长度的序列。 2. 数组定义&#xff1a;var a [len]int&#xff0c;比如&#xff1a;var a [5]int&#xff0c;数组长度必须是常量&#xff0c;且是类型的组成部分。一…