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

【Java 开发日记】我们来说一下 TCP 的三次握手四次挥手过程

【Java 开发日记】TCP 三次握手与四次挥手详解

在 Java 开发中,我们经常使用 Socket、Netty、Spring WebFlux、Dubbo、Kafka、Redis 等网络通信框架,这些底层都依赖 TCP 协议。所以理解TCP 的三次握手和四次挥手是网络编程的基础,也是面试中出现频率极高的知识点。

下面用最清晰的方式,把过程、状态、目的、常见问题全部讲透。

1. TCP 三次握手(建立连接)

目的
双方互相确认对方的发送能力和接收能力都正常,确保连接是可靠的、双向的。

三次握手的本质

  • 确认双方的初始序列号(ISN)
  • 确认双方的接收窗口大小(可选)
  • 确认对方处于可接收数据的状态

流程图解(经典三步):

客户端 服务端 | | | SYN (seq=x) | ← 第一次握手 |───────────────────►| | | | SYN+ACK (seq=y, ack=x+1) ← 第二次握手 |◄───────────────────| | | | ACK (ack=y+1) | ← 第三次握手 |───────────────────►| | | ▼ ▼ 已建立连接 已建立连接

每一步详细说明

  1. 第一次握手(客户端 → 服务端)
    客户端发送SYN包(SYN=1),同时附带一个初始序列号 seq = x
    状态变化:客户端进入SYN_SENT状态

  2. 第二次握手(服务端 → 客户端)
    服务端收到 SYN 后,回复SYN + ACK

    • SYN=1(我也想建立连接)
    • ACK=1(确认收到你的 SYN)
    • ack = x + 1(确认收到你发的 seq=x)
    • seq = y(服务端自己的初始序列号)
      状态变化:服务端进入SYN_RCVD状态
  3. 第三次握手(客户端 → 服务端)
    客户端收到 SYN+ACK 后,回复ACK

    • ACK=1
    • ack = y + 1
    • seq = x + 1
      状态变化:客户端进入ESTABLISHED状态
      服务端收到 ACK 后也进入ESTABLISHED状态

为什么是三次而不是两次?

如果只有两次:

  • 客户端发 SYN → 服务端回 SYN+ACK
  • 如果第二次的 SYN+ACK 丢包了,客户端会重传 SYN,但服务端已经认为连接建立了(浪费资源)
  • 三次握手可以让服务端确认客户端的接收能力正常

常见面试追问

  • 为什么客户端最后还要发一次 ACK?
    → 为了让服务端确认客户端确实收到了服务端的 SYN(防止已失效的连接请求)

2. TCP 四次挥手(断开连接)

目的
双方都确认对方不再发送数据,安全关闭连接,释放资源。

四次挥手流程(经典四步):

主动关闭方(通常客户端) 被动关闭方(通常服务端) | | | FIN (seq=u) | ← 第一次挥手 |─────────────────────────►| | | | ACK (ack=u+1) | ← 第二次挥手 |◄─────────────────────────| | | | | (服务端可能还有数据要发) | | | FIN (seq=v) | ← 第三次挥手 |◄─────────────────────────| | | | ACK (ack=v+1) | ← 第四次挥手 |─────────────────────────►| | | ▼ ▼ TIME_WAIT CLOSED

每一步详细说明

  1. 第一次挥手(主动方 → 被动方)
    主动方发送FIN(FIN=1,seq=u),表示“我没有数据要发了”
    主动方进入FIN_WAIT_1状态

  2. 第二次挥手(被动方 → 主动方)
    被动方回复ACK(ack = u+1),表示“我收到你的 FIN 了”
    被动方进入CLOSE_WAIT状态
    主动方收到 ACK 后进入FIN_WAIT_2状态
    此时连接处于半关闭状态(被动方还能继续发数据)

  3. 第三次挥手(被动方 → 主动方)
    被动方发完剩余数据后,发送FIN(seq=v),表示“我也没数据要发了”
    被动方进入LAST_ACK状态

  4. 第四次挥手(主动方 → 被动方)
    主动方回复ACK(ack = v+1),表示“我收到你的 FIN 了”
    主动方进入TIME_WAIT状态
    被动方收到 ACK 后直接进入CLOSED状态

为什么是四次而不是三次?

因为 TCP 是全双工通信,双方都可能有数据要发。
当一方说“我发完了”(FIN)后,另一方可能还有数据没发完,所以需要先回复 ACK(确认收到 FIN),等自己数据发完后再发 FIN。

3. 重要状态与时间

状态含义常见持续时间 / 注意事项
SYN_SENT已发送 SYN,正在等待 SYN-ACK
SYN_RCVD已收到 SYN,已发送 SYN-ACK
ESTABLISHED连接正常建立,可传输数据
FIN_WAIT_1已发送 FIN,等待对方 ACK
FIN_WAIT_2已收到对方 ACK,等待对方 FIN
CLOSE_WAIT收到 FIN,已发送 ACK(半关闭)应用程序未关闭 socket 时会长时间停留
LAST_ACK已发送 FIN,等待最后 ACK
TIME_WAIT收到最后 ACK,等待 2MSL最重要,持续时间通常 30s–4min(视系统)
CLOSED连接完全关闭

TIME_WAIT 存在的两大原因(面试必问):

  1. 确保最后一次 ACK 能到达对方(防止被动方没收到 ACK 而一直重发 FIN)
  2. 防止旧连接的延迟包干扰新连接(2MSL 时间内同一端口的旧包都会失效)

4. Java 开发中常见相关问题

  • TIME_WAIT 过多→ 导致端口耗尽
    解决:调大net.ipv4.ip_local_port_range、开启tcp_tw_reuse/tcp_tw_recycle(慎用)、使用连接池

  • CLOSE_WAIT 堆积→ 说明服务端应用层没有及时 close socket
    常见于:读取到 -1(EOF)后没有关闭流、异常处理不当

  • Netty / Spring 中长连接管理 → 心跳 + 空闲检测 + 主动关闭

小结口诀

三次握手:我要、你也要、我确认你也要
四次挥手:我好了、知道了(你继续发)、我也好了、知道了

希望这篇把 TCP 连接建立与断开的本质讲清楚了。

如果你想继续深入某个点,比如:

  • TIME_WAIT 过多如何解决(参数调优)
  • 半连接队列 / 全连接队列 / backlog
  • TCP 粘包/拆包问题(Netty 如何解决)
  • TCP 与 UDP 对比
  • 抓包实战分析三次握手

随时告诉我,我继续展开。

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

相关文章:

  • 2026 重庆英语雅思培训教育机构推荐:雅思培训课程中心权威口碑榜单 - 老周说教育
  • 华为eNSP综合实验之- 掩码反掩码和通配符适用场景
  • 2026年智能访客管理深度盘点:基于技术整合与场景适配维度下的访客机品牌榜单 - 品牌推荐
  • 2026 成都英语雅思培训教育机构推荐;雅思培训课程中心权威口碑榜单 - 老周说教育
  • 五大经典排序算法:插入、希尔、冒泡、选择、堆排序全攻略
  • 2026年评价高的tpu导电塑料/导电塑料改性厂家推荐参考 - 品牌宣传支持者
  • 2026年比较好的液压折弯机模具/标准折弯机模具行业内知名厂家推荐 - 品牌宣传支持者
  • 2026 重庆英语雅思培训教育机构推荐,雅思培训课程中心权威口碑榜单 - 老周说教育
  • 2026 重庆英语雅思培训教育机构推荐;雅思培训课程中心权威口碑榜单 - 老周说教育
  • 2026 杭州英语雅思培训教育机构推荐;雅思培训课程中心权威口碑榜单 - 老周说教育
  • 2026年2月深度盘点:基于技术创新与场景适应性维度下的智能访客机品牌榜单 - 品牌推荐
  • 2026年评价高的高精度折弯模具/无痕折弯模具厂家口碑推荐汇总 - 品牌宣传支持者
  • 一文讲透|继续教育专属AI论文平台 —— 千笔写作工具
  • 2026年2月防拍屏水印溯源公司实战报告:主流服务商技术能力及防护效能对比 - 品牌推荐
  • [AI tradingOS] 认证与用户管理 | 2FA | TOTP | JWT - 详解
  • 2026年国内技术好的包衣机供货厂家推荐,高效湿法制粒机/多功能动态干燥机/粉碎整粒机,包衣机制造商选哪家 - 品牌推荐师
  • 2026 杭州英语雅思培训教育机构推荐,雅思培训课程中心权威口碑榜单 - 老周说教育
  • [NOIP2025] 糖果店
  • 四川桥架/成都桥架/热浸锌桥架/大跨距桥架决胜未来:桥架选型如何重塑企业基础设施竞争力 - 2026年企业推荐榜
  • 2026年正规的昆山注册公司代理记账/昆山财税公司代理记账高评价推荐 - 品牌宣传支持者
  • 防拍屏水印溯源哪家公司做得好?2026年2月实测口碑品牌揭晓 - 品牌推荐
  • 2026 武汉英语雅思培训教育机构推荐:雅思培训课程中心权威口碑榜单 - 老周说教育
  • 2026 武汉英语雅思培训教育机构推荐、雅思培训课程中心权威口碑榜单 - 老周说教育
  • 2026 武汉英语雅思培训教育机构推荐,雅思培训课程中心权威口碑榜单 - 老周说教育
  • 实战CVE-2024–3094漏洞:从检测工具到Ansible自动化修复方案
  • 特征工程新纪元:2024核心方法、场景与工具全解析
  • 2026 苏州英语雅思培训教育机构推荐;雅思培训课程中心权威口碑榜单 - 老周说教育
  • 机器学习算法之特征工程的使用场景和使用方法及算法,优化方法,缺点_blog
  • 2026 保定英语雅思培训辅导机构推荐,权威出国雅思课程中心学校口碑排行榜 - 老周说教育
  • 完整教程:「用Python来学微积分」5. 曲线的极坐标方程