深入理解 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.mzph.cn/news/1216496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络编程术语select()

Go through the readset and writeset lists and see which socket of the sockets set in the sets has events. On return, readset, writeset and exceptset have the sockets enabled that had events. 翻译为中文 好的,这是您提供的英文技术文档的中文翻译&…

3个暗黑2单机痛点+1个插件彻底解决

3个暗黑2单机痛点1个插件彻底解决 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 暗黑破坏神2单机模式中,玩家常面临三大痛点:储物空间不足导…

3大核心优势解析:Web3D交通模拟如何革新城市交通可视化体验

3大核心优势解析:Web3D交通模拟如何革新城市交通可视化体验 【免费下载链接】sumo-web3d Web-based 3D visualization of SUMO microsimulations using TraCI and three.js. 项目地址: https://gitcode.com/gh_mirrors/su/sumo-web3d 还在为交通模拟可视化发…

解锁零代码数据可视化:ParquetViewer让大数据查看更简单

解锁零代码数据可视化:ParquetViewer让大数据查看更简单 【免费下载链接】ParquetViewer Simple windows desktop application for viewing & querying Apache Parquet files 项目地址: https://gitcode.com/gh_mirrors/pa/ParquetViewer ParquetViewer是…

PyTorch与Keras环境对比:预装包部署速度全方位评测

PyTorch与Keras环境对比:预装包部署速度全方位评测 1. 为什么环境部署速度比模型训练还重要? 你有没有遇到过这样的情况: 花半小时配好CUDA,又折腾一小时解决torchvision版本冲突,最后发现只是因为pip源没换&#xf…

资源提取效率引擎:FModel革新游戏开发工作流

资源提取效率引擎:FModel革新游戏开发工作流 【免费下载链接】FModel Unreal Engine Archives Explorer 项目地址: https://gitcode.com/gh_mirrors/fm/FModel 在游戏开发和模组创作领域,高效获取和处理虚幻引擎资源一直是开发者面临的核心挑战。…

fastbootd安全性增强方案:Qualcomm平台实践指南

以下是对您提供的技术博文《fastbootd安全性增强方案:Qualcomm平台实践指南》的 深度润色与重构版本 。本次优化严格遵循您的全部要求: ✅ 彻底消除AI生成痕迹,语言自然、专业、有“人味”——像一位在高通平台摸爬滚打多年的系统安全工程…

如何通过Zenodo构建开放科研数据生态?

如何通过Zenodo构建开放科研数据生态? 【免费下载链接】zenodo Research. Shared. 项目地址: https://gitcode.com/gh_mirrors/ze/zenodo 在开放科学迅速发展的今天,科研数据共享已成为推动学术创新的核心动力。Zenodo作为领先的开源科研数据管理…

如何让LTSC系统重获应用生态?三招解锁微软商店

如何让LTSC系统重获应用生态?三招解锁微软商店 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore Windows 11 LTSC系统以其稳定性和长期支持特…

Qwen-Image-2512应用场景:适合哪些行业?

Qwen-Image-2512应用场景:适合哪些行业? 阿里开源的 Qwen-Image-2512 是当前图像生成领域中少有的、兼顾高精度控制力与强中文语义理解能力的多模态大模型。它不是简单堆砌参数的“大”,而是针对真实业务场景深度打磨的“实”——尤其在中文…

Rainmeter音频可视化创意设计实战指南:从技术实现到艺术表达

Rainmeter音频可视化创意设计实战指南:从技术实现到艺术表达 【免费下载链接】rainmeter Desktop customization tool for Windows 项目地址: https://gitcode.com/gh_mirrors/ra/rainmeter 你是否想过让桌面成为音乐的画布?如何让冰冷的数字界面…

Speech Seaco Paraformer Docker部署:容器化改造实战案例

Speech Seaco Paraformer Docker部署:容器化改造实战案例 1. 为什么需要容器化改造 语音识别模型在实际落地中,常常面临“能跑通”和“能交付”的鸿沟。Speech Seaco Paraformer 是基于阿里 FunASR 的高质量中文 ASR 模型,识别准确、支持热…

verl安装验证全流程:Python导入+版本查看快速上手

verl安装验证全流程:Python导入版本查看快速上手 1. verl 是什么?一个为大模型后训练而生的强化学习框架 你可能已经听说过 RLHF(基于人类反馈的强化学习),但真正能在生产环境中稳定、高效跑起来的 RL 训练框架却不多…

Awoo Installer全场景解决方案:Nintendo Switch游戏安装效率提升指南

Awoo Installer全场景解决方案:Nintendo Switch游戏安装效率提升指南 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer Awoo Installer作…

革新暗黑破坏神角色定制:Diablo Edit2游戏工具全解析

革新暗黑破坏神角色定制:Diablo Edit2游戏工具全解析 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 在暗黑破坏神的冒险旅程中,你是否曾因属性点分配失误导致角色发展受限…

从零开始:Zenodo科研数据共享平台全解析

从零开始:Zenodo科研数据共享平台全解析 【免费下载链接】zenodo Research. Shared. 项目地址: https://gitcode.com/gh_mirrors/ze/zenodo 在开放科学快速发展的今天,如何让科研数据既安全可靠又能被全球研究者高效利用?Zenodo作为CE…

通过Vivado IP核配置PCIe通信接口:深度技术讲解

以下是对您提供的博文内容进行 深度润色与专业重构后的版本 。我以一名资深嵌入式系统架构师兼FPGA教学博主的身份,彻底摒弃AI腔调、模板化表达和空泛术语堆砌,转而采用 真实工程语境下的技术叙事风格 :有痛点、有踩坑、有调试痕迹、有经…

3个革命性技巧:PlugY工具让暗黑2玩家彻底解决单机限制痛点

3个革命性技巧:PlugY工具让暗黑2玩家彻底解决单机限制痛点 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY PlugY工具(PlugY, The Survival Ki…

如何在中端GPU运行Flux?麦橘超然给出标准答案

如何在中端GPU运行Flux?麦橘超然给出标准答案 你是否也遇到过这样的困扰:想体验 Flux.1 这类前沿图像生成模型,却发现自己的 RTX 4070、RTX 4080 或 A10G 显卡总在加载时爆显存?明明硬件参数不差,却连一张 10241024 的…

Open-AutoGLM ADB连接失败?常见问题全解析

Open-AutoGLM ADB连接失败?常见问题全解析 在实际部署和使用 Open-AutoGLM 过程中,不少开发者反馈“adb devices 不显示设备”“Connection refused”“device offline”“WiFi 连接后秒断”等现象——这些表象背后,往往不是模型或代码的问题…