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)
相关推荐
怕什么真理无穷9 小时前
C++面试4-线程同步
java·c++·面试
拉不动的猪12 小时前
# 关于初学者对于JS异步编程十大误区
前端·javascript·面试
熊猫钓鱼>_>14 小时前
Java面向对象核心面试技术考点深度解析
java·开发语言·面试·面向对象··class·oop
进击的野人16 小时前
CSS选择器与层叠机制
css·面试
T___T19 小时前
全方位解释 JavaScript 执行机制(从底层到实战)
前端·面试
9号达人19 小时前
普通公司对账系统的现实困境与解决方案
java·后端·面试
勤劳打代码19 小时前
条分缕析 —— 通过 Demo 深入浅出 Provider 原理
flutter·面试·dart
努力学算法的蒟蒻19 小时前
day10(11.7)——leetcode面试经典150
面试
进击的野人20 小时前
JavaScript 中的数组映射方法与面向对象特性深度解析
javascript·面试
南山安20 小时前
以腾讯面试题深度剖析JavaScript:从数组map方法到面向对象本质
javascript·面试