news 2026/5/13 20:08:53

一文给你讲清楚什么是三次握手、四次挥手!小白也能秒懂

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一文给你讲清楚什么是三次握手、四次挥手!小白也能秒懂

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!

在开发 Spring Boot 应用时,你是否遇到过这些问题:

  • 为什么服务刚启动就收到大量连接请求?
  • 为什么高并发下出现TIME_WAIT占满端口?
  • 面试官问:“TCP 建立连接为什么是三次,不是两次或四次?”

这些问题的背后,都藏着一个关键知识点:TCP 的三次握手与四次挥手

今天,我们就用生活化比喻 + Java 代码演示 + 反例分析,彻底搞懂这个网络核心机制!


🧩 一、为什么需要“握手”和“挥手”?

想象你打电话给朋友:

  • 拨号 → 对方接听 → 你说“喂,听得见吗?” → 对方回“听得见!”
    → 这才确认双方都能说话(建立连接)。

  • 聊完后,你说“挂了啊” → 对方说“好” → 你挂电话 → 对方也挂
    → 确保双方都同意结束(断开连接)。

TCP 就是这样一种“严谨的通信协议”,它通过三次握手建立连接四次挥手断开连接,确保数据传输的可靠性


🔁 二、三次握手(Three-Way Handshake)—— 建立连接

✅ 正确流程(客户端 → 服务端)

步骤发送方动作标志位
1客户端发送 SYNSYN=1, seq=x
2服务端回复 SYN+ACKSYN=1, ACK=1, seq=y, ack=x+1
3客户端发送 ACKACK=1, seq=x+1, ack=y+1

✅ 此时连接建立成功,双方可开始传输数据。

🎯 为什么必须是三次?两次行不行?

反例:如果只有两次握手

  • 客户端发送 SYN;
  • 服务端收到后直接认为连接建立,开始发数据;
  • 但客户端可能根本没收到 SYN-ACK(网络丢包)
  • 结果:服务端一直在发数据,客户端却不知道连接存在 →资源浪费 + 数据丢失

🔑 三次握手的核心目的:让双方都确认对方的发送和接收能力正常


🚪 三、四次挥手(Four-Way Wavehand)—— 断开连接

TCP 是全双工的,意味着 A→B 和 B→A 可以同时传数据。所以断开时,每个方向都要单独关闭

✅ 正确流程

步骤发送方动作状态变化
1客户端发送 FIN进入FIN_WAIT_1
2服务端回复 ACK进入CLOSE_WAIT
3服务端发送 FIN(等应用层处理完)进入LAST_ACK
4客户端回复 ACK进入TIME_WAIT(等待 2MSL 后关闭)

⚠️ 注意:步骤2和3不能合并!因为服务端可能还有数据要发。

❓ 为什么挥手要四次,而握手只要三次?

  • 握手时,服务端可以把 SYN 和 ACK 合并在一个包里发(因为刚启动,无数据要发);
  • 挥手时,服务端收到 FIN 后,应用层可能还在处理数据,不能立刻发 FIN,必须等业务逻辑完成 → 所以 ACK 和 FIN 要分开。

💻 四、Spring Boot 中如何观察三次握手 & 四次挥手?

虽然 Spring Boot 默认屏蔽了底层细节,但我们可以通过Socket 编程模拟连接过程。

示例:用 Java 写一个简易 TCP 服务端/客户端

服务端(模拟握手/挥手)
// TcpServer.java public class TcpServer { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(8080); System.out.println("服务端启动,等待连接..."); Socket client = server.accept(); // ← 这里完成三次握手! System.out.println("客户端已连接"); BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out = new PrintWriter(client.getOutputStream(), true); String msg; while ((msg = in.readLine()) != null) { System.out.println("收到: " + msg); out.println("Echo: " + msg); } // 客户端关闭后,这里会退出循环 client.close(); // ← 触发四次挥手 server.close(); } }
客户端
// TcpClient.java public class TcpClient { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 8080); // ← 发起三次握手 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out.println("Hello Server!"); System.out.println("收到回复: " + in.readLine()); socket.close(); // ← 发起四次挥手 } }

🔍 运行后,你可以在 Wireshark 或netstat -an | grep 8080中看到ESTABLISHEDTIME_WAIT等状态!


❌ 五、常见反例 & 误区

反例1:服务端未正确关闭连接 → 大量CLOSE_WAIT

// 错误代码:只关输入流,不关 Socket BufferedReader in = new BufferedReader(...); in.close(); // ❌ 这不会触发 FIN! // Socket 一直保持 CLOSE_WAIT,最终耗尽文件描述符!

✅ 正确做法:

socket.close(); // 必须关闭整个 Socket!

反例2:客户端快速重连 →TIME_WAIT占满端口

  • 客户端频繁连接/断开(如压测工具);
  • 每次断开后进入TIME_WAIT(默认 60 秒);
  • 本地端口被占满,无法新建连接。

✅ 解决方案:

  • 服务端主动关闭连接(让服务端进入TIME_WAIT,客户端端口多);
  • 调整内核参数(Linux):
    net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30

⚠️ 六、注意事项

问题说明
SYN Flood 攻击攻击者只发 SYN 不完成握手,耗尽服务端资源 → 需开启 SYN Cookie 防护
2MSL 是什么?TIME_WAIT等待 2 倍最大段生命周期(约 60 秒),防止旧数据包干扰新连接
HTTP 是短连接?HTTP/1.1 默认keep-alive,其实是复用 TCP 连接,避免频繁握手
WebSocket 呢?建立时用 HTTP Upgrade,之后走 TCP 长连接,挥手仍需四次

✅ 七、总结:一张图记住核心

三次握手(建连): Client --SYN--> Server Client <--SYN+ACK-- Server Client --ACK--> Server → 连接建立! 四次挥手(断连): Client --FIN--> Server Client <--ACK-- Server Client <--FIN-- Server Client --ACK--> Server → 连接关闭!(Client 进入 TIME_WAIT)

💡 记住口诀:
“三次握手防失效,四次挥手因双工”


视频看了几百小时还迷糊?关注我,几分钟让你秒懂!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 19:42:36

Transformer 大模型架构深度解析(4)详解 Transformer 架构

目录 文章目录目录Transformer 架构Input EmbeddingPositional EncodingEncoder软对齐注意力的思想词向量相似度的计算方法Scaled Dot-Product AttentionSelf-AttentionMulti-Head Attention&#xff08;Self-Attention&#xff09;Feed Forward Neural NetworkResidual Connec…

作者头像 李华
网站建设 2026/5/13 1:08:34

‌别再手动对比日志了!AI日志分析工具实测TOP3

软件测试中的日志分析痛点‌ 在软件测试工作中&#xff0c;日志分析是核心环节&#xff0c;涉及错误追踪、性能监控和测试报告生成。传统手动方法耗时耗力&#xff1a;测试工程师需逐行比对日志文件&#xff0c;识别异常模式&#xff0c;平均每个项目消耗20-30小时。常见问题包…

作者头像 李华
网站建设 2026/5/12 8:34:31

基于Vue的数字图书馆设计与开发793m5(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末

系统程序文件列表 系统功能 用户,图书类别,图书信息 开题报告内容 一、 课题背景、研究目的与意义 1. 课题背景 随着信息技术的高速发展和数字化转型的深入推进&#xff0c;传统图书馆的服务模式面临诸多挑战&#xff1a;空间限制导致藏书容量有限&#xff0c;纸质资源易损…

作者头像 李华
网站建设 2026/5/7 4:58:59

基于spring boot的调查问卷系统的设计与实现(源码+论文+部署+安装)

感兴趣的可以先收藏起来&#xff0c;还有在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望可以帮到大家。一、程序背景在当前信息化快速发展的大环境下&#xff0c;传统纸质问卷调查存在效率低下、成本高昂、地域…

作者头像 李华
网站建设 2026/5/6 4:13:21

为什么你的测试覆盖率是“静态的”?因为你没做“动态分析”

覆盖率指标的迷思 在软件测试领域&#xff0c;测试覆盖率常被视为质量保证的黄金标准&#xff0c;但许多团队发现&#xff0c;即使覆盖率数字高达90%&#xff0c;上线后仍频发缺陷。这种矛盾源于覆盖率指标的“静态化”——它仅反映代码被扫描的比例&#xff0c;却忽略运行时行…

作者头像 李华
网站建设 2026/5/9 19:08:32

NetApp数据平台助力Super Bowl LX实现高效数据运营

智能数据基础设施全面赋能Levi’s Stadium&#xff0c;显著提升球迷观赛体验 NetApp&#xff08;NASDAQ&#xff1a;NTAP&#xff09;智能数据基础设施公司今日宣布&#xff0c;其正为Super Bowl LX提供数据运营支持。作为旧金山49人队及美国国家橄榄球联盟&#xff08;NFL&…

作者头像 李华