TCP 连接终止:四次挥手

前提(全程以客户端和服务器为主机双方)

TCP 连接是全双工的,每个方向需独立关闭

即客户端到服务器的通道以及服务器到客户端到通道都需要进行关闭

本质

双工通道的独立关闭,确保数据完整性与资源安全释放。

简化过程

四次挥手步骤

  1. 主动方 FIN → 关闭己方发送通道
  2. 被动方 ACK → 确认关闭请求
  3. 被动方 FIN → 关闭己方发送通道
  4. 主动方 ACK → 确认最终关闭

步骤意义

第一次FIN + 第二次 ACK → 关闭客户端→服务端通道

第三次 FIN + 第四次 ACK → 关闭服务端→客户端通道

每个方向需单独确认(ACK),所以才需要挥手四次

且如果被动关闭方收到 FIN 后,但仍然有数据需要发送,就可以先发送 ACK 确认对方的关闭请求,而被动方的关闭请求可以等数据发送完后再进行发送,去要求关闭己方通道

图示

图以客户端为主动关闭方为例,黄色框为挥手后的状态变化:

为了需要关闭连接,需要在TCP段的段头中设置FIN标志。代表结束信号,FIN=1,和SYN=1、ACK=1的性质一下,代表着信号灯,告诉你这段TCP在干什么。

TCP段里携带的其他关键信息,都在另一篇TCP连接的文章里详细说过了。

相关场景

FIN 洪水攻击

  • 原理 :攻击者伪造 IP 发送大量 FIN,迫使服务端进入 LAST_ACK 状态并等待不存在的 ACK

  • 防御

    • 内核过滤非法 FIN(如校验序列号是否在窗口内)
    • 缩短 LAST_ACK 超时等待时间(Linux 默认 60s → 调至 20s)
相关推荐
ShineWinsu4 小时前
对于C++:auto_ptr、unique_ptr、shared_ptr的模拟实现
c++·面试·笔试·智能指针·unique_ptr·shared_ptr·auto_ptr
黄敬峰6 小时前
一文搞懂 NestJS 后端框架:工厂模式、模块化与装饰器
面试
码匠许师傅8 小时前
【C++ 面试真题】聊聊 C++ 的多继承与虚继承
开发语言·c++·面试
kyriewen8 小时前
面试官说"打开你的AI工具"——我才发现,他考的根本不是写代码
前端·人工智能·面试
众人皆醒我独醉12 小时前
AI 工作负载可观测性:DCGM + Prometheus + Grafana
面试·llm·gpu
西门老铁12 小时前
JWT 是什么?三段式结构、签名原理与 6 个安全坑一次讲透
后端·面试
gyx_这个杀手不太冷静13 小时前
高级前端开发职业规划(2026—2035)
前端·面试·agent
一只叫煤球的猫14 小时前
开个新坑,从头开始完整拆解 Spring AI 2.0 的源码
后端·面试·aigc
浅念-16 小时前
MySQL 索引底层完整详解|磁盘Page|B+树推导|聚簇非聚簇索引|索引SQL操作
大数据·数据库·b树·sql·mysql·面试·职场和发展
众人皆醒我独醉16 小时前
GPU 集群 IaC:Terraform + Ansible 部署自动化
面试·ansible·gpu