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

深入理解 TCP 协议中三次握手建立连接和四次挥手关闭连接的核心逻辑

你想深入理解 TCP 协议中三次握手建立连接四次挥手关闭连接的核心逻辑,这是 TCP 面向连接、可靠通信的基础。我会用「流程拆解+状态变化+通俗解释+LwIP 实现关联」的方式,帮你把这两个核心机制讲透。

一、三次握手(TCP 建立连接)

核心目标

客户端和服务端通过三次交互,同步序列号和确认号协商初始窗口大小,最终建立双向可靠的通信链路,确保双方都做好了收发数据的准备。

完整流程(附状态变化)
服务端客户端服务端客户端初始状态:LISTEN初始状态:CLOSED状态:SYN_SENT状态:SYN_RCVD状态:ESTABLISHED状态:ESTABLISHED连接建立完成,可收发数据1. SYN报文(SEQ=x,SYN=1)2. SYN+ACK报文(SEQ=y,ACK=x+1,SYN=1,ACK=1)3. ACK报文(SEQ=x+1,ACK=y+1,ACK=1)
步骤详解(通俗版)
  1. 第一次握手(客户端→服务端)

    • 客户端主动发起连接,发送SYN报文(同步报文),携带自己的初始序列号x,并将SYN标志位设为 1。
    • 客户端状态从CLOSEDSYN_SENT,等待服务端确认。
    • (LwIP 中对应tcp_connect()函数,触发SYN报文发送)
  2. 第二次握手(服务端→客户端)

    • 服务端收到SYN报文后,确认客户端的序列号(ACK=x+1),同时发送自己的SYN报文(初始序列号y),将SYNACK标志位都设为 1。
    • 服务端状态从LISTENSYN_RCVD,并进入ESTABLISHED(已建立)状态,准备接收数据。
    • (LwIP 中tcp_in.c处理SYN报文,触发SYN+ACK响应)
  3. 第三次握手(客户端→服务端)

    • 客户端收到SYN+ACK报文后,确认服务端的序列号(ACK=y+1),发送ACK报文(仅确认,无数据)。
    • 客户端状态从SYN_SENTESTABLISHED,此时双向连接完全建立,双方可开始收发数据。
    • (LwIP 中客户端收到SYN+ACK后,发送最终ACK,完成连接建立)
为什么需要三次握手?
  • 核心是防止“失效的连接请求报文”被服务端接收(比如客户端超时重发的旧 SYN 报文延迟到达)。
  • 三次握手能确保双方都确认“对方能收/发报文”,避免服务端为无效连接分配资源(比如创建 socket、分配缓冲区)。

二、四次挥手(TCP 关闭连接)

核心目标

TCP 是全双工通信(双方可同时收发数据),关闭连接时需要分别关闭“客户端→服务端”和“服务端→客户端”两个方向的链路,因此需要四次交互。

完整流程(附状态变化)
服务端客户端服务端客户端初始状态:ESTABLISHED状态:FIN_WAIT_1状态:CLOSE_WAIT状态:FIN_WAIT_2状态:LAST_ACK状态:TIME_WAIT状态:CLOSED等待2MSL后→CLOSED1. FIN报文(SEQ=u,FIN=1)2. ACK报文(SEQ=v,ACK=u+1,ACK=1)3. FIN报文(SEQ=w,ACK=u+1,FIN=1)4. ACK报文(SEQ=u+1,ACK=w+1,ACK=1)
步骤详解(通俗版)
  1. 第一次挥手(客户端→服务端)

    • 客户端主动关闭连接,发送FIN报文(终止报文),携带当前序列号uFIN标志位设为 1,表示“我没有数据要发了”。
    • 客户端状态从ESTABLISHEDFIN_WAIT_1,等待服务端确认。
    • (LwIP 中对应tcp_close()函数,触发FIN报文发送)
  2. 第二次挥手(服务端→客户端)

    • 服务端收到FIN报文后,先发送ACK报文确认(ACK=u+1),表示“我收到你关闭的请求了”。
    • 服务端状态从ESTABLISHEDCLOSE_WAIT(关闭等待),此时服务端仍可向客户端发送剩余数据。
    • 客户端收到ACK后,状态从FIN_WAIT_1FIN_WAIT_2,等待服务端发送自己的FIN报文。
  3. 第三次挥手(服务端→客户端)

    • 服务端发送完所有数据后,主动发送FIN报文(序列号w),表示“我也没有数据要发了,你可以关闭了”。
    • 服务端状态从CLOSE_WAITLAST_ACK,等待客户端最终确认。
  4. 第四次挥手(客户端→服务端)

    • 客户端收到FIN报文后,发送ACK报文确认(ACK=w+1),状态从FIN_WAIT_2TIME_WAIT
    • 服务端收到ACK后,状态从LAST_ACKCLOSED,完成关闭。
    • 客户端需等待2MSL(报文最大生存时间)后,才从TIME_WAITCLOSED(防止延迟的报文干扰新连接)。
为什么需要四次挥手?
  • TCP 是全双工通信,关闭连接时需要“双向确认”:客户端先关闭自己的发送方向,服务端确认后,再关闭自己的发送方向,客户端最后确认。
  • 服务端收到FIN后可能还有未发送完的数据,因此需要先回ACK确认关闭请求,待数据发完后再发FIN关闭自己的方向。

三、LwIP 中与握手/挥手相关的核心模块

  • 三次握手:tcp.c中的tcp_connect()tcp_listen()tcp_in.c中的tcp_process_syn()(处理 SYN 报文)。
  • 四次挥手:tcp.c中的tcp_close()tcp_abort()tcp_in.c中的tcp_process_fin()(处理 FIN 报文)。
  • 状态管理:LwIP 用struct tcp_pcb(TCP 协议控制块)中的state字段维护连接状态(如SYN_SENTESTABLISHEDTIME_WAIT等)。

总结

核心关键点
  1. 三次握手:核心是同步序列号+双向确认,确保连接建立的可靠性,避免无效连接;
  2. 四次挥手:核心是全双工链路的双向关闭,服务端需先确认关闭请求,待数据发完后再主动关闭;
  3. 状态变化是关键:握手/挥手的本质是 TCP 连接状态的有序切换,LwIP 通过tcp_pcb管理这些状态;
  4. 特殊状态:TIME_WAIT是客户端关闭后的“等待期”,目的是避免延迟报文干扰新连接。

简单记:握手是“你好→收到你好,我也好→收到你也好”,挥手是“我走了→收到你走→我也走了→收到你也走”。

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

相关文章:

  • 网络编程术语select()
  • 3个暗黑2单机痛点+1个插件彻底解决
  • 3大核心优势解析:Web3D交通模拟如何革新城市交通可视化体验
  • 解锁零代码数据可视化:ParquetViewer让大数据查看更简单
  • PyTorch与Keras环境对比:预装包部署速度全方位评测
  • 资源提取效率引擎:FModel革新游戏开发工作流
  • fastbootd安全性增强方案:Qualcomm平台实践指南
  • 如何通过Zenodo构建开放科研数据生态?
  • 如何让LTSC系统重获应用生态?三招解锁微软商店
  • Qwen-Image-2512应用场景:适合哪些行业?
  • Rainmeter音频可视化创意设计实战指南:从技术实现到艺术表达
  • Speech Seaco Paraformer Docker部署:容器化改造实战案例
  • verl安装验证全流程:Python导入+版本查看快速上手
  • Awoo Installer全场景解决方案:Nintendo Switch游戏安装效率提升指南
  • 革新暗黑破坏神角色定制:Diablo Edit2游戏工具全解析
  • 从零开始:Zenodo科研数据共享平台全解析
  • 通过Vivado IP核配置PCIe通信接口:深度技术讲解
  • 3个革命性技巧:PlugY工具让暗黑2玩家彻底解决单机限制痛点
  • 如何在中端GPU运行Flux?麦橘超然给出标准答案
  • Open-AutoGLM ADB连接失败?常见问题全解析
  • GTA5增强工具YimMenu全面配置与高级应用指南
  • 3步语音修复指南:2025开源工具VoiceFixer拯救失真音频全攻略
  • 5个开源图像模型部署推荐:Qwen-Image-2512免配置快速上手
  • JiYuTrainer:极域电子教室高效学习辅助工具完全指南
  • 新手必看!PyTorch-2.x镜像保姆级教程,5分钟开启AI训练
  • 英雄联盟游戏个性化工具完全指南:从零开始的安全换肤方案
  • AI语音转换新突破:如何用10分钟数据训练专业级变声模型
  • 批量转换中断如何恢复?outputs文件夹揭秘
  • 突破企业监控限制:JiYuTrainer颠覆式办公自由解决方案
  • 3种Steam清单获取方案:从新手到专家的效率提升指南