news 2026/1/9 10:45:46

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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/31 19:37:25

CDN 配置避坑指南:关键要点与实战经验总结

&#x1f4a1; 前言&#xff1a; 很多开发者在第一次接入 CDN 时&#xff0c;往往认为“只要添加个域名”就万事大吉了。 但实际上&#xff0c;回源策略、缓存规则、HTTPS证书 等配置细节&#xff0c;直接决定了你的网站是“飞起来”还是“挂掉”。 本文结合真实踩坑经验&#…

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

GPU算力租赁推广:搭配PyTorch镜像实现极速接入

GPU算力租赁推广&#xff1a;搭配PyTorch镜像实现极速接入 在深度学习项目启动阶段&#xff0c;你是否曾为搭建环境耗费数小时甚至几天&#xff1f;明明代码写好了&#xff0c;却卡在“ImportError: CUDA not available”这种低级错误上&#xff1b;团队成员各自配置环境&#…

作者头像 李华
网站建设 2026/1/6 1:31:49

YOLOv5s模型训练实战:基于PyTorch-CUDA环境全流程演示

YOLOv5s模型训练实战&#xff1a;基于PyTorch-CUDA环境全流程演示 在自动驾驶的感知系统中&#xff0c;一帧图像需要在几十毫秒内完成车辆、行人和交通标志的识别&#xff1b;在工厂质检线上&#xff0c;每分钟数百个零件必须被实时检测缺陷。这些场景背后&#xff0c;都离不开…

作者头像 李华
网站建设 2026/1/1 15:30:46

深度学习入门必备:PyTorch GPU环境安装全攻略

深度学习环境搭建新范式&#xff1a;PyTorch-CUDA容器化实战指南 在人工智能实验室的深夜&#xff0c;你是否也曾面对这样的场景&#xff1a;刚下载好一个论文复现代码&#xff0c;满怀期待地运行 train.py&#xff0c;结果终端却无情地弹出一行红字——“CUDA not available”…

作者头像 李华
网站建设 2026/1/2 7:30:06

PyTorch-CUDA-v2.7镜像是否可用于工业质检场景

PyTorch-CUDA-v2.7镜像在工业质检中的适用性分析 在智能制造加速转型的今天&#xff0c;一条产线每分钟可能产出数百件产品&#xff0c;而微米级的表面划痕、气泡或装配偏差却不能被轻易放过。传统靠人工目检的方式早已不堪重负——疲劳、主观判断差异、漏检率波动等问题让质量…

作者头像 李华
网站建设 2026/1/4 19:54:52

Git下载大型模型仓库技巧:利用git-lfs管理大文件资源

Git下载大型模型仓库技巧&#xff1a;利用Git LFS管理大文件资源 在深度学习项目开发中&#xff0c;你是否曾遇到过这样的场景&#xff1f;执行 git clone 命令后&#xff0c;终端卡在“Receiving objects: 3% (1234/40000)”长达数小时&#xff0c;最终以“out of memory”或…

作者头像 李华