TCP - 半连接队列和全连接队列

目录

一、半连接队列和全连接队列的概念

二、全连接队列溢出

三、半连接队列溢出


一、半连接队列和全连接队列的概念

  1. 半连接队列:服务端收到客户端发送的 SYN 包时,内核会将该连接加入半连接 SYN 队列,并向客户端返回响应

  2. 全连接队列:服务端收到客户端发送的 ACK + SYN 包时,会从半连接队列中移除该连接,创建一个新的完全连接,加入全连接 accept 队列,等待进程调用 accept 函数取出全连接

二、全连接队列溢出

  1. 查看全连接队列情况:ss 命令
  • Recv-Q:当前全连接队列的大小
  • Send-Q:允许的全连接队列最大大小
  1. 全连接队列溢出:大量请求打到服务器,如果请求数量超过 TCP 全连接队列的大小,就会丢弃后面的连接(默认策略,可以修改策略为向客户端发送 RST 复位报文,告诉客户端连接建立失败),导致服务器请求数量上不去

  2. 查看全连接队列是否溢出:netstat -s 可以查看丢掉的 TCP 连接,如果丢弃数量在变大说明某段时间内发生了全连接队列溢出(是个累计值,不是大于 0 就代表当前全连接队列溢出了,持续变大有上升趋势才能说明溢出,半连接队列查看溢出情况也是如此)

  3. 调大全连接队列的大小:修改 Linux 内核参数 somaxconn 和 backlog(全连接队列大小是两者的最小值)

  4. 丢弃策略

  • tcp_abort_on_overflow = 0:丢弃连接,客户端会重发带有 ACK 的请求,收不到服务端的 ACK 就会重发,如果服务端只是暂时繁忙,忙完就会收到大量客户端重发的带有 ACK 的请求,还可以继续处理(全连接队列有空位时),继续建立完全连接
  • tcp_abort_on_overflow = 1:给客户端响应 RST 复位报文,报告连接建立失败,只有肯定全连接队列会长时间溢出时才将策略设置为 1,尽快通知客户端,否则就 设置为 0,可以增大连接建立的成功率

三、半连接队列溢出

  1. 查看半连接队列情况:没有命令可以直接查看,但是可以通过查看服务端处于 SYN_RECV 状态的 TCP 连接,就是 TCP 的半连接数量

  2. 半连接队列溢出:客户端发送大量 SYN 请求,但是一直不回复 ACK,服务端就会出现大量处于 SYN_RECV 的 TCP 导致半连接队列溢出,无法处理后续的正常的请求,也就是SYN 洪泛、SYN 攻击、DDos 攻击

  3. 调大半连接队列的大小 TODO

4. 如何防止洪泛攻击?

  • 增大半连接队列:同时增大全连接队列,因为半连接队列的大小会受到全连接的队列大小的影响(半连接队列的大小具体要看源码)
  • 开启 tcp_syncookies 功能,在发生溢出时不会丢弃连接,而是根据 syncookies 判断连接是否建立成功
  • 减少 SYN+ACK 重传次数:收到 SYN 攻击时,就会有大量处于 SYN_RECV 状态的 TCP 连接,处于这个状态的 TCP 连接会重传 SYN+ACK 报文,当重传次数达到上限就会断开连接,减少重传次数,加快断开连接的速度
相关推荐
白狐_798几秒前
网络基础核心问题深度解析:从IP/MAC到IPv6与路由配置
网络·tcp/ip·macos
板鸭〈小号〉3 分钟前
应用层协议 HTTP
网络·网络协议·http
SoleMotive.6 分钟前
1、nginx反向代理了解吗?怎么配置nginx服务器?nginx负载均衡的算法都有哪些? 2、后端服务器宕机了,nginx服务器是怎么检查的
服务器·nginx·负载均衡
陶庵看雪9 分钟前
服务器纳管:核心概念与全流程解析
运维·服务器
xuanzdhc12 分钟前
Gitgit
java·linux·运维·服务器·c++·git
laocooon52385788618 分钟前
win下制作一个简单的Cmake,完成运行效果
linux·运维·服务器
北顾南栀倾寒25 分钟前
[杂学笔记]HTTP与HTTPS的区别、HTTPS进行TLS握手的过程、HTTPS如何防止中间人攻击、HTTP1.1与HTTP2.0的区别、TCP的拥塞控制
linux·服务器
拾忆,想起33 分钟前
Dubbo服务超时与重试策略配置指南:构建 resilient 微服务架构
服务器·网络·微服务·云原生·架构·dubbo
yuanjj8840 分钟前
域格移芯平台模块FTP下载应用
单片机·物联网·网络协议
MarkHD40 分钟前
车辆TBOX科普 第28次 AT命令集与移动通信技术入门:从基础到4G/5G网络详解
网络·5g