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树 最后 前言 前面我们学习了二叉树,普通的二叉树没有任何特殊性质&…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...