• TCP/IP(六)TCP的连接管理(三)


    一  连接和连接

    内容参考小林coding

    说明: 普通'中小'厂不会问的这么'深',这么'细',但是当'性能调优'阶段必须掌握'原理'

    ①  内容提纲

    ②  概念

    说明: '半连接'只是一个'中间'状态

    ②  图谱

    二  半连接

    ①  查看 TCP 半连接队列长度

    1. root '用户' 执行 --> netstat -antp | grep SYN_RECV | wc -l
    2. 说明: 系统'不繁忙'的话一般结果是'0'

    ②   增大 TCP 半连接队列

    nginx TCP backlog 分析优化和性能相关经验汇总

    ③   模拟 TCP 半连接队列溢出场景

    DDOS概念

    ④  ddos攻击时现象

    ⑤  使用 hping3 工具模拟 SYN 攻击

    背景: 本次'模拟实验'假定是'没有'开启 tcp_syncookies

    步骤'1': Centos7.7通过'epel'源安装hping3 '仿真'工具

    步骤'2': 客户端使用'hping3'工具'模拟'SYN攻击

    ⑥  服务端观察

    观察1: 此时'半连接'队列的大小

    1. 观察'2': 通过 netstat -s 观察'半连接队列溢出'的情况,也即'溢出 drop'了多少
    2. netstat -s | grep "SYNs to LISTEN"

    1. 推荐: watch '持续' 观察
    2. '几秒'执行几次,如果有'上升'的趋势,说明当前存在'半连接队列溢出'的现象

    ⑦  哪些因素影响半连接队列的大小  探究1

    纠正'误区'1: tcp_max_syn_backlog '不是' 半连接队列大小

    内核 tcp_ipv4.c 代码中 TCP 半连接队列溢出的处理逻辑

    强调: 以下'3'种场景触发'都''SYN'报文丢弃

     Linux '2.6.32' 内核版本, 'max_syn_backlog''somaxconn''backlog' 三者的关系

    ⑧  处于 SYN_RECV 状态的最大个数不是理论值 max_qlen_log

    ⑨  原因探究

    说明: 该探究接上'⑧'

    根据'前面的源码'分析,我们可以计算出'半连接队列' max_qlen_log 的最大值为 '256'

    1. 操作1: 客户端执行 hping3 发起 'SYN' 攻击
    2. hping3 -S -p 8080 --flood 192.168.3.200
    3. 操作2: 服务端执行'如下命令'查看处于 'SYN_RECV' 状态的'最大'个数
    4. netstat -antp | grep SYN_RECV | wc -l

    分析'条件3'产生'193'的原因

    '小结'

    ⑩  如果 SYN 半连接队列已满,只能丢弃连接吗?

    1. 内核参数: /proc/sys/net/ipv4/tcp_syncookies '0''1''2' 含义
    2. '开启' syncookies 功能就可以在'不使用 SYN 半连接队列'的情况下'成功'建立连接

    三   如何防御 SYN 攻击?

    ①  什么是半连接SYN攻击

    DDOS攻击概念

    ②  半连接和全连接队列正常工作流程

    Linux 内核的 SYN 队列 '半连接队列'与 Accpet 队列'全连接队列''如何'工作的

    ③  避免 SYN 攻击四种方式

    1. 方式'1': 调大 netdev_max_backlog
    2. 备注: 这个'基本'没有'听说过',也'未'经验证,先做'记录'

    1. 方式'2': 增大 TCP '半连接'队列
    2. 条件: '不开启' net.ipv4.tcp_syncookies前提下

    具体细节见上

    方式'3''开启' net.ipv4.tcp_syncookies

    1. 方式'4': 减少 'SYN+ACK' 重传次数
    2. 内核参数: tcp_synack_retries

    ④   答疑解惑

    思考: 'syncookies 1 启用'后就不需要半链接了?那'请求的数据'会存在哪里?

  • 相关阅读:
    【AI视野·今日Robot 机器人论文速览 第五十九期】Fri, 20 Oct 2023
    三、GoLang字符串的基本操作
    实现动态业务规则的方法(Java)
    北工大汇编——子程序设计
    开学季好物推荐!这些优秀的产品值得一买
    SkyEye助力火箭“一”飞冲天
    java毕业设计球馆预约管理系统mybatis+源码+调试部署+系统+数据库+lw
    随机数Random
    【*E】leetcode-069.x的平方根
    Docker② —— Cgroups详解
  • 原文地址:https://blog.csdn.net/wzj_110/article/details/133748465