news 2026/4/18 10:19:41

TCP连接管理——三次握手和四次挥手

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TCP连接管理——三次握手和四次挥手

TCP连接管理:三次握手与四次挥手详解

TCP(Transmission Control Protocol)是一种面向连接可靠的传输层协议。在数据传输前必须建立连接,传输结束后必须释放连接。这个过程分别由三次握手(Three-Way Handshake)和四次挥手(Four-Way Handshake)完成。

1. TCP报文段首部关键字段

理解握手和挥手前,先记住以下6个关键控制位(flags):

字段含义作用场景
SYN同步序列号(Synchronize)发起连接请求
ACK确认(Acknowledgment)确认收到对方报文
FIN结束(Finish)请求释放连接
RST复位(Reset)异常中断连接
PSH推送(Push)尽快交付应用层
URG紧急(Urgent)紧急数据

另外两个重要字段:

  • seq(Sequence Number):本方发送数据的起始序号
  • ack(Acknowledgment Number):期待收到的对方下一个字节的序号(即已确认收到 ack-1 之前的字节)
2. 三次握手(建立连接)

目的:双方确认彼此的发送能力和接收能力正常,并协商初始序号(ISN)。

过程图示:

客户端 服务端 | SYN (seq=x) | |------------------------------>| | SYN+ACK (seq=y, ack=x+1) | |<------------------------------| | ACK (seq=x+1, ack=y+1) | |------------------------------>|

详细步骤:

  1. 第一次握手(SYN)
    客户端发送 SYN 报文:

    • SYN=1
    • seq = x(客户端随机初始序号)
    • ACK=0(此时还没确认)
      客户端进入SYN_SENT状态。
      → 告诉服务端:“我想和你建立连接,我的初始序号是 x”
  2. 第二次握手(SYN+ACK)
    服务端收到 SYN 后回复:

    • SYN=1, ACK=1
    • seq = y(服务端随机初始序号)
    • ack = x+1(确认收到客户端的 SYN,期待下一个序号为 x+1)
      服务端进入SYN_RCVD状态。
      → 告诉客户端:“我同意建立连接,我的初始序号是 y,我已收到你的 SYN”
  3. 第三次握手(ACK)
    客户端收到 SYN+ACK 后发送最终确认:

    • SYN=0, ACK=1
    • seq = x+1
    • ack = y+1
      双方都进入ESTABLISHED状态,可以开始传输数据。

为什么是三次而不是两次?
两次握手只能确认客户端→服务端的单向通信能力,无法确认服务端→客户端的通道是否正常(旧的重复 SYN 可能导致服务端误以为是新连接)。三次握手确保双方都能正常收发。

3. 四次挥手(释放连接)

目的:确保双方都有机会优雅地关闭连接,数据都能可靠送达(半关闭特性:支持单方向先关闭)。

过程图示(假设客户端主动关闭):

客户端 服务端 | FIN (seq=a) | |------------------------------>| | ACK (ack=a+1) | |<------------------------------| | | (服务端可能还有数据要发) | (可能收到数据) | |<------------------------------| | FIN (seq=b) | |<------------------------------| | ACK (ack=b+1) | |------------------------------>|

详细步骤:

  1. 第一次挥手(客户端发送 FIN)
    客户端数据发送完毕,发送 FIN 报文:

    • FIN=1, seq=a
      客户端进入FIN_WAIT_1状态。
      → “我发完了,你还有数据要发吗?”
  2. 第二次挥手(服务端回复 ACK)
    服务端收到 FIN,立刻回复确认:

    • ACK=1, ack=a+1
      服务端进入CLOSE_WAIT状态。
      客户端收到后进入FIN_WAIT_2状态。
      → “我收到你发完的通知了,但我要处理完剩余数据”

    注意:此时连接处于半关闭状态,客户端不再发送数据,但仍能接收服务端数据。

  3. 第三次挥手(服务端发送 FIN)
    服务端处理完所有数据后,发送自己的 FIN:

    • FIN=1, seq=b
      服务端进入LAST_ACK状态。
      → “我也发完了,可以关闭了”
  4. 第四次挥手(客户端回复 ACK)
    客户端收到服务端 FIN 后回复最终确认:

    • ACK=1, ack=b+1
      客户端进入TIME_WAIT状态,等待 2MSL(最大报文生存时间,通常 1-4 分钟)后才完全关闭。
      服务端收到 ACK 后立即进入CLOSED状态。

为什么客户端要 TIME_WAIT 等待 2MSL?

  • 确保最后的 ACK 能到达服务端(如果丢失,服务端会重发 FIN,客户端可重新确认)
  • 防止旧连接的延迟报文干扰新连接(同一四元组的旧报文在网络中存活不超过 MSL)

为什么是四次而不是三次?
因为 TCP 是全双工的,关闭需要分别关闭两个方向。服务端收到客户端 FIN 后可能还有数据要发,不能立即关闭,必须等自己也准备好再发 FIN。

4. 常见状态变迁总结(客户端主动关闭)
客户端状态服务端状态
CLOSEDCLOSED
SYN_SENTLISTEN
ESTABLISHEDSYN_RCVD
FIN_WAIT_1ESTABLISHED
FIN_WAIT_2CLOSE_WAIT
TIME_WAITLAST_ACK
CLOSEDCLOSED
5. 常见面试延伸问题
  • 为什么初始序号 ISN 要随机?→ 防止历史旧连接的报文被误认为是新连接的数据。
  • 如果第三次握手丢失会怎样?→ 服务端超时重发 SYN+ACK,客户端重新发送第三次 ACK。
  • 大量 TIME_WAIT 如何处理?→ 调小 time_wait 时间、开启 tcp_tw_reuse/recycle(慎用)。
  • SYN Flood 攻击?→ 攻击者发送大量 SYN 不完成第三次握手,耗尽服务端半连接队列。防御:syn cookies、增加 backlog 等。

希望这个详解清晰易懂!如果需要结合 Wireshark 抓包示例、状态机图或其他深入点(如同时打开、同时关闭),随时告诉我。

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

8款免费AI写论文工具实测:AI率精准控,30分钟出高质量初稿!

还在为论文选题、结构、降重、润色而焦虑失眠吗&#xff1f;别再一个人死磕了&#xff01;今天&#xff0c;我们就为你实测8款市面上热门的免费AI论文写作工具&#xff0c;让你轻松告别“写稿如山倒&#xff0c;交稿如抽丝”的痛苦循环。只需一杯咖啡的时间&#xff0c;一篇结构…

作者头像 李华
网站建设 2026/4/15 10:18:56

GitHub热门项目推荐:PyTorch-CUDA预配置镜像使用教程

PyTorch-CUDA预配置镜像&#xff1a;让深度学习环境部署不再“从入门到放弃” 在人工智能实验室的深夜&#xff0c;你是否也经历过这样的场景&#xff1f;刚复现完一篇顶会论文&#xff0c;准备在自己的工作站上跑实验&#xff0c;结果 torch.cuda.is_available() 却返回了刺眼…

作者头像 李华
网站建设 2026/4/18 8:25:22

解决PyTorch安装失败问题:使用官方v2.8稳定版本镜像

解决 PyTorch 安装失败&#xff1a;为何你应该直接使用官方 v2.8 稳定镜像 在深度学习项目启动的第一天&#xff0c;你是不是也经历过这样的场景&#xff1f;满怀期待地打开终端&#xff0c;准备跑通第一个模型&#xff0c;结果刚执行 pip install torch 就开始报错——CUDA 版…

作者头像 李华
网站建设 2026/4/17 17:19:03

YOLOv11模型训练实战:基于PyTorch-CUDA-v2.8镜像快速上手

YOLOv11模型训练实战&#xff1a;基于PyTorch-CUDA-v2.8镜像快速上手 在智能摄像头、自动驾驶和工业质检等场景中&#xff0c;目标检测的实时性与准确性直接决定了系统的可用性。YOLO 系列算法因其“一次前向传播完成检测”的高效设计&#xff0c;长期占据着实际应用的主流地位…

作者头像 李华
网站建设 2026/4/18 10:04:28

从Anaconda配置PyTorch环境到模型推理全流程演示

从 Anaconda 配置 PyTorch 环境到模型推理全流程实践 在高校实验室里&#xff0c;一个学生正对着满屏的 CUDA out of memory 错误发愁&#xff1b;企业 AI 平台中&#xff0c;三位工程师因为本地环境版本不一致导致训练结果无法复现&#xff1b;而云服务团队则为新成员配置 GPU…

作者头像 李华