TCP 三次握手过程分析

TCP(传输控制协议),是一种面向连接的、可靠的、基于字节流的传输层通信协议,它建立起的连接是双向的、对称的。

名词介绍

TCP 有 6 种标识位,SYN: 建立联机,ACK:确认,PSH:传送,FIN:结束,RST:重置,URG:紧急,Sequence number:顺序号码,Acknowledge number:确认号码。

TCP 三次握手的目的

TCP 三次握手是为了建立连接,在这个过程中需要完成两件事:

  1. 确认自己和对方都能发送、接收报文
  2. 把与自己相关的特殊信息发送给对方,比如:报文的初始序列号、发送数据的缓冲区大小,能接收的最大报文段长度等。

TCP 三次握手的流程

下面描述了 TCP 三次握手的流程

第一次握手:主机 A 向主机 B 发送 SYN=1,Seq=x,Sep 是报文的初始序列号。主机 B 通过 SYN=1 得知主机 A 请求建立联机。

第二次握手:主机 B 向主机 A 发送 SYN=1,ACK=1,Sep=y,ACknum=x+1。主机 A 通过 SYN=1 得知主机 B 请求建立联机,通过 ACK=1 得知主机 B 在确认联机,主机 A 检查 ACknum 是否等于 x+1,若等于则进入第三次握手。

第三次握手:主机A 向主机 B 发送 ACK=1,ACknum=y+1。主机 B 通过 ACK=1 得知主机 A 在确认联机,主机 B 检查 ACknum 是否等于 y+1,等于连接建立成功。

完成三次握手,主机 A 与主机 B 开始传送数据。

第一次握手主机 B 接收到报文后,它知道自己能接收报文,主机 A 能发送报文,但是主机 A 对自己的能力一无所知;第二次握手主机 A 接收到报文之后,结合第一次握手发送的报文,它自己能发送报文,接收报文,主机 B 能发送报文,接收报文;第三次握手主机 B 接收到报文后,结合前面两次握手,它知道自己能发送报文,接收报文,主机 A 发送报文,接收报文;

SYN 攻击

SYN 攻击是一种 DoS 攻击,攻击者利用 TCP 协议的缺陷,发送大量的半连接请求,消耗服务器资源,使服务器无法及时处理正常的请求。攻击原理如下:

正常的 TCP 连接要经历三次握手,第一次客户端发送 SYN 标志的数据包,第二次服务端返回一个 SYN/ACK 的应答包,第三次客户端返回一个确认包 ACK,这样才完成 TCP 连接。服务器发出应答包之后将等待客户端响应,直达超时,在等待期间,服务器将半连接状态的请求保存在缓存队列中,如果攻击方发起了大量的 SYN 标志的数据包,并且不响应服务端的 SYN/ACK 的应答包,那么就会使服务端的 TCP 资源迅速耗尽,导致正常的连接不能进入。

SYN 攻击不能完全阻止,除非重新设计 TCP 协议,预防 SYN 攻击的方法如下:

  1. 缩短超时(SYN Timeout)时间
  2. SYN cookies 技术
  3. 通过防火墙、路由器等过滤网关防护
相关推荐
IT_陈寒1 小时前
Java中equals方法比了个寂寞?原来这才是正确的重写姿势
前端·人工智能·后端
默_笙1 小时前
🚓 分诊台与拆题术:让 RAG 学会判断和规划
前端·javascript
CopyCode1 小时前
用 AI 迁项目有多爽?我把 Webpack 迁 Vite 的全过程记下来了
前端·架构
去伪存真1 小时前
Electron 自动化发布指南:GitHub Actions 跨平台打包全纪录
前端·electron
计算机魔术师1 小时前
OpenAI智能体失控闯进美国政府网站,53张用户图片外泄背后
前端
颜进强1 小时前
14 · NestJS ExecutionContext 执行上下文:守卫、拦截器、过滤器拿到的"同一个 context",为什么能力不一样?
前端·后端·ai编程
程序员Flycan1 小时前
🚀 跨域终结者:前端代理服务器(Proxy)原理解析与配置总结
前端
怕浪猫1 小时前
顶级模型一句话,AI 写出了能玩的 QQ飞车
前端·面试·github
huakoh1 小时前
MCP 报错分不清?先看响应里是 result 还是 error
前端
呃呃呃呃ex1 小时前
10. 现代前端工程化:ES6 React 项目实战与原理解析
前端·javascript