当前位置: 首页 > news >正文

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;
}

内核源码流程

  1. 当新的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;
}
  1. 在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,...
};
  1. 如果全连接队列未满,会将连接请求放入队列中进行处理;如果全连接队列已满,则根据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;}......
}
  1. 如果tcp_abort_on_overflow=1,表示立即终止新的连接请求。这时,内核会调用tcp_abort()函数发送RST包给客户端,拒绝连接请求。
  2. 如果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全连接队列是什么&#xff1f;如何改变队列大小&#xff1f;内核源码流程命令查看总结 tcp_abort_on_overflow 英文翻译理解&#xff1a;溢出中止 所以&#xff0c;溢出指的是什么溢出&#xff1f; Linux中会维护socket全连接队列&#xff0c;所…...

jupyter notebook设置代码提示方法

在命令行运行以下代码&#xff1a; pip install jupyter_contrib_nbextensionsjupyter contrib nbextension install --userpip install jupyter_nbextensions_configuratorjupyter nbextensions_configurator enable --user &#xff08;有时安装第一行后会自动执行第二行&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的项目-二

技术细节-继续配置 提示&#xff1a;你以为这样就完了吗,其实还有很多东西需要我们自己手写的 例如&#xff1a; element-ui的配置样式重置配置src使用的配置elinst配置axios异步请求的二次封转配置语言国际化配置(这个看需求,我这里就不用配置了)vuex的配置mixins的配置开发环…...

多语言LLM的状态:超越英语

多语言大语言模型的发展现状&#xff1a;超越英语 引言 据微软研究院的数据显示&#xff0c;世界上大约88%的语言&#xff0c;即12亿人的母语&#xff0c;缺乏对大型语言模型&#xff08;LLM&#xff09;的访问。这是因为大多数LLM都是以英语为中心的&#xff0c;即它们大多是…...

kafka什么情况下会认为发送失败进而去重试

在Kafka中&#xff0c;发送消息的过程是异步的&#xff0c;即消息后不会立即得到发送结果。Kafka会将消息添加到发送缓冲区&#xff0c;并立即返回一个成功的响应。因此&#xff0c;Kafka并不会直接知道消息是否成功发送到了目标主题的分区。 Kafka在以下情况下会认为发送失败…...

不满足软件包要求‘transformers==4.30.2‘, ‘sse-starlette

transformers4.30.2支持的SSE-Starlette版本是0.14.0...

C# 设置AutoScroll为true没效果的原因分析和解决办法

C#中添加tabControl 分页&#xff0c;将autoscroll设置为true发现缩小窗口没有滚动条效果。该问题出现后&#xff0c;检索发现也有很多人询问了该问题&#xff0c;但是都没有给出解决方案。 原因是内部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的区别

昨天在群里面&#xff0c;有两个新手的小伙伴提问&#xff1a;Pytest 和 Unittest是Python中属于最常用的两个测试框架。那么他们有些什么区别呢&#xff1f; Playwright 为什么只给了Pytest的深度支持&#xff0c;而不是Unittest呢&#xff1f; 这是个好问题&#xff0c; 田辛…...

零基础入门多媒体音频(1)-音频基础

声音的本质是波动&#xff0c;波形图能直观体现声音的特征。我们常用于描述音频的属性有下面这些&#xff1a; 1.采样率&#xff1a;声音中每秒包含的采样点个数。 2.位宽&#xff1a;每个采样点需要多少个bit进行存储。 3.声道数&#xff1a;声音进行回放需要喇叭的个数。 4.频…...

40 道高频 C++ 面试、笔试题及答案

1. 什么是多态&#xff1f; 答案&#xff1a; 多态允许对象在运行时表现出不同的行为&#xff0c;具体取决于其类型。 2. 虚函数和纯虚函数之间的区别是什么&#xff1f; 答案&#xff1a; 虚函数可以被派生类重写&#xff0c;而纯虚函数必须被派生类实现&#xff0c;否则派生…...

【07】进阶html5

HTML5 包含两个部分的更新,分别是文档和web api 文档 HTML5 元素表 元素语义化 元素语义化是指每个 HTML 元素都代表着某种含义,在开发中应该根据元素含义选择元素 元素语义化的好处: 利于 SEO(搜索引擎优化)利于无障碍访问利于浏览器的插件分析网页新增元素 多媒体…...

Linux|centos7|postgresql数据库|yum和编译方式安装总结(全系版本)

一、 yum方式安装postgresql 这个是官方的yum源&#xff0c;包括postgresql的开发包&#xff0c;lib库什么的&#xff0c;很齐全&#xff0c;关键是包括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基本概念 简介&#xff1a;所有元素都会在插入时自动被排序 本质&#xff1a;set和multiset属于关联式容器&#xff0c;底层结构是用二叉树实现 set和multiset区别&#xff1a; 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语言中&#xff0c;main函数可以带参数。main函数的原型通常为以下两种形式…...

解释什么是Web组件化开发及其优势

解释什么是Web组件化开发及其优势 Web组件化开发&#xff0c;是一种将Web应用的界面和功能拆分为独立、可复用的组件的开发方法。这种方法的核心思想是将大型、复杂的Web应用拆分为一系列小型、功能单一的组件&#xff0c;每个组件都负责处理特定的业务逻辑或界面表现。通过组…...

那些场景需要额外注意线程安全问题

主要学习那些场景需要额外注意线程安全问题&#xff0c;在这里总结了四中场景。 访问共享变量或资源 第一种场景是访问共享变量或共享资源的时候&#xff0c;典型的场景有访问共享对象的属性&#xff0c;访问static静态变量&#xff0c;访问共享的缓存&#xff0c;等等。因为…...

(C语言)球球大作战

前言&#xff1a; 这款简易版的球球大作战是一款单人游戏&#xff0c;玩家需要控制一个小球在地图上移动&#xff0c;吞噬其他小球来增大自己的体积。本游戏使用C语言和easyx图形库编写&#xff0c;旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代码之前&#xf…...

高级数据结构 <AVL树>

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

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...