TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)

TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)

      • 一、TCP三次握手(Three-way Handshake)
      • 二、TCP四次挥手(Four-way Wave)
      • 三、常见问题解答
      • 总结
      • 为什么三次握手不能减少到两次?
      • 为什么三次握手不能增加到四次?
      • 为什么四次挥手不能减少到三次?
      • 总结:

以下是关于TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)的详细整理:


一、TCP三次握手(Three-way Handshake)

目的:建立可靠的TCP连接,确保双方同步序列号并确认通信能力。
过程(分3步):
在这里插入图片描述

  1. 第一次握手(SYN请求)
    • 客户端发送TCP报文,设置标志位SYN=1,随机生成初始序列号Seq=X,表示请求连接。
    • 客户端进入SYN_SENT状态,等待服务器响应。
  2. 第二次握手(SYN+ACK响应)
    • 服务器收到请求后,发送TCP报文:
      • 标志位SYN=1, ACK=1,确认号Ack=X+1,自身生成初始序列号Seq=Y
    • 服务器进入SYN_RCVD状态,表示已准备好连接。
  3. 第三次握手(ACK确认)
    • 客户端收到服务器的响应后,发送TCP报文:
      • 标志位ACK=1,确认号Ack=Y+1,序列号Seq=X+1
    • 双方进入ESTABLISHED状态,连接正式建立,开始数据传输。

关键点

  • 通过序列号与确认号机制确保双方同步,防止旧连接数据干扰。
  • 第二次握手合并SYNACK,提高效率(服务器确认客户端的连接能力并同步自身序列号)。

二、TCP四次挥手(Four-way Wave)

目的:优雅关闭TCP连接,确保双方数据完全传输并释放资源。
过程(分4步):

在这里插入图片描述

  1. 第一次挥手(FIN请求关闭)
    • 客户端发送TCP报文,设置标志位FIN=1,序列号Seq=U,表示停止发送数据。
    • 客户端进入FIN_WAIT_1状态,等待服务器确认。
  2. 第二次挥手(ACK确认关闭请求)
    • 服务器收到FIN后,发送TCP报文:
      • 标志位ACK=1,确认号Ack=U+1,序列号Seq=V(当前发送数据的序列号)。
    • 服务器进入CLOSE_WAIT状态,通知应用层处理关闭请求,但仍可向客户端发送剩余数据。
  3. 第三次挥手(FIN请求反向关闭)
    • 服务器发送完剩余数据后,发送TCP报文:
      • 标志位FIN=1, ACK=1,确认号Ack=U+1,序列号Seq=W(可能为V+1)。
    • 服务器进入LAST_ACK状态,等待客户端最终确认。
  4. 第四次挥手(ACK确认反向关闭)
    • 客户端收到服务器的FIN后,发送TCP报文:
      • 标志位ACK=1,确认号Ack=W+1,序列号Seq=U+1
    • 客户端进入TIME_WAIT状态(持续2MSL时间),确认服务器收到后正式关闭。

关键点

  • 四次挥手而非三次:因TCP是全双工模式,双方需独立关闭数据流。
  • 2MSL(Maximum Segment Lifetime)等待
    • 确保最后一个ACK可靠到达服务器,防止连接异常中断。
    • 允许网络中未送达的数据包自然消亡,避免新旧连接混淆。

三、常见问题解答

  1. 为什么建立连接是三次握手,而关闭是四次挥手?
    • 三次握手:服务器收到客户端的SYN请求后,可同时发送SYN(同步序列号)和ACK(确认),因此合并为一次响应。
    • 四次挥手:服务器收到FIN后需先确认(ACK),但可能仍有数据待发送,需延迟发送FIN,导致分两步。
  2. TIME_WAIT状态的作用?
    • 防止延迟的重复FINACK干扰新连接(若立即关闭,可能误认为新连接数据是旧数据)。
    • 确保网络中的旧数据包彻底消失(2MSL通常是数据包的生存周期)。

总结

三次握手通过“请求-响应-确认”机制建立可靠连接,而四次挥手通过双向独立关闭确保数据完整性。理解这些机制是网络编程和故障排查的基础,尤其在处理连接延迟、丢包等问题时至关重要。

  • SYN 请求连接
  • ACK 已正确接收数据
  • FIN 是一种停止请求信号
  • Seq 是 序列号(Sequence Number)的缩写
  • Seq=X 中X是一个变量,
  • Ack 是 确认号 他也有自己的变量

TCP/IP协议中的三次握手和四次挥手是确保可靠连接建立与关闭的核心机制,其步骤数量经过精心设计,不能随意增减。以下是具体原因:

为什么三次握手不能减少到两次?

  1. 双向确认需求:
    ○ 第一次握手(客户端发SYN):服务器确认客户端的发送能力。
    ○ 第二次握手(服务器发SYN+ACK):客户端确认服务器的接收和发送能力。
    ○ 第三次握手(客户端发ACK):服务器确认客户端的接收能力。
    ○ 若减少为两次(如省略第三次握手):
    ■ 服务器无法确认客户端的接收能力,可能导致连接建立后,客户端无法接收服务器的数据,造成通信失败。
  2. 序列号同步:
    ○ 三次握手通过交换Seq和Ack号,确保双方初始序列号同步,避免后续数据传输混乱。
    ○ 两次握手无法完成双向同步,可能导致数据丢失或重复。

为什么三次握手不能增加到四次?

  1. 效率与资源消耗:
    ○ 三次握手已满足可靠性和同步需求,额外步骤会增加延迟和资源消耗(如TCP报文的传输和处理)。
  2. 无实际增益:
    ○ 第三次握手的ACK已确认双方状态,再次确认不会提升可靠性,反而可能引入更多潜在问题(如超时重传机制复杂性增加)。

为什么四次挥手不能减少到三次?

  1. 全双工特性:
    ○ TCP连接支持双向数据传输(如客户端和服务器可同时发送数据)。
    ○ 关闭需独立处理两个方向的数据流:
    ■ 第一次挥手:客户端停止发送数据(FIN)。
    ■ 第三次挥手:服务器停止发送数据(FIN)。
    ○ 若合并为三次(如服务器收到FIN后立即发FIN+ACK):
    ■ 服务器可能仍有数据未发送完,导致数据丢失。
    ■ 客户端无法区分FIN和ACK的合并响应,可能误判连接状态。
  2. 确保数据完整性:
    ○ 第二次挥手(ACK)确认客户端的关闭请求,允许服务器继续发送剩余数据。
    ○ 第三次挥手(FIN)通知客户端服务器已无数据发送,触发客户端进入TIME_WAIT状态等待确认。
    ○ 若减少步骤,可能无法保证所有数据已被传输和确认。

总结:

● 三次握手:通过三次交互确保双向通信能力和序列号同步,减少或增加步骤都会破坏可靠性或效率。
● 四次挥手:因TCP全双工特性,必须分别关闭两个方向的数据流,合并步骤可能导致数据丢失或未完成关闭。
这种设计平衡了可靠性、效率和复杂性,是TCP/IP协议核心机制的关键组成部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34762.html

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

相关文章

代码随想录Day16

Day16 二叉树part06 LeetCode 530.二叉搜索树的最小绝对差 题目描述 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的绝对值。 示例 输入:root [4,2,6,1,3] 输出&…

用通义大模型写爬虫程序,汇总各科成绩

需求:根据各科网址,输入学号、姓名查询成绩。 中间反反复复很多次,本文只记下重点的几次和大模型的沟通历史。 输入界面 查询界面 round0(最初的问题) 请在windows下,使用python的selenium库&#xff0…

Java算法OJ(12)

目录 1.前言 2.正文 2.1Fib数列 2.2单词搜索 2.3杨辉三角 3.小结 1.前言 哈喽大家好吖,今天来分享几道的练习题,欢迎大家在评论区多多交流,废话不多说让我们直接开始吧。 2.正文 2.1Fib数列 题目:斐波那契数列_牛客题霸…

使用傅里叶变换测量声卡的频率失真

文章目录 一、说明二、关于声卡的技术详述三、实验代码获取四、结论 一、说明 假如我希望使用我的声卡来模拟软件无线电,利用声音而不是射频信号。我的声卡能胜任这项任务吗?本文将研究一种技术来找出答案。另外,需要了解音频技术的读者也可…

LeetCode 解题思路 18(Hot 100)

解题思路: 继承 LinkedHashMap: 内置双向链表,自动维护节点的插入顺序和访问顺序。LRU 淘汰逻辑: 覆盖 removeEldestEntry,当元素数量超过 capacity 时,移除最旧条目。removeEldestEntry 方法提供钩子&…

JS基础部分

引入方式 内部脚本 外部脚本 变量 使用let声明变量,弱类型,使用const声明常量 因为箭头函数中this指针有问题,会默认指向父级对象 DOM 文档对象模型,将标记语言的各个部分封装成对应的对象。js通过dom就能够对html进行操作 …

Linux与深入HTTP序列化和反序列化

深入HTTP序列化和反序列化 本篇介绍 在上一节已经完成了客户端和服务端基本的HTTP通信,但是前面的传递并没有完全体现出HTTP的序列化和反序列化,为了更好得理解其工作流程,在本节会以更加具体的方式分析到HTTP序列化和反序列化 本节会在介绍…

QT入门笔记2

目录 一、前言 二、串口助手实现 2.1、串口 2.1.1、可用串口信息-QSerialPortInfo 2.1.2、打开串口-QSerialPort 2.1.3、串口发送接收信息 2.2、定时器-QTimer 2.3、常用属性类型转换(会更新) 2.4、子控件组规则命名优化 一、前言 这个是学习Q…

DeepSeek(3):DeepSeek R1 提示词⼯程

1 提示词⼯程 5W1H(What, Who, When, Where, Why, How)是⼀种常⽤的信息收集和指令下达的⽅法。以下是根据这个⽅法为DeepSeek R1模型下指令的例⼦,以“学习⼤模型应⽤开发”为例: (1)What(是什…

Linux入门 全面整理终端 Bash、Vim 基础命令速记

Linux入门 2025 超详细全面整理 Bash、Vim 基础命令速记 刚面对高级感满满的 终端窗口是不是有点懵?于是乎,这份手册就是为你准备的高效学习指南!我把那些让人头大的系统设置、记不住的命令都整理成了对你更友好的格式,让你快速学…

RBA+minibatch的尝试

目录 还是咬着牙来写 RBA了 JAX JAX->TORCH torch tensor的变形 pytorch怎么把一个【3,3,5】的tensor变成【3,10,5】,多的用0填充 pytorch如何把shape【100】转成【100,1】 把torch shape【100,1】变成【100】 SQUEEZE grad_fn 不能两次反向传播 还…

Jupyter notebook的安装与使用

jupyter notebook的安装需要在已经安装配置好的conda环境下 win r 打开运行窗口 输入cmd回车 在cmd窗口中输入以下命令 conda install jupyter notebook安装完成后启动 jupyter notebook 也是在cmd窗口 输入 : jupyter notebook运行成功后第一次打开的时候需要选择一个浏览…

如何在Ubuntu上构建编译LLVM和ISPC,以及Ubuntu上ISPC的使用方法

之前一直在 Mac 上使用 ISPC,奈何核心/线程太少了。最近想在 Ubuntu 上搞搞,但是 snap 安装的 ISPC不知道为什么只能单核,很奇怪,就想着编译一下,需要 Clang 和 LLVM。但是 Ubuntu 很搞,他的很多软件版本是…

特殊的数字排序

0特殊的数字排序 - 蓝桥云课 问题描述 小明被挑选去参加一个ACM比赛。他的任务是解决一个很特别的问题:给定一个整数数组,但是只能通过交换任意两个数的方式来排序。听起来很简单对吗?但是这个问题的难点在于,只有某些数字是可以…

汽车感性负载-智能高边钳位能量计算

随着汽车电子技术的发展,新的电子电气架构下,越来越多的执行部件在车身出现,比如电磁阀、风机、水泵、油泵、雨刮继电器等常用的执行器, 它们一般都表现为感性特点。驱动这些负载的最简单和最常见的方法是将它们连接到高边侧开关(…

量化交易学习笔记02:双均线策略

双均线策略示例 个股:中国平安 回测日期:2022-5-1至2023-5-1 短均线:5天 长无线:10天 代码: def initialize(context):# 初始化此策略# 设置我们要操作的股票池, 这里我们只操作一支股票# """标的&qu…

利用余弦相似度在大量文章中找出抄袭的文章

我前面的2篇文章分别讲了如果利用余弦相似度来判断2篇文章的相似度,来确定文章是否存在抄袭,和余弦相似度的原理,即余弦相似度到底是怎么来判断文章的相似性高低的等等。这一篇再说下,对于文章字数多和大量文章时,如果…

在 Kaggle 中绘制中文乱码解决

在 Kaggle 中绘制中文时,需要设置 Matplotlib 的字体,否则中文会显示为乱码。可以使用 SimHei(黑体)或 Microsoft YaHei(微软雅黑)。 解决方案 使用 matplotlib 设置中文字体在 Kaggle 安装 SimHei 字体 …

在 Ubuntu 服务器上使用宝塔面板搭建博客

📌 介绍 在本教程中,我们将介绍如何在 Ubuntu 服务器 上安装 宝塔面板,并使用 Nginx PHP MySQL 搭建一个博客(如 WordPress)。 主要步骤包括: 安装宝塔面板配置 Nginx PHP MySQL绑定域名与 SSL 证书…

Linux线程

1.线程概念 在一个程序里的一个执行路线就叫做线程(thread),更准确定义:线程是一个进程内部的控制序列 进程至少有一个执行路线,线程在进程内部运行,本质是在进程地址空间内运行,在Linux系统中,CPU眼中&a…