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

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.mzph.cn/pingmian/73308.shtml

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

相关文章

【线程安全的单例模式和STL是否是线程安全/智能指针是否是线程安全】

文章目录 一、单例模式的特点二、饿汉模式实现单例三、懒汉模式实现单例四、STL线程安全吗&#xff1f;五、智能指针线程安全吗&#xff1f; 一、单例模式的特点 一个类&#xff0c;只应该实例化了一个对象&#xff0c;就是单例。 二、饿汉模式实现单例 举个饿汉模式的例子&…

力扣DAY24 | 热100 | 回文链表

前言 简单 √ 是反转链表的衍生题&#xff0c;很快写完了。不过没考虑到恢复链表结构的问题。 题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输…

【GL010】C++

1.C中的const关键字有哪些用法&#xff1f; 1.修饰变量&#xff1a;表示变量的值不可修改。 const int a 10; 2.修饰指针&#xff1a; const int* p&#xff1a; // 指针指向的内容不可修改。 int* const p&#xff1a; // 指针本身不可修改。 const int* const…

金融行业 UE/UI 设计:解锁高效体验,重塑行业界面

在数字化浪潮中&#xff0c;金融行业的竞争日益激烈&#xff0c;用户体验&#xff08;UE&#xff09;和用户界面&#xff08;UI&#xff09;设计成为企业脱颖而出的关键。兰亭妙微凭借丰富的经验和创新的方法&#xff0c;为金融行业打造了一套行之有效的 UE/UI 解决方案&#x…

C语言字符函数,字符串函数以及内存函数

那么博主写这一片博客的目的就是为下一篇c的string类做铺垫&#xff0c;那么下面就请期待博主的下一篇文章吧。 目录 1.字符函数 2.字符串函数&#xff08;均在string.h头文件中&#xff09; strlen的使用和模拟实现 strcpy 的使用和模拟实现 strcat 的使用和模拟实现 s…

_DISPATCHER_HEADER结构中的WaitListHead和_KWAIT_BLOCK的关系

第一部分&#xff1a; // // Wait block // // begin_ntddk begin_wdm begin_nthal begin_ntifs begin_ntosp typedef struct _KWAIT_BLOCK { LIST_ENTRY WaitListEntry; struct _KTHREAD *RESTRICTED_POINTER Thread; PVOID Object; struct _KWAIT_BLOCK *R…

flutter 自定义控件RenderObjectWidget使用

CustomWidget的自定义组件的注释还是比较清晰的 参考文档Flutter实战 import package:flutter/cupertino.dart; import package:flutter/gestures.dart; import package:flutter/material.dart; /* * 如果组件不会包含子组件&#xff0c;则我们可以直接继承自 LeafRenderObject…

机器视觉场景应用中,有没有超景深的工业镜头

在机器视觉领域,确实存在具有超景深特性的工业镜头,这类镜头通过特殊的光学设计或技术手段,能够显著扩大清晰成像的纵向范围,从而满足复杂检测场景中对多平面物体清晰成像的需求。以下是相关技术要点及典型镜头类型: 1. 远心镜头 远心镜头是超景深镜头的典型代表,其特点包…

【Linux】同步原理剖析及模拟BlockQueue生产消费模型

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

光流 | 基于KLT算法的人脸检测与跟踪原理及公式,算法改进,matlab代码

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 人脸检测与跟踪 一、KLT算法原理与分析1. 核心思想2. 数学模型二、人脸…

<数据集>轨道异物识别数据集<目标检测>

数据集下载链接&#xff1a;https://download.csdn.net/download/qq_53332949/90527370 数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1659张 标注数量(xml文件个数)&#xff1a;1659 标注数量(txt文件个数)&#xff1a;1659 标注类别数&#xff1a;6 标注类别…

LabVIEW液压振动锤控制系统

在现代工程机械领域&#xff0c;液压振动锤的高效与精准控制日益显得重要。本文通过LabVIEW软件&#xff0c;展开液压振动锤启停共振控制技术的研究与应用&#xff0c;探讨如何通过改进控制系统来优化液压振动锤的工作性能&#xff0c;确保其在复杂工况下的稳定性与效率。 ​ …

【开源宝藏】30天学会CSS - DAY7 第七课 CSS 关键帧打造Preloader 追逐动画

你的代码实现了一个 方形轨迹预加载动画&#xff08;Preloader Animation&#xff09;&#xff0c;其中三个 span 元素沿着一个 22 网格 轨迹循环移动。现在&#xff0c;我们将 拆解核心实现步骤&#xff0c;让你能一步步理解并调整动画效果。 第 0 步&#xff1a;项目概览 你…

在shell脚本内部获取该脚本所在目录的绝对路径

目录 需求描述 方法一&#xff1a;使用 dirname 和 readlink 命令 方法二&#xff1a;使用 BASH_SOURCE 变量 方法三&#xff1a;仅使用纯 Bash 实现 需求描述 工作中经常有这样情况&#xff0c;需要在脚本内部获取该脚本自己所在目录的绝对路径。 假如有一个脚本/a/b/c/…

常考计算机操作系统面试习题(一下)

目录 操作系统基本类型 操作系统的功能 操作系统的主要任务 进程与线程 进程状态转变 内存管理 文件系统与文件管理 虚拟存储器 设备管理 磁盘调度 死锁 信号量机制 文件打开与管理 进程与线程的互斥与同步 进程同步 进程调度 文件分配磁盘块的方法 程序执行…

GPT-SoVITS本地部署:低成本实现语音克隆远程生成音频全流程实战

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天要给大家安利一个绝对能让你大呼过瘾的声音黑科技——GPT-SoVITS&#xff01;这款由花儿不哭大佬精心打造的语音克隆神…

JVM(基础篇)

一.初识JVM 1.什么是JVM JVM全称Java Virtyal Machine&#xff0c;中文译名 Java虚拟机 。JVM本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件(将字节码解释成机器码)。 2.JVM的功能 解释和运行&#xff1a;对字节码文件中的指令号&#xff0c;实时…

【高并发内存池】第四弹---深入理解PageCache:整体设计、核心实现及Span获取策略详解

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】【项目详解】 目录 1、pagecache 1.1、整体设计 1.2、核心实现 1.3、获取Span 1.3.1、获取一个非空的Span 1.3…

深入理解C语言数据结构之快速排序三路划分

在数据结构和算法的世界里&#xff0c;排序算法是基石一般的存在。快速排序作为一种高效的排序算法&#xff0c;以其平均情况下的优秀时间复杂度而被广泛应用。今天&#xff0c;让我们深入探讨快速排序的一种变体——三路划分的快速排序&#xff0c;看看它是如何在C语言中施展魔…

Java实现后量子密码(PQC)与国密算法(SM4)混合加密

以下是使用Java实现一种后量子密码(PQC)与国密算法(SM4)混合加密的示例方案。该方案结合了后量子密码的抗量子特性与国密算法的国产化合规要求,适合需要双重安全保障的场景。 一 . 方案验证 1.代码截图 2.运行测试 二 . 方案设计 密钥交换:使用后量子密码(如Kyber)生…