为何要3次握手?TCP协议的稳定性保障机制

🚀 作者主页: 有来技术
🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot
🌺 仓库主页: Gitee 💫 Github 💫 GitCode
💖 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请纠正!

目录

  • 引言
  • 为什么需要3次握手建立TCP连接?
    • 1. 第一次握手:建立连接请求
    • 2. 第二次握手:确认连接请求
    • 3. 第三次握手:确认连接接受
    • 为什么不采用2次握手建立连接?
  • 为什么需要4次挥手断开TCP连接?
    • 1. 第一次挥手:发起关闭连接
    • 2. 第二次挥手:确认关闭请求
    • 3. 第三次挥手:发起关闭确认
    • 4. 第四次挥手:确认关闭确认
    • 为什么不采用3次挥手断开连接?
  • 结语
  • 开源项目

引言

TCP(Transmission Control Protocol)是计算机网络中一种可靠的传输协议,负责确保数据的可靠传输。TCP连接的建立和断开过程分别通过3次握手和4次挥手来完成。本文将深入探讨为什么TCP需要进行3次握手来建立连接,以及为何在断开连接时采用4次挥手而不是2次握手和3次挥手。

为什么需要3次握手建立TCP连接?

在这里插入图片描述

1. 第一次握手:建立连接请求

在进行TCP连接时,客户端首先向服务器发送连接请求,这是第一次握手。这一步的目的是告诉服务器客户端想要建立连接,并初始化一些参数,如序列号等。

2. 第二次握手:确认连接请求

服务器收到客户端的连接请求后,进行确认并发送自己的连接请求给客户端,这是第二次握手。这一步的目的是告诉客户端服务器接受连接请求,并同样初始化一些参数。

3. 第三次握手:确认连接接受

客户端收到服务器的连接请求后,进行确认,这是第三次握手。这一步的目的是确保双方都已准备好建立连接。此时,双方都知道对方已成功接受连接。

为什么不采用2次握手建立连接?

如果只进行2次握手,客户端发送连接请求,服务器确认后即建立连接。但这样存在的问题是,如果确认的消息在网络中滞留,客户端会认为连接已建立,而服务器不清楚,可能导致连接的不确定性和不稳定性。因此,3次握手是为了确保双方都确认了连接的建立,降低了不确定性。

为什么需要4次挥手断开TCP连接?

在这里插入图片描述

1. 第一次挥手:发起关闭连接

在断开连接时,任一一方可以发起关闭连接的请求,这是第一次挥手。发起方发送带有FIN(Finish)标志的报文,表示不再发送数据。

2. 第二次挥手:确认关闭请求

接收到关闭请求的一方发回确认,并可以继续发送数据,这是第二次挥手。此时,接收方通告自己已经准备好关闭连接,但仍可发送剩余的数据。

3. 第三次挥手:发起关闭确认

接收方在完成发送数据后,发起关闭确认请求,这是第三次挥手。该请求包含FIN标志,表示不再发送数据。

4. 第四次挥手:确认关闭确认

发起方接收到关闭确认请求后,发回确认,并等待一段时间以确保对方已经接收到关闭确认,这是第四次挥手。之后,双方的连接才算正式关闭。

为什么不采用3次挥手断开连接?

如果只进行3次挥手,发起方发送关闭请求,接收方发回确认后即关闭连接。但这样可能存在一些未完成的数据传输,因为接收方在发送确认后仍可以继续发送数据。通过引入第四次挥手,确保双方都完成了关闭确认,避免了可能的数据残留和不确定性。

结语

TCP连接的3次握手和4次挥手是为了确保连接的建立和断开的稳定性和可靠性。通过这些握手和挥手步骤,TCP协议能够有效地管理连接,保障数据的可靠传输。虽然增加了握手和挥手的次数,但这是为了防范可能出现的问题,确保网络通信的可靠性和稳定性。在实际应用中,这种权衡是TCP协议成功的关键之一。

开源项目

  • SpringCloud + Vue3 微服务商城
GithubGitee
后端youlai-mall 🍃youlai-mall 🍃
前端mall-admin🌺mall-admin 🌺
移动端mall-app 🍌mall-app 🍌
  • SpringBoot 3+ Vue3 单体权限管理系统
GithubGitee
后端youlai-boot 🍃youlai-boot 🍃
前端vue3-element-admin 🌺vue3-element-admin 🌺

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

绝地求生在steam叫什么?

绝地求生在Steam的全名是《PlayerUnknowns Battlegrounds》,简称为PUBG。作为一款风靡全球的多人在线游戏,PUBG于2017年3月23日正式上线Steam平台,并迅速成为一部热门游戏。 PUBG以生存竞技为核心玩法,玩家将被投放到一个辽阔的荒…

布林线BOLL的实战应用技巧

一、认识布林线BOLL 布林线BOLL,又称布林带,是股市中非常常用的一个技术指标。 以金斗云智投电脑版软件为例,任意打开一支个股,选择BOLL指标,在K线区域就可以看到上中下排列的3条线,这3条线就组成了布林带。…

【Three.js】创建CAD标注线

目录 📖前言 🐞创建箭头对象 🐬创建文字 👻箭头两端的线段 ✈️封装方法 📖前言 CAD标注线在工程和制造领域中被广泛用于标记零部件、装配体和机械系统的尺寸、距离、角度等信息。它们帮助工程师和设计师更好地理…

web自动化 -- selenium及应用

selenium简介 随着互联网的发展,前端技术不断变化,数据加载方式也不再是通过服务端渲染。现在许多网站使用接口或JSON数据通过JavaScript进行渲染。因此,使用requests来爬取内容已经不再适用,因为它只能获取服务器端网页的源码&am…

计算机网络体系的形成

目录 1、开放系统互连参考模型OSI/RM 2、两种国际标准 3、协议与划分层次 4、网络协议的三要素 5、划分层次 (1)文件发送模块使两个主机交换文件 (2)通信服务模块 (3)接入网络模块 6、分层带来的好…

Linux下Python调用C语言

一:Python调用C语言场景 1,已经写好的C语言代码,不容易用Python实现,想直接通过Python调用写好的C语言代码 2,C比Python快(只是从语言层面,不能绝对说C程序就是比Python快) 3&…

docker配置redis插件

docker配置redis插件 运行容器redis_6390 docker run -it \ --name redis_6390 \ --privileged \ -p 6390:6379 \ --network wn_docker_net \ --ip 172.18.12.19 \ --sysctl net.core.somaxconn1024 \ -e TIME_ZONE"Asia/Shanghai" -e TZ"Asia/Shanghai"…

电磁兼容EMC理论基础汇总

目录 0. 序言 1. EMC的基础介绍 1.1 EMC电磁兼容的定义 1.2 EMC的重要性 1.3 EMC的三要素 2. 库仑定律 3. 趋肤效应与趋肤深度 4. 电阻抗公式 4.1 电阻 4.2 容抗 4.3 感抗 4.4 电路元件的非理想性 5. 麦克斯韦方程组 5.1 高斯磁定律 5.2 高斯定律 5.3 法拉…

【FPGA】Verilog:二进制并行加法器 | 超前进位 | 实现 4 位二进制并行加法器和减法器 | MSI/LSI 运算电路

Ⅰ. 前置知识 0x00 并行加法器和减法器 如果我们要对 4 位加法器和减法器进行关于二进制并行运算功能,可以通过将加法器和减法器以 N 个并行连接的方式,创建一个执行 N 位加法和减法运算的电路。 4 位二进制并行加法器 4 位二进制并行减法器 换…

YoloV8改进策略:Swift Parameter-free Attention,无参注意力机制,超分模型的完美迁移

摘要 https://arxiv.org/pdf/2311.12770.pdf https://github.com/hongyuanyu/SPAN SPAN是一种超分网络模型。SPAN模型通过使用参数自由的注意力机制来提高SISR的性能。这种注意力机制能够增强重要信息并减少冗余,从而在图像超分辨率过程中提高图像质量。 具体来说,SPAN模…

J-Link RTT的使用(原理 + 教程 + 应用 + 代码)

MCU:STM32F407VE MDK:5.29 IAR:8.32 目录--点击可快速直达 目录 写在前面什么是RTT?RTT的工作原理RTT的性能快速使用教程高级使用教程附上测试代码2019年12月27日更新--增加打印float的功能 写在前面 本文介绍了J-Link RTT的部分使用内容,很多地方参考和使用…

ImportError: cannot import name ‘metadata‘ from ‘importlib‘

yolov8 编译问题 ImportError: cannot import name ‘metadata’ from ‘importlib’ 将 from importlib import metadata 更改为 import importlib_metadata as metadata

canvas绘制单个圆和同心圆

代码实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdev…

【Java 基础】18 I/O流

文章目录 1.基本概念2.字节流3.字符流4.标准输入输出5.最佳实践 I/O流&#xff08;Input/Output 流&#xff09;是计算机程序中不可或缺的一部分&#xff0c; 往大了说所有的操作都是IO。Java 提供了强大而灵活的 I/O 框架&#xff0c;支持各种数据的 读取和 写入操作。 1.基…

网络安全--网络环境构成,系统的安全

2. 网络攻防环境 目标 了解攻防环境构成了解入侵检测系统&#xff08;平台&#xff09;的部署位置 2.1. 环境构成 2.1.1. 环境框图 一个基本的网络攻防实验环境包括&#xff1a;靶机、攻击机、入侵检测分析系统、网络连接四部分组成。 一个基础的网络攻防实验环境需要如下…

Mybatis 操作续集(结合上文)

当我们增加一个数据之后,如果我们想要获取它的 Id 进行别的操作,我们该如何获取 Id 呢? 用那个Options package com.example.mybatisdemo.mapper;import com.example.mybatisdemo.model.UserInfo; import org.apache.ibatis.annotations.*;import java.util.List;Mapper pub…

Leetcode刷题详解——乘积为正数的最长子数组长度

1. 题目链接&#xff1a;1567. 乘积为正数的最长子数组长度 2. 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你求出乘积为正数的最长子数组的长度。 一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。 请你返回乘积为正数的最长子数组长度。 示…

java面向对象 + 内存解析

这篇博客主要是重点讲解一些内存和一些规定的解释&#xff0c;对于定义我不会过多赘述&#xff0c;没有Java基础的话可以去翻看我之前的博客&#xff0c;学习完成之后再进行阅读。 面向对象可以说是Java中最重要的一部分了&#xff0c;这次复习我发现有几个点比较重要&#xf…

【Rust日报】2023-12-02 深度学习框架 Burn 发布 v0.11.0

深度学习框架 Burn 发布 v0.11.0 深度学习框架 Burn 发布 v0.11.0&#xff0c;新版本引入了自动内核融合&#xff08;Kernel Fusion&#xff09;功能&#xff0c;大大提升了访存密集型&#xff08;memory-bound&#xff09;操作的性能。同时宣布成立 Tracel AI (https://tracel…

深入理解 Kafka 集群搭建与管理

Apache Kafka 作为分布式流处理平台的核心&#xff0c;其集群搭建与管理是确保高可用性和高性能的关键。本文将深入研究 Kafka 集群的构建、配置、工作原理、节点角色以及一些高级管理策略&#xff0c;以助力读者更深层次地理解和灵活运用 Kafka 集群。 Kafka 集群基础 1 集群…