首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文带你搞定TCP连接队列

一文带你搞定TCP连接队列

作者头像
shysh95
发布于 2021-12-21 12:38:58
发布于 2021-12-21 12:38:58
1.4K00
代码可运行
举报
文章被收录于专栏:shysh95shysh95
运行总次数:0
代码可运行

TCP握手的时候维护的队列

  • 半连接队列(SYN队列)
  • 全连接队列(accepted队列)

半连接队列是什么?

服务器收到客户端SYN数据包后,Linux内核会把该连接存储到半连接队列中,并响应SYN+ACK报文给客户端。

全连接队列是什么?

服务器在收到客户端第三次握手的ACK报文后,内核会把该连接从半连接队列中移除,然后创建一个新的完全的连接并将其放入全连接队列中,等待应用程序调用accept函数把连接取走。

队列溢出会有啥问题?

半连接和全连接队列都有最大长度限制,超过限制时,内核会直接丢弃,返回RST报文。

如何查看全连接队列?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -l 显示正在listening的socket
# -n 不解析服务名称
# -t 只显示tcp socket
ss -lnt

Recv-Q/Send-Q在Listen状态和非Listen状态下代表的含义不一样。

在Listen状态下:

  • Recv-Q:当前全连接队列的大小,完成三次握手等待accept的TCP连接
  • Send-Q:全连接队列的最大长度,上图中表示80端口的TCP服务全连接队列的最大长度为128。

在非Listen状态下:

  • Recv-Q:已收到但未被应用程序读取的字节数
  • Send-Q:已发送但未收到确认的字节数

如何查看TCP全连接队列溢出情况?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
netstat -s | grep overflowed

通过上图可以看出,全连接队列一共溢出了1910次,如果这个数字在某个时间段一直增加,说明该时间段的全连接队列已经满载溢出。

全连接队列溢出后的情况?

全连接队列溢出后的处理受内核参数tcp_abort_on_overflow控制:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 通过以下命令可以看出默认值是0
cat /proc/sys/net/ipv4/tcp_abort_on_overflow
  • 0:如果全连接队列满了,服务端会直接丢弃客户端发送过来的ACK数据包
  • 1:如果全连接队列满了,服务端会发送一个reset包给客户端,表示废弃这个握手过程和连接

假设服务端将tcp_abort_on_overflow设置为1,在服务端全连接队列满载以后,客户端如果还在不停的发起连接将会收到connection reset by peer的错误。

tcp_abort_on_overflow设置为0更有利于应对突发流量。

如何增加TCP全连接队列?

TCP全连接队列的最大值取决于somaxconn和blacklog之间的最小值:

  • somaxconn:linux内核参数,可以通过/proc/sys/net/core/somaxconn修改其值
  • backlog:listen(int sockfd, int backlog)函数中的backlog大小,一般应用程序都可以自定义该值

如何查看TCP半连接队列长度?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 执行以下命令就可以查看半连接队列的大小
netstat -natp | grep SYN_RECV | wc -l

如何查看TCP半连接队列溢出的情况?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
netstat -s | grep 'SYNs to LISTEN'

上图中我们可以看出半连接队列累计一共丢弃了220418个TCP连接,如果多次执行该命令该值有上升趋势,说明当前时间段存在半连接队列溢出现象。

半连接队列大小受哪些条件影响?

半连接队列的大小受内核参数tcp_max_syn_backlog控制,但是该值不一定是半连接队列的最大值(在较新版本的linux内核中理论上半连接队列的最大值是全连接队列的最大值),队列的溢出是有一定条件的:

  • 如果半连接队列满了,并且没有开启tcp_syncookies,就会丢弃连接
  • 如果全连接队列满了,并且没有重传SYN+ACK包的连接请求多余1个,也会丢弃连接
  • 如果没有开启tcp_syncookies,并且tcp_max_syn_backlog减去当前半连接队列长度小于(tcp_max_syn_backlog >> 2),则会丢弃连接

什么是syncookies?

syncookies是服务器根据当前状态计算一个值,然后再SYN+ACK报文中发出,当客户端返回ACK报文时,服务端取出该值进行验证,验证成功则认为连接建立成功。

开启syncookies功能可以在不使用半连接队列的情况下成功建立连接。

如何设置syncookies的值?

通过内核tcp_syncookies参数进行控制:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 可以查看tcp_syncookies的值
cat /proc/sys/net/ipv4/tcp_syncookies

tcp_syncookies不同的值分别为不同的含义:

  • 0:表示关闭tcp_syncookies功能
  • 1:只有当半连接队列满时再启用tcp_syncookies功能
  • 2:表示无条件开启tcp_syncookies功能

如何抵御SYN攻击?

SYN攻击是指对服务端一直发送SYN包,但不回第三次握手的ACK数据包,此时会导致服务端有大量的SYN_RECV的TCP连接。

抵御SYN攻击可以采取以下方法:

  • 增大半连接队列
  • 开启tcp_syncookies功能
  • 减少SYN+ACK的重传次数
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员修炼笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?
很简单呀,因为我做了实验和看了 TCP 协议栈的内核源码,发现要增大这两个队列长度,不是简简单单增大某一个参数就可以的。
帅地
2020/06/03
4.7K0
TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?
Tomcat 调优之从 Linux 内核源码层面看 Tcp backlog
前两天看到一群里在讨论 Tomcat 参数调优,看到不止一个人说通过 accept-count 来配置线程池大小,我笑了笑,看来其实很多人并不太了解我们用的最多的 WebServer Tomcat,这篇文章就来聊下 Tomcat 调优,重点介绍下线程池调优及 TCP 半连接、全连接队列调优。
yanhom
2022/10/19
3.1K1
Tomcat 调优之从 Linux 内核源码层面看 Tcp backlog
从源码与实战分析TCP全连接队列溢出故障
wrk是一个基于C语言编写的HTTP性能测试工具,由GitHub用户wg/wrk开发。它能够通过生成大量的HTTP请求,对服务器进行压力测试,并实时输出测试结果,包括请求速率、传输速率、连接数等关键性能指标。wrk的设计初衷是为了提供一个简单易用的性能测试工具,同时保证测试结果的准确性和可靠性。
五分钟学SRE
2024/04/29
7021
五分钟带你读懂 TCP全连接队列(图文并茂)
今天有个小伙伴跑过来告诉我有个奇怪的问题需要协助下,问题确实也很奇怪。客户端调用RT比较高并伴随着间歇性异常Connection reset出现,而服务端CPU 、线程栈等看起来貌似都很正常,而且服务端的RT很短。
鲁大猿
2020/09/18
3.2K0
linux中TCP三次握手与四次挥手介绍及调优
TCP是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如ip地址、端口号等。
没有故事的陈师傅
2021/08/13
9160
TCP 三次握手,给我长脸了噢
之前有个小伙伴在技术交流群里咨询过一个问题,我当时还给提供了点排查思路,是个典型的八股文转实战分析的案例,我觉得挺有意思,趁着中午休息简单整理出来和大家分享下,有不严谨的地方欢迎大家指出。
程序员小富
2023/03/16
8320
TCP 三次握手,给我长脸了噢
从源码与实战分析TCP半连接队列溢出故障
hping3是一个基于C语言编写的网络性能测试工具,由Salvatore Sanfilippo开发。它能够模拟各种类型的网络包,对服务器进行压力测试,并提供丰富的选项来定制测试。hping3不仅适用于HTTP协议,还支持TCP、UDP、ICMP等多种协议,使其成为一个多功能的网络性能测试工具。
五分钟学SRE
2024/05/01
5150
关于TCP 半连接队列和全连接队列
最近碰到一个client端连接异常问题,然后定位分析并查阅各种资料文章,对TCP连接队列有个深入的理解 查资料过程中发现没有文章把这两个队列以及怎么观察他们的指标说清楚,希望通过这篇文章能把他们说清楚一点 问题描述 JAVA的client和server,使用socket通信。server使用NIO。 间歇性的出现client向server建立连接三次握手已经完成,但server的selector没有响应到这连接。 出问题的时间点,会同时有很多连接出现这个问题。 selector没有销毁重建,一直用的都是一
用户1263954
2018/01/30
2.5K0
关于TCP 半连接队列和全连接队列
TCP三次握手详解-深入浅出(有图实例演示)[通俗易懂]
TCP是属于网络分层中的运输层(有的书也翻译为传输层),因为OSI分为7层,感觉太麻烦了,所以分为四层就好了,简单。 分层以及每层的协议,TCP是属于运输层(有的书也翻译为传输层),如下两张图:
全栈程序员站长
2022/09/07
3.9K0
TCP三次握手详解-深入浅出(有图实例演示)[通俗易懂]
再聊 TCP backlog
关于三次握手,还有很多细节之前的文章没有详细介绍,这篇文章我们以 backlog 参数来深入研究一下建连的过程。通过阅读这篇文章,你会了解到下面这些知识:
挖坑的张师傅
2022/05/13
1.2K0
再聊 TCP backlog
全连接队列和半连接队列
大家对于 TCP 的三次握手应该都比较熟悉了,对于服务端,收到 SYN 包后该怎么处理,收到 Establish 之后又该怎么处理,或者说这些连接放在哪里,其实这也是之前面试问过的问题
opencode
2022/12/26
8010
全连接队列和半连接队列
动图图解!没有accept,能建立TCP连接吗?
其实只要在执行accept() 之前执行一个 sleep(20),然后立刻执行客户端相关的方法,同时抓个包,就能得出结论。
moon聊技术
2021/10/20
1.6K0
动图图解!没有accept,能建立TCP连接吗?
TCP(二)
如上图所示,关键部分:syns queue(半连接队列)和accept queue(全连接队列)
在周末
2019/08/26
4950
记一次惊心的网站 TCP 队列问题排查经历
来源:高效运维 ID:greatops 问题描述 监控系统发现电商网站主页及其它页面间歇性的无法访问; 查看安全防护和网络流量、应用系统负载均正常; 系统重启后,能够暂时解决,但持续一段时间后间歇性问题再次出现。 此时问题已影响到整个网站的正常业务,我那个心惊呀,最主要是报警系统没有任何报警,服务运行一切正常,瞬时背上的汗已经出来了。但还是要静心,来仔细寻找蛛丝马迹,来一步一步找问题。 问题初步判断 检查dev 和 网卡设备层,是否有error和drop ,分析在硬件和系统层是否异常 ----- 命令
小小科
2018/06/20
7300
性能分析之TCP全连接队列占满问题分析及优化过程
在对一个挡板系统进行测试时,遇到一个由于TCP全连接队列被占满而影响系统性能的问题,这里记录下如何进行分析及解决的。
高楼Zee
2019/12/24
5.1K0
一图理解TCP三次握手原理及半连接、全连接队列对网络的影响
2、服务端收到客户端的SYN请求后,服务端进入 SYN_RECV 状态,此时内核会将连接存储到半连接队列(SYN Queue),并向 客户端回复 SYN+ACK
崔认知
2023/09/05
8020
一图理解TCP三次握手原理及半连接、全连接队列对网络的影响
TCP 三次握手应该这么学 《深入解析TCP连接管理:三次握手与队列溢出应对策略》
TCP三次握手是建立一个可靠的连接的基础。在这个过程中,有两个重要的队列:半连接队列(SYN queue)和全连接队列(ACCEPT queue)。
五分钟学SRE
2024/04/16
7930
TCP 三次握手应该这么学  《深入解析TCP连接管理:三次握手与队列溢出应对策略》
懂得三境界-使用dubbo时请求超过问题
刚才下班回家路上,无意中听到大街上放的歌,歌词有这么一句:“毡房外又有驼铃声声响起,我知道那一定不是你”。这一句我似乎听懂了歌者的魂牵梦绕和绝望,如果在十年前我大概只能感受出悠扬的声调里溢出的悲凉吧。
静儿
2022/05/06
3960
懂得三境界-使用dubbo时请求超过问题
记一次惊心的网站TCP队列问题排查经历
此时问题已经影响到整个网站的正常业务,我的那个心惊的呀,最主要报警系统没有任何报警,服务运行一切正常,瞬时背上的汗已经出来了。但还是要静心,来仔细寻找蛛丝马迹,来一步一步找问题。
顶级程序员
2018/07/23
1.1K0
面试官:换人!他连 TCP 这几个参数都不懂
TCP 性能的提升不仅考察 TCP 的理论知识,还考察了对于操作系统提供的内核参数的理解与应用。
小林coding
2020/06/16
1.4K0
推荐阅读
相关推荐
TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档