连接|TCP半连接队列和全连接队列满了,怎么破( 三 )
文章图片
当服务端受到SYN攻击后,连接服务端ssh就会断开了,无法再连上。只能在服务端主机上执行查看当前TCP半连接队列大小:同时,还可以通过netstat-s观察半连接队列溢出的情况:
文章图片
上面输出的数值是累计值,表示共有多少个TCP连接因为半连接队列溢出而被丢弃。隔几秒执行几次,如果有上升的趋势,说明当前存在半连接队列溢出的现象。3、大部分人都说tcp_max_syn_backlog是指定半连接队列的大小,是真的吗?
很遗憾,半连接队列的大小并不单单只跟tcp_max_syn_backlog有关系。
上面模拟SYN攻击场景时,服务端的tcp_max_syn_backlog的默认值如下:
但是在测试的时候发现,服务端最多只有256个半连接队列,而不是512,所以半连接队列的最大长度不一定由tcp_max_syn_backlog值决定的。
4、走进Linux内核的源码,来分析TCP半连接队列的最大值是如何决定的。
TCP第一次握手(收到SYN包)的Linux内核代码如下,其中缩减了大量的代码,只需要重点关注TCP半连接队列溢出的处理逻辑:
文章图片
从源码中,我可以得出共有三个条件因队列长度的关系而被丢弃的:
文章图片
如果半连接队列满了,并且没有开启tcp_syncookies,则会丢弃;若全连接队列满了,且没有重传SYN+ACK包的连接请求多于1个,则会丢弃;
如果没有开启tcp_syncookies,并且max_syn_backlog减去当前半连接队列长度小于(max_syn_backlog>>2),则会丢弃;
关于tcp_syncookies的设置,后面在详细说明,可以先给大家说一下,开启tcp_syncookies是缓解SYN攻击其中一个手段。
接下来,我们继续跟一下检测半连接队列是否满的函数inet_csk_reqsk_queue_is_full和检测全连接队列是否满的函数sk_acceptq_is_full:
文章图片
从上面源码,可以得知:全连接队列的最大值是sk_max_ack_backlog变量,sk_max_ack_backlog实际上是在listen()源码里指定的,也就是min(somaxconn,backlog);
半连接队列的最大值是max_qlen_log变量,max_qlen_log是在哪指定的呢?现在暂时还不知道,我们继续跟进;
我们继续跟进代码,看一下是哪里初始化了半连接队列的最大值max_qlen_log:
文章图片
从上面的代码中,我们可以算出max_qlen_log是8,于是代入到检测半连接队列是否满的函数reqsk_queue_is_full:
文章图片
也就是qlen>>8什么时候为1就代表半连接队列满了。这计算并不难,很明显是当qlen为256时,256>>8=1。至此,总算知道为什么上面模拟测试SYN攻击的时候,服务端处于SYN_RECV连接最大只有256个。
可见,半连接队列最大值不是单单由max_syn_backlog决定,还跟somaxconn和backlog有关系。
在Linux2.6.32内核版本,它们之间的关系,总体可以概况为:
文章图片
当max_syn_backlog>min(somaxconn,backlog)时,半连接队列最大值max_qlen_log=min(somaxconn,backlog)*2;当max_syn_backlog
5、半连接队列最大值max_qlen_log就表示服务端处于SYN_REVC状态的最大个数吗?
依然很遗憾,并不是。
max_qlen_log是理论半连接队列最大值,并不一定代表服务端处于SYN_REVC状态的最大个数。
在前面我们在分析TCP第一次握手(收到SYN包)时会被丢弃的三种条件:
如果半连接队列满了,并且没有开启tcp_syncookies,则会丢弃;
若全连接队列满了,且没有重传SYN+ACK包的连接请求多于1个,则会丢弃;
如果没有开启tcp_syncookies,并且max_syn_backlog减去当前半连接队列长度小于(max_syn_backlog>>2),则会丢弃;
假设条件1当前半连接队列的长度「没有超过」理论的半连接队列最大值max_qlen_log,那么如果条件3成立,则依然会丢弃SYN包,也就会使得服务端处于SYN_REVC状态的最大个数不会是理论值max_qlen_log。
似乎很难理解,我们继续接着做实验,实验见真知。
服务端环境如下:
配置完后,服务端要重启Nginx,因为全连接队列最大和半连接队列最大值是在listen()函数初始化。
根据前面的源码分析,我们可以计算出半连接队列max_qlen_log的最大值为256:
推荐阅读
- AI|马斯克公布最新"脑机"Neuralink 大脑与电脑连接更进一步
- 新浪科技综合@马斯克公布最新"脑机"Neuralink:"大脑与电脑连接"更进一步新浪科技综合2020-08-29 07:57:060阅
- 大西洋|白令海峡大桥: 跨度仅80公里, 却能连接世界90%人口, 为何不建?
- 千金|她被王思聪挖掘,却被喷富家千金走后门,如今连接两部戏打脸观众
- 工程师|高级Linux运维工程师养成记-如何远程连接Linux
- ZER|从七夕“主创闺蜜夜”看《他爱》如何用价值观连接品牌与用户
- 最新消息|爱立信与联合国儿童基金会合作绘制学校连接图 以缩小数字鸿沟
- Panasonic|松下推出新款智能电动牙刷 可连接手机学习口腔护理
- 「新浪数码」松下推出新款智能电动牙刷 可连接手机学习口腔护理新浪数码2020-08-26 09:33:460阅
- 爱惜羽毛|现在明星只想捞快钱?邓伦连接近十部综艺节目,粉丝呼唤爱惜羽毛
