TCP 三次握手与四次挥手过程

news/2025/4/1 1:18:25/

TCP 作为一种面向连接的、可靠的传输层协议,其连接管理机制对于保障数据的可靠传输至关重要。

三次握手(建立连接)

三次握手是 TCP 建立连接时所采用的机制,其目的在于确保客户端和服务器双方都具备发送和接收数据的能力,同时协商初始序列号。以下是三次握手的具体步骤:

  1. 客户端向服务器发送 SYN 包
    客户端想要与服务器建立连接,会向服务器发送一个 SYN(Synchronize Sequence Numbers)包。此包包含客户端的初始序列号(ISN,Initial Sequence Number),假设为 x。这意味着客户端告知服务器自己有发送数据的意愿,并且初始化了序列号。

  2. 服务器回应 SYN - ACK 包
    服务器接收到客户端的 SYN 包后,会向客户端发送一个 SYN - ACK 包。该包一方面对客户端的 SYN 进行确认(ACK),确认号为 x + 1,表示服务器已正确收到客户端的 SYN 包;另一方面,服务器也发送自己的 SYN 包,包含服务器的初始序列号 y。这表明服务器同意建立连接,同时也初始化了自身的序列号。

  3. 客户端发送 ACK 包
    客户端收到服务器的 SYN - ACK 包后,会向服务器发送一个 ACK 包。此包的确认号为 y + 1,表示客户端已正确收到服务器的 SYN 包。至此,三次握手完成,客户端和服务器之间的连接成功建立,可以开始传输数据。

以下是一个简单的图示来展示三次握手的过程:

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

四次挥手(关闭连接)

四次挥手是 TCP 关闭连接时所采用的机制,其目的是确保双方都能正常关闭连接,避免数据丢失。以下是四次挥手的具体步骤:

  1. 客户端向服务器发送 FIN 包
    当客户端完成数据传输后,会向服务器发送一个 FIN(Finish)包,表示客户端已经没有数据要发送了,请求关闭连接。该包包含客户端的序列号,假设为 u

  2. 服务器回应 ACK 包
    服务器收到客户端的 FIN 包后,会向客户端发送一个 ACK 包,确认号为 u + 1,表示服务器已正确收到客户端的 FIN 包。此时,服务器进入半关闭状态,即服务器还可以向客户端发送数据,但客户端不能再向服务器发送数据。

  3. 服务器向客户端发送 FIN 包
    当服务器也完成数据传输后,会向客户端发送一个 FIN 包,表示服务器也已经没有数据要发送了,请求关闭连接。该包包含服务器的序列号,假设为 v

  4. 客户端回应 ACK 包
    客户端收到服务器的 FIN 包后,会向服务器发送一个 ACK 包,确认号为 v + 1,表示客户端已正确收到服务器的 FIN 包。至此,四次挥手完成,客户端和服务器之间的连接成功关闭。

以下是一个简单的图示来展示四次挥手的过程:

客户端                      服务器|                          ||--- FIN(u) -----------> ||                          || <--- ACK(u + 1) ------- ||                          || <--- FIN(v) ----------- ||                          ||--- ACK(v + 1) --------> ||                          |

综上所述,三次握手和四次挥手是 TCP 连接管理的核心机制,它们确保了数据的可靠传输和连接的正常关闭。

技术细节与生活化比喻

用生活中的对话或交易场景类比,能更直观地理解这些机制如何保障互联网的稳定性。

一、三次握手:建立连接的“双向确认”

技术细节补充:

  1. 序列号的作用

    • 客户端初始序列号(ISN)通常是随机生成的(如 x),防止历史残留的重复包干扰新连接。
    • 服务器的确认号 x+1 表示“我已收到你的 SYN,期待下一个字节的数据”。
    • 服务器的 ISN(如 y)同样随机生成,客户端的 ACK 确认 y+1 表示“我已收到你的 SYN”。
  2. 为什么需要三次握手?

    • 防止重复连接:若网络延迟导致旧 SYN 包后到达,服务器若仅两次握手(如 SYN-ACK)会误以为是新连接,三次握手可避免此类“半开连接”。
    • 双向确认:确保双方都能发送和接收数据(例如,客户端可能无法接收服务器的 SYN-ACK,但服务器无法知晓,三次握手可发现问题)。

生活化比喻:
想象你给朋友打电话订外卖:

  1. 你拨号(SYN):“喂,是 XX 餐馆吗?我想订一份披萨。”
  2. 餐馆确认(SYN-ACK):“是的,我这边可以接单,你那边能听清吗?”
  3. 你回应(ACK):“没问题,我可以听清,现在下单。”
    此时双方确认沟通正常,订单开始处理。
二、四次挥手:优雅关闭连接的“礼貌告别”

技术细节补充:

  1. FIN 与 ACK 的分离

    • 服务器收到 FIN 后,可能仍有数据需要发送(如未完成的响应),因此先回复 ACK,待自身数据发送完毕后再发送 FIN。
    • 客户端收到服务器的 FIN 后,需等待 2MSL(最大段生命周期)时间,确保所有数据包已过期,避免干扰后续连接。
  2. 状态转换

    • 客户端发送 FIN 后进入 FIN_WAIT_1,收到 ACK 后进入 FIN_WAIT_2,收到服务器 FIN 后进入 TIME_WAIT,最后关闭连接。
    • 服务器收到 FIN 后进入 CLOSE_WAIT,发送自身 FIN 后进入 LAST_ACK,收到 ACK 后关闭连接。

生活化比喻:
假设你和朋友在电话中聊天:

  1. 你说(FIN):“我这边有点事,先挂了哈。”
  2. 朋友回应(ACK):“好的,我知道了,不过我还有最后一件事要告诉你。”
  3. 朋友说完(FIN):“说完了,再见!”
  4. 你确认(ACK):“再见!”
    此时双方都确认对方已无数据要发送,正式结束通话。

常见问题与深入理解

  1. 为什么四次挥手需要四次?

    • 因为服务器可能需要先处理完剩余数据,再发送 FIN,导致 FIN 和 ACK 分开传输。
  2. SYN 攻击(三次握手的安全隐患)

    • 攻击者伪造大量 SYN 请求,耗尽服务器资源(半连接队列溢出)。解决方案:SYN Cookie、缩短超时时间等。
  3. 应用场景举例

    • 三次握手:浏览器访问网站时,TCP 先建立连接,再发送 HTTP 请求。
    • 四次挥手:视频通话结束时,双方依次关闭数据传输通道。

TCP 的三次握手和四次挥手是网络通信中“可靠连接”的基石:

  • 三次握手:通过双向确认,确保双方“准备就绪”。
  • 四次挥手:通过有序关闭,避免数据丢失。

http://www.ppmy.cn/news/1582983.html

相关文章

Redis常用数据类型深度解析:从理论到最佳实践

Redis常用数据类型深度解析&#xff1a;从理论到最佳实践 一、引言二、Redis数据类型全景图三、核心数据类型详解**1. String&#xff08;字符串&#xff09;****2. Hash&#xff08;哈希表&#xff09;****3. List&#xff08;列表&#xff09;****4. Set&#xff08;集合&…

多线程 --- 进程和线程的基本知识

进程 前面我们提到了一个概念是&#xff0c;多任务操作系统&#xff0c;即希望该系统能够同时运行多个程序。本质上说&#xff0c;进程&#xff0c;就算用来解决”并发编程“这样的问题的。 在一些特定的情况下&#xff0c;进程的表现&#xff0c;其实并不能很好的解决”并发…

Chair Assembly Process

Chair Assembly Process 靠背椅的组装流程 装轮子&#xff0c;这样侧起来&#xff0c;好压进去&#xff0c;好受力呗。 安装&#xff1a;气杆 安装&#xff1a;托盘&#xff0c;调节坐骑上下高度 发现要先安装座椅&#xff0c;然后在放到支架上&#xff0c;这样会好操作点 M6 …

HarmonyOS Next~鸿蒙系统性能优化全解析:检测、分析与场景实践

HarmonyOS Next&#xff5e;鸿蒙系统性能优化全解析&#xff1a;检测、分析与场景实践 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;凭借其分布式架构与全场景能力&#xff0c;在性能优化领域展现出了独特的技术优势。本文将从性能检测工具、分析方法、优化策略及典型场景实…

Jmeter旧版本如何下载

1.Jmeter最新版本下载位置 https://jmeter.apache.org/download_jmeter.cgi2.Jmeter旧版本下载位置 https://archive.apache.org/dist/jmeter/binaries稳定版本&#xff1a;5.4.1

Android 16开发实战指南|锁屏交互+Vulkan优化全解析

一、环境搭建与项目初始化 1. 安装Android Studio Ladybug 下载地址:Android Studio官网关键配置: # 安装后立即更新SDK SDK Manager → SDK Platforms → 安装Android 16 (Preview) SDK Manager → SDK Tools → 更新Android SDK Build-Tools至34.0.0 # 通过命令行安装SDK组…

实战案例:mcp-server-milvus项目

背景:mcp-server-milvus项目介绍 该项目包含一个 MCP 服务器,可提供对Milvus向量数据库功能的访问。 项目地址:https://github.com/zilliztech/mcp-server-milvus 第一步:环境准备与配置 说明:本教程不含Python3和Nodejs安装展示,请自行按照官方手册进行配置。 Pyth…

【AI News | 20250324】每日AI进展

AI Repos 1、fastapi_mcp 一款零配置解决方案&#xff0c;可将FastAPI端点自动暴露为模型上下文协议&#xff08;MCP&#xff09;工具。其特点包括直接集成MCP服务器到FastAPI应用&#xff0c;无需配置即可使用&#xff0c;自动发现并转换所有端点为MCP工具&#xff0c;同时保…