当前位置: 首页 > news >正文

为何要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 🌺

相关文章:

  • 02.PostgreSQL 查询处理期间发生了什么?
  • 实现一个简单的网络通信下(udp)
  • 计算机网络——传输层
  • C++ 智能指针和内存管理:使用指南和技巧
  • 鸿蒙App开发 HarmonyOS:网络请求+三方库使用+底栏切换+列表+Banner
  • Python 错误 TypeError: __str__ Returned Non-String but Printing Output
  • Redis中缓存穿透、击穿、雪崩以及解决方案
  • PHP如何实现邮箱验证
  • 如何解决ajax浏览器缓存
  • 微信小程序保存二维码的过程
  • 构建第一个ArkTS应用(纯HarmonyOS应用)
  • 打印菱形图案C语言
  • C++服务器 支持http、tcp protobuf、websocket,linux开源框架 零依赖轻松编译部署 Reactor
  • SCAU:前一个和后一个字符
  • JAVA代码优化:Easy Excel(操作Excel文件的开源工具)
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【知识碎片】第三方登录弹窗效果
  • 10个最佳ES6特性 ES7与ES8的特性
  • 77. Combinations
  • const let
  • C学习-枚举(九)
  • exif信息对照
  • iOS 系统授权开发
  • JAVA多线程机制解析-volatilesynchronized
  • Promise面试题,控制异步流程
  • text-decoration与color属性
  • Unix命令
  • vue-cli在webpack的配置文件探究
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 今年的LC3大会没了?
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 世界上最简单的无等待算法(getAndIncrement)
  • 我感觉这是史上最牛的防sql注入方法类
  • 物联网链路协议
  • 正则表达式
  • Spring Batch JSON 支持
  • 阿里云ACE认证之理解CDN技术
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • (Python第六天)文件处理
  • (离散数学)逻辑连接词
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (利用IDEA+Maven)定制属于自己的jar包
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)RocketMQ初步认识
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)setTimeout 和 setInterval 的区别
  • **python多态
  • .net core控制台应用程序初识
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .net开发引用程序集提示没有强名称的解决办法
  • [Angularjs]ng-select和ng-options