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

TCP三次握手过程详解

三次握手过程:

在这里插入图片描述

客户端视角:

1.客户端调用connect,开启计时器,发送SYN包,如果重传超时,认为连接失败

2.如果收到服务端的ACK,则进入ESTABLISHED状态

3.清除重传计时器,发送ACK,开启保活计时器:如果再次收到ACK+SYN说明服务端没收到第三次握手包,进行了重传,此时客户端会重传ACK

注意:由于客户端在第二次握手成功后已经进入ESTABLISHED状态,认为连接已经建立,但如果第三次握手包ACK丢失,且服务端一直未能收到ACK(服务端重传包丢失,或客户端收到重传包但ACK仍丢失),服务端会因为重传次数上限而认为连接失败,重新进入listen,那么此时是一种半连接,客户端发送数据会失败

服务端视角:

1.listen()创建半连接队列和全连接队列

2.收到SYN包,如果半连接队列已满,丢弃该连接,否则为该连接创建一个socket加入到半连接队列中

3.回复SYN-ACK包,开启重传计时器

4.等待ACK,没有收到则重传SYN-ACK,重传上限后,认为连接失败,清除socket,回到listen状态

5.如果收到ACK,则进入ESTABLISHED状态

防御SYN泛洪攻击:

1. SYN Cookies

SYN Cookies是一种在服务器端防止SYN泛洪攻击的技术。当服务器收到SYN请求时,不直接为其分配资源,而是通过计算一种特殊的加密散列值(称为SYN Cookie)来生成一个SYN-ACK报文的序列号,发送给客户端。只有当客户端回应ACK时,服务器才真正为连接分配资源,并通过验证ACK中的序列号来确认连接的合法性。

  • 优点:不需要维护大量的半连接状态,可以有效防止队列溢出。
  • 缺点:可能会增加服务器的计算负担,并且在某些情况下(如选择确认SACK的使用)限制了TCP的功能。

2. 增加半连接队列的大小

通过增大服务器的半连接队列(backlog)大小,可以增加服务器在短时间内能够处理的未完成连接的数量,从而在一定程度上缓解SYN泛洪攻击的影响。

  • 优点:简单有效,能够承受更大规模的攻击。
  • 缺点:只是暂时缓解,当攻击流量进一步增加时,效果有限。

3. 减少SYN-ACK重传次数

服务器可以通过减少SYN-ACK的重传次数和降低重传的超时时间来应对SYN泛洪攻击。这样可以减少半连接队列中停留时间过长的连接,从而尽快释放资源。

  • 优点:快速清理无效连接。
  • 缺点:可能会对网络条件较差的合法连接造成影响。

4. 启用防火墙或入侵检测系统(IDS/IPS)

防火墙和入侵检测系统可以检测并过滤掉异常的流量,从而在流量进入服务器之前将其拦截。

  • 优点:可以在网络层或传输层提前处理攻击,减少服务器的负担。
  • 缺点:配置和维护复杂,且可能存在误判的情况。

5. IP黑名单

通过检测和识别恶意IP,将其加入黑名单,阻止这些IP发送的SYN请求。

  • 优点:直接阻断恶意流量。
  • 缺点:难以应对分布式攻击(DDoS),并且误判风险较高。

6. 负载均衡和分布式架构

通过部署负载均衡器,将流量分散到多个服务器或分布式系统中,可以减轻单个服务器的负载压力,从而提高整体抗攻击能力。

  • 优点:提高了系统的整体可用性和抗攻击能力。
  • 缺点:需要额外的硬件或架构调整,增加了系统复杂性。

7. 速率限制(Rate Limiting)

可以配置服务器或网络设备对单个IP地址的SYN请求进行速率限制,防止单个IP地址在短时间内发送过多的连接请求。

  • 优点:有效限制攻击者的请求速率。
  • 缺点:可能影响到合法用户的正常请求,特别是在高并发情况下。

IP地址在短时间内发送过多的连接请求。

  • 优点:有效限制攻击者的请求速率。
  • 缺点:可能影响到合法用户的正常请求,特别是在高并发情况下。

推荐学习 https://xxetb.xetslk.com/s/p5Ibb

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Shell编程规范与变量:详解环境变量、位置变量与预定义变量
  • Java 入门指南:Java IO流 —— 序列化与反序列化
  • centos7 xtrabackup mysql(8)压缩 全量备份 还原(4)
  • 加速网络体验,Squid缓存代理:让浏览如飞,畅享无限网络速度!
  • 计算机专业的真正的就业情况
  • C语言 | Leetcode C语言题解之第375题猜数字大小II
  • 02-03:原理图与PCB交互以及快速模块化
  • E - Red Polyomino 关于回溯 和爆搜
  • 入门STM32--按键输入
  • 排队辅助功能二手车,全速自适应巡航
  • 适应CLIP作为图像去雾的聚合指导
  • 现在的ai是否和当年的5g一样被夸大了
  • 大模型日报 2024-08-24
  • 初识数据库
  • PG_RMAN 部署与使用
  • Android交互
  • Angular Elements 及其运作原理
  • C# 免费离线人脸识别 2.0 Demo
  • happypack两次报错的问题
  • java多线程
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JS字符串转数字方法总结
  • Just for fun——迅速写完快速排序
  • KMP算法及优化
  • MobX
  • ReactNativeweexDeviceOne对比
  • Redash本地开发环境搭建
  • Spring声明式事务管理之一:五大属性分析
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 京东美团研发面经
  • 力扣(LeetCode)56
  • 如何利用MongoDB打造TOP榜小程序
  • 一些css基础学习笔记
  • - 转 Ext2.0 form使用实例
  • 白色的风信子
  • Java性能优化之JVM GC(垃圾回收机制)
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (Forward) Music Player: From UI Proposal to Code
  • (翻译)terry crowley: 写给程序员
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)可以带来幸福的一本书
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • **PHP二维数组遍历时同时赋值
  • ..回顾17,展望18
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .bat批处理出现中文乱码的情况
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET分布式缓存Memcached从入门到实战
  • .NET中使用Redis (二)
  • /bin/rm: 参数列表过长"的解决办法
  • ::前边啥也没有