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

彻底搞懂TCP三次握手与四次挥手

前言

在计算机网络中,TCP 协议是互联网最核心、最重要的传输层协议。它最大的特点是面向连接、可靠传输、全双工通信。

为了实现“可靠”,TCP 在传输数据前必须建立连接、传输结束后必须断开连接,这就诞生了网络面试最经典的两个过程:

• 三次握手(建立连接)

• 四次挥手(断开连接)

本文从零、通俗、细节全覆盖讲清楚全过程、状态变化、原理、为什么是三次、为什么是四次。
一、TCP 核心基础

1. TCP 是全双工

客户端和服务器各自都有发送通道、接收通道,互不干扰。

• 客户端可以发数据、收数据

• 服务端可以发数据、收数据

正因为双向独立,所以:

• 建连接可以合并报文(三次握手)

• 断连接不能合并报文(必须四次挥手)

2. 关键标志位

• SYN:请求建立连接

• FIN:请求关闭连接

• ACK:确认收到报文
二、TCP 三次握手(建立连接)

1. 全过程详解

第一次握手(客户端 → 服务端:SYN)

客户端主动发起连接,发送 SYN 报文,携带自己的初始序列号 ISN(x)。

• 客户端状态:SYN_SENT

• 作用:客户端测试自己发送能力正常,询问服务端是否在线。

第二次握手(服务端 → 客户端:SYN + ACK)

服务端收到 SYN,确认客户端正常,返回:

1. ACK(x+1):确认收到客户端连接请求

2. SYN(y):服务端也向客户端发起连接请求

• 服务端状态:SYN_RCVD

• 作用:证明服务端收、发能力都正常

第三次握手(客户端 → 服务端:ACK)

客户端收到服务端 SYN+ACK,再次回复确认:ACK(y+1)

• 客户端状态:ESTABLISHED

• 服务端收到后:ESTABLISHED

连接正式建立,可以传输数据!

2. 通俗比喻

• 你:喂听得到吗?(第一次握手 SYN)

• 对方:听得到,你听得见我吗?(第二次 SYN+ACK)

• 你:我也听得到!(第三次 ACK)

通话建立。

3. 为什么是三次握手,不是两次?

核心原因:防止失效连接占用服务器资源

如果只有两次握手:
客户端超时重发的旧过期 SYN到达服务端,服务端直接建立连接、占用资源,但客户端早已断开,造成服务器空连接浪费资源。

三次握手可以双向确认双方收发都正常,杜绝无效连接。
三、TCP 四次挥手(断开连接)

TCP 是全双工,数据通道读、写互相独立。
所以:

• 关闭发送通道 和 关闭接收通道 必须分开执行

• ACK 和 FIN 不能合并,因此必须四次挥手

1. 全过程详解

第一次挥手(客户端 → 服务端:FIN)

客户端数据发送完毕,主动关闭客户端→服务端发送通道。

• 状态:FIN_WAIT_1

第二次挥手(服务端 → 客户端:ACK)

服务端收到关闭请求,回复确认。

• 客户端状态:FIN_WAIT_2

• 此时:客户端不能发数据,但还能收数据
服务端可能还有剩余数据没发完!

第三次挥手(服务端 → 客户端:FIN)

服务端数据全部发送完毕,主动关闭服务端→客户端通道。

• 服务端状态:LAST_ACK

第四次挥手(客户端 → 服务端:ACK)

客户端确认关闭,等待 2MSL 彻底释放连接。

• 服务端收到 ACK:直接断开

• 客户端等待超时后断开

2. 通俗比喻

• 你:我说完了(FIN)

• 对方:收到,我还有点话要说(ACK)

• 对方:我也说完了(FIN)

• 你:好,结束(ACK)

3. 为什么挥手要四次?

握手可以合并 SYN+ACK(新建连接无数据)
挥手存在残留数据:

• 收到关闭请求后,服务端可能还在传数据

• 不能立刻 FIN,必须先发 ACK、传完数据再 FIN

因此ACK 和 FIN 必须分两次发送,总共四次。

4. 为什么客户端最后等待 2MSL?

1. 确保最后一次 ACK 能被服务端收到

2. 防止残留旧报文影响新连接
四、三次握手、四次挥手 核心区别总结

1. 握手三次:建连接、无数据,SYN+ACK 可合并

2. 挥手四次:断连接、存在残余数据,ACK、FIN 不能合并

3. 握手:双向同步序号

4. 挥手:双向分别关闭读写通道
五、面试终极一句话总结

• 三次握手:双向确认收发正常,可靠建立连接

• 四次挥手:双向通道独立关闭,安全释放连接
六、完整流程记忆口诀

握手:问、应答、确认
挥手:我关、我知道、我也关、好的

http://www.jsqmd.com/news/1071521/

相关文章:

  • Python简易网页爬虫|requests+BeautifulSoup实战
  • 深度学习分布式训练
  • 劳动力规划:基于业务发展的人力需求预测
  • HarmonyOS NEXT开发必备:10个提升效率的ArkTS开发技巧
  • Printf可变参数使用
  • 大一下学期C++期末考试复试指南
  • 《全球芯片图鉴》8 锦锐科技
  • 嵌入式DSP开发进阶:掌握LCF预处理与预定义符号,优化内存与缓存配置
  • Java中多线程并发体系知识点汇总
  • Selenium与Playwright对照代码版:工程化自动化选型实战指南
  • VILA视觉大模型INT4量化实战:AWQ技术实现2.9倍推理加速
  • Flask/Jinja2 SSTI漏洞实战:从原理到RCE利用链完整解析
  • MATLAB原生支持Apple Silicon性能评测与迁移实战指南
  • OpenClaw:基于CLI与设备直连的AI工作流中枢
  • MATLAB GUI开发实战:从App Designer入门到独立应用部署
  • OpenClaw卸载指南:npm CLI工具清理全攻略
  • 麻辣龙虾:OpenClaw一键本地智能体安装包实战指南
  • DeepCodex本地中继:实现Codex与DeepSeek协议兼容的技术方案
  • 多智能体系统中的公平性挑战与解决方案
  • 未授权访问漏洞全解析:从原理到实战的24种场景与防御
  • MPC860 SCC以太网控制器:CSMA/CD协议实现与CAM接口应用
  • Burp Suite安装与配置指南:从零搭建Web渗透测试环境
  • Python虚拟环境实战:venv、conda与requirements.txt全解析
  • Windows本地AI开发环境:WSL2+Ubuntu24.04+Ollama+1panel+copaw全链路部署
  • Claude Code Mac安装指南:CLI工具本质与多模型配置实战
  • Windows本地部署飞书数字员工:PowerShell一键启用AI自动化
  • OpenClaw:可编程命令行技能调度器,统一管理网关与CLI自动化
  • MPC860 PCMCIA控制器寄存器详解与中断处理实战
  • MATLAB ODE求解:从醉汉游走到卫星轨道的动态系统建模与仿真
  • Claude Code v2.3.1本地运行Opus 4.8全指南