Linux TCP参数——tcp_abort_on_overflow
文章目录
- tcp_abort_on_overflow
- 全连接队列是什么?
- 如何改变队列大小?
- 内核源码流程
- 命令查看
- 总结
tcp_abort_on_overflow
英文翻译理解:溢出中止
所以,溢出指的是什么溢出?
Linux中会维护socket全连接队列,所以这里的溢出指的是全连接队列的溢出。
全连接队列是什么?
全连接队列指的就是TCP三次握手中的第三次握手成功后,内核会把连接从半连接队列(Listen队列)移除,并将其添加到 accept 队列,等待应用进程传输数据。
所以,tcp_abort_on_overflow
- tcp_abort_on_overflow=0,server会丢弃client的ack或者等待队列空闲重发ack+syn。
- tcp_abort_on_overflow=1,server 会发送 reset 包给 client。
如何改变队列大小?
半连接队列大小,长度由tcp_max_syn_backlog和net.core.somaxconn和业务tcp调用listen(fd, backlog)的backlog三者最小值决定
全连接队列大小,长度由net.core.somaxconn和listen(fd, backlog)的backlog两者最小值决定
/** Perform a listen. Basically, we allow the protocol to do anything* necessary for a listen, and if that works, we mark the socket as* ready for listening.*/int sysctl_somaxconn = SOMAXCONN;asmlinkage long sys_listen(int fd, int backlog)
{struct socket *sock;int err, fput_needed;if ((sock = sockfd_lookup_light(fd, &err, &fput_needed)) != NULL) {if ((unsigned) backlog > sysctl_somaxconn)backlog = sysctl_somaxconn;err = security_socket_listen(sock, backlog);if (!err)err = sock->ops->listen(sock, backlog);fput_light(sock->file, fput_needed);}return err;
}
内核源码流程
- 当新的TCP连接请求到达时,内核会调用tcp_v4_syn_recv_sock()函数来处理连接请求。(tcp_check_req函数中调用了该函数tcp_v4_syn_recv_sock)
/** The three way handshake has completed - we got a valid synack -* now create the new socket.*/
struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,struct request_sock *req,struct dst_entry *dst)
{struct inet_request_sock *ireq;struct inet_sock *newinet;struct tcp_sock *newtp;struct sock *newsk;if (sk_acceptq_is_full(sk))//判断是否已满goto exit_overflow;if (!dst && (dst = inet_csk_route_req(sk, req)) == NULL)goto exit;newsk = tcp_create_openreq_child(sk, req, skb);if (!newsk)goto exit;newsk->sk_gso_type = SKB_GSO_TCPV4;sk_setup_caps(newsk, dst);newtp = tcp_sk(newsk);newinet = inet_sk(newsk);ireq = inet_rsk(req);newinet->daddr = ireq->rmt_addr;newinet->rcv_saddr = ireq->loc_addr;newinet->saddr = ireq->loc_addr;newinet->opt = ireq->opt;ireq->opt = NULL;newinet->mc_index = inet_iif(skb);newinet->mc_ttl = skb->nh.iph->ttl;inet_csk(newsk)->icsk_ext_hdr_len = 0;if (newinet->opt)inet_csk(newsk)->icsk_ext_hdr_len = newinet->opt->optlen;newinet->id = newtp->write_seq ^ jiffies;tcp_mtup_init(newsk);tcp_sync_mss(newsk, dst_mtu(dst));newtp->advmss = dst_metric(dst, RTAX_ADVMSS);tcp_initialize_rcv_mss(newsk);__inet_hash(&tcp_hashinfo, newsk, 0);__inet_inherit_port(&tcp_hashinfo, sk, newsk);return newsk;exit_overflow:NET_INC_STATS_BH(LINUX_MIB_LISTENOVERFLOWS);
exit:NET_INC_STATS_BH(LINUX_MIB_LISTENDROPS);dst_release(dst);return NULL;
}
- 在tcp_v4_syn_recv_sock()函数中,会首先检查全连接队列是否已满。
static inline int sk_acceptq_is_full(struct sock *sk)
{return sk->sk_ack_backlog > sk->sk_max_ack_backlog;
}/** Move a socket into listening state.*/
int inet_listen(struct socket *sock, int backlog)
{struct sock *sk = sock->sk;unsigned char old_state;int err;lock_sock(sk);err = -EINVAL;if (sock->state != SS_UNCONNECTED || sock->type != SOCK_STREAM)goto out;old_state = sk->sk_state;if (!((1 << old_state) & (TCPF_CLOSE | TCPF_LISTEN)))goto out;/* Really, if the socket is already in listen state* we can only allow the backlog to be adjusted.*/if (old_state != TCP_LISTEN) {err = inet_csk_listen_start(sk, TCP_SYNQ_HSIZE);if (err)goto out;}sk->sk_max_ack_backlog = backlog;//队列大小err = 0;out:release_sock(sk);return err;
}const struct proto_ops inet_stream_ops = {.../* 在这里注册 被sys_listen中的sock->ops->listen(sock, backlog)调用注册的函数*/.listen = inet_listen,...
};
- 如果全连接队列未满,会将连接请求放入队列中进行处理;如果全连接队列已满,则根据tcp_abort_on_overflow参数的设置来决定处理方式。
/* * Process an incoming packet for SYN_RECV sockets represented* as a request_sock.*/struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,struct request_sock *req,struct request_sock **prev)
{....../* OK, ACK is valid, create big socket and* feed this segment to it. It will repeat all* the tests. THIS SEGMENT MUST MOVE SOCKET TO* ESTABLISHED STATE. If it will be dropped after* socket is created, wait for troubles.*/child = inet_csk(sk)->icsk_af_ops->syn_recv_sock(sk, skb,req, NULL);//此处调用的就是tcp_v4_syn_recv_sockif (child == NULL)goto listen_overflow;inet_csk_reqsk_queue_unlink(sk, req, prev);inet_csk_reqsk_queue_removed(sk, req);inet_csk_reqsk_queue_add(sk, req, child);return child;listen_overflow:if (!sysctl_tcp_abort_on_overflow) {inet_rsk(req)->acked = 1;return NULL;}......
}
- 如果tcp_abort_on_overflow=1,表示立即终止新的连接请求。这时,内核会调用tcp_abort()函数发送RST包给客户端,拒绝连接请求。
- 如果tcp_abort_on_overflow=0,表示延迟处理连接请求。内核会等待全连接队列有空闲位置后再处理连接请求。
命令查看
-t:表示只显示TCP协议的套接字连接。
-l:表示只显示监听状态的套接字连接,即处于监听(LISTEN)状态的套接字连接。
-n:表示使用数字形式显示IP地址和端口号,而不进行域名解析。
# 半连接队列 无法直接查看
# 全连接队列
ss -tln
# TCP记录
netstat -as | sed -n '/TcpExt/,$p' | sed '/IpExt/q'
REF:半连接队列和全连接队列
总结
tcp_abort_on_overflow控制TCP连接过载时的行为,默认值为0(关闭),开启则直接RST终止连接。
相关文章:
Linux TCP参数——tcp_abort_on_overflow
文章目录 tcp_abort_on_overflow全连接队列是什么?如何改变队列大小?内核源码流程命令查看总结 tcp_abort_on_overflow 英文翻译理解:溢出中止 所以,溢出指的是什么溢出? Linux中会维护socket全连接队列,所…...

jupyter notebook设置代码提示方法
在命令行运行以下代码: pip install jupyter_contrib_nbextensionsjupyter contrib nbextension install --userpip install jupyter_nbextensions_configuratorjupyter nbextensions_configurator enable --user (有时安装第一行后会自动执行第二行&a…...
Linux 一点查询资料
Linux 一点查询资料 Linux101 Linux入门教程 鸟哥的Linux私房菜 Harley Hahn’s Guide to Unix and Linux 文件管理 - cd, pwd, mkdir, rmdir, ls, cp, rm, mv, tar 文件检索 - cat, more, less, head, tail, file, find 输入输出控制 - 重定向, 管道, tee, xargs 文本处理 -…...

如何快速搭建一个完整的vue2+element-ui的项目-二
技术细节-继续配置 提示:你以为这样就完了吗,其实还有很多东西需要我们自己手写的 例如: element-ui的配置样式重置配置src使用的配置elinst配置axios异步请求的二次封转配置语言国际化配置(这个看需求,我这里就不用配置了)vuex的配置mixins的配置开发环…...
多语言LLM的状态:超越英语
多语言大语言模型的发展现状:超越英语 引言 据微软研究院的数据显示,世界上大约88%的语言,即12亿人的母语,缺乏对大型语言模型(LLM)的访问。这是因为大多数LLM都是以英语为中心的,即它们大多是…...
kafka什么情况下会认为发送失败进而去重试
在Kafka中,发送消息的过程是异步的,即消息后不会立即得到发送结果。Kafka会将消息添加到发送缓冲区,并立即返回一个成功的响应。因此,Kafka并不会直接知道消息是否成功发送到了目标主题的分区。 Kafka在以下情况下会认为发送失败…...
不满足软件包要求‘transformers==4.30.2‘, ‘sse-starlette
transformers4.30.2支持的SSE-Starlette版本是0.14.0...

C# 设置AutoScroll为true没效果的原因分析和解决办法
C#中添加tabControl 分页,将autoscroll设置为true发现缩小窗口没有滚动条效果。该问题出现后,检索发现也有很多人询问了该问题,但是都没有给出解决方案。 原因是内部button的属性Anchor设置为top、left、right、bottom导致的缩小界面窗口也没…...

<Senior High School Math>: inequality question
( 1 ) . o m i t (1). omit (1).omit ( 2 ) . ( a 2 − b 2 ) ( x 2 a 2 − y 2 b 2 ) ( x 2 y 2 ) − ( a 2 y 2 b 2 b 2 x 2 a 2 ) ≤ x 2 y 2 − 2 x y ( x − y ) 2 (2). (a^2-b^2)(\frac{x^2}{a^2} - \frac{y^2}{b^2})(x^2y^2)-(\frac{a^2y^2}{b^2}\frac{b^2x^2}{a^…...

详解Python中Pytest和Unittest的区别
昨天在群里面,有两个新手的小伙伴提问:Pytest 和 Unittest是Python中属于最常用的两个测试框架。那么他们有些什么区别呢? Playwright 为什么只给了Pytest的深度支持,而不是Unittest呢? 这是个好问题, 田辛…...
零基础入门多媒体音频(1)-音频基础
声音的本质是波动,波形图能直观体现声音的特征。我们常用于描述音频的属性有下面这些: 1.采样率:声音中每秒包含的采样点个数。 2.位宽:每个采样点需要多少个bit进行存储。 3.声道数:声音进行回放需要喇叭的个数。 4.频…...
40 道高频 C++ 面试、笔试题及答案
1. 什么是多态? 答案: 多态允许对象在运行时表现出不同的行为,具体取决于其类型。 2. 虚函数和纯虚函数之间的区别是什么? 答案: 虚函数可以被派生类重写,而纯虚函数必须被派生类实现,否则派生…...

【07】进阶html5
HTML5 包含两个部分的更新,分别是文档和web api 文档 HTML5 元素表 元素语义化 元素语义化是指每个 HTML 元素都代表着某种含义,在开发中应该根据元素含义选择元素 元素语义化的好处: 利于 SEO(搜索引擎优化)利于无障碍访问利于浏览器的插件分析网页新增元素 多媒体…...
Linux|centos7|postgresql数据库|yum和编译方式安装总结(全系版本)
一、 yum方式安装postgresql 这个是官方的yum源,包括postgresql的开发包,lib库什么的,很齐全,关键是包括pgbackrest yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-la…...
C++提高笔记(五)---STL容器(set/multiset、map/multimap)
1、set / multiset容器 1.1set基本概念 简介:所有元素都会在插入时自动被排序 本质:set和multiset属于关联式容器,底层结构是用二叉树实现 set和multiset区别: set不允许容器中有重复的元素 multiset允许容器中有重复的元素 …...

详解main函数参数argc、argv及如何传参
目录 1、main()函数参数 2、main函数如何传参 2.1 环境准备 2.2 通过 Powershell 窗口传参 2.3 通过vs界面传参 3、int main() 和 int main(int argc, char *argv[]) 特点 1、main()函数参数 在C语言中,main函数可以带参数。main函数的原型通常为以下两种形式…...
解释什么是Web组件化开发及其优势
解释什么是Web组件化开发及其优势 Web组件化开发,是一种将Web应用的界面和功能拆分为独立、可复用的组件的开发方法。这种方法的核心思想是将大型、复杂的Web应用拆分为一系列小型、功能单一的组件,每个组件都负责处理特定的业务逻辑或界面表现。通过组…...

那些场景需要额外注意线程安全问题
主要学习那些场景需要额外注意线程安全问题,在这里总结了四中场景。 访问共享变量或资源 第一种场景是访问共享变量或共享资源的时候,典型的场景有访问共享对象的属性,访问static静态变量,访问共享的缓存,等等。因为…...
(C语言)球球大作战
前言: 这款简易版的球球大作战是一款单人游戏,玩家需要控制一个小球在地图上移动,吞噬其他小球来增大自己的体积。本游戏使用C语言和easyx图形库编写,旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代码之前…...

高级数据结构 <AVL树>
本文已收录至《数据结构(C/C语言)》专栏! 作者:ARMCSKGT 目录 前言正文AVL树的性质AVL树的定义AVL树的插入函数左单旋右单旋右左双旋左右双旋 检验AVL树的合法性关于AVL树 最后 前言 前面我们学习了二叉树,普通的二叉树没有任何特殊性质&…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...