关于TCP三次握手和四次挥手过程中的状态机、使用三次握手和四次挥手的原因、拥塞控制

关于传输层中的TCP协议,我们在之前的博客中对其报文格式、三次握手、四次挥手、流量控制、数据传输等机制进行了具体说明,接下来在前面所学的基础上,我们再来讲讲TCP中三次握手和四次挥手各阶段所处的状态机以及为什么要使用三次握手和四次挥手?最后再来补充TCP的拥塞控制。

TCP三次握手和四次挥手过程中的状态机

三次握手

三次握手详细过程如下:

  1. 在未进行三次握手时,客户端和服务端都处于closed状态,当客户端主动发起连接时,服务端被动打开,进入listen状态。客户端发送SYN置位,seq=x的包,表示想和服务端建立连接,称为第一次握手,随即客户端接入SYN_SENT状态;
  2. 服务端收到包后,立即回复SYN、ACK置位,seq=y,ack=x+1的包,表示同意和客户端建立连接,并且自己也想和客户端建立连接,称为第二次握手,随即进入SYN_RCVD状态;
  3. 客户端收到包后,发送ACK置位,seq=x+1,ack=y+1的包,表示同意和服务端建立连接,称为第三次握手,随即进入established状态;
  4. 服务端收到包后,也进入established状态,TCP连接成功建立。

三次握手中的哪一次握手可以开始传输数据?

第三次握手,表示客户端和服务器都建立了连接,客户端可以携带要传输的数据。

四次挥手

四次挥手详细过程如下:

  1. 当客户端数据传输完毕后,主动发送FIN置位,seq=u的包,表示想和服务端断开连接,称为第一次挥手,随即客户端接入FIN WAIT1状态;
  2. 服务端收到包后,回应一个ACK置位,seq=v,ack=u+1的包,表示同意和客户端断开连接,称为第二次挥手,随即服务端接入CLOSE WAIT状态;
  3. 客户端收到包后,进入FIN WAIT2状态;
  4. 等待服务端的数据传输完毕后,服务端主动发送FIN、ACK置位,seq=w,ack=u+1的包,表示想和客户端断开连接,称为第三次挥手,随即服务端进入LAST ACK状态;
  5. 客户端收到包后,回应一个ACK置位,seq=u+1,ack=w+1的包,表示同意和服务端断开连接,称为第四次挥手,随即进入TIME WAIT状态;
  6. 服务端收到包后,进入closed状态;
  7. 等待TIME WAIT时间结束后,客户端也进入closed状态,TCP连接成功断开。

为什么客户端要等待TIME WAIT时间?

为了确保同意断开连接的响应能安全发送到服务端,避免造成服务端收不到响应而无法关闭连接。

图片来源:TCP三次握手与四次挥手详解_三次握手和四次挥手-CSDN博客

使用三次握手和四次挥手的原因

三次握手

为什么TCP建立连接要使用三次握手,而不是两次握手、四次握手?

为了避免历史连接、避免服务器资源浪费、同时也为了初始化序列号。

  1. 避免历史连接:在IP网络中传输的数据是不安全的、无序的,当客户端发送的第一个连接请求由于网络延迟导致比第二个连接请求晚到服务端时,服务端对两个连接请求都进行了回应,如果此时采用两次握手的话,客户端无法判断出服务端回应的是哪一个请求,就造成了历史连接。如果采用三次握手的话,客户端就能够判断出服务端是对哪一个请求进行回应,就可以避免历史连接。
  2. 避免服务器资源浪费:如果TCP连接采用的是两次握手,当客户端的连接请求在网络中阻塞,客户端没有接收到确认报文,就会重新发送连接请求 ,由于没有第三次握手,服务器不清楚客户端是否收到了自己发送的确认信号,所以每收到一个 SYN 就只能先主动建立一个连接,那么服务器在收到请求后就会建立多个冗余的无效链接,造成资源浪费。若是采用三次握手,就不会产生这种情况。
  3. 初始化序列号:序列号在 TCP 连接中有着非常重要的作用,当客户端发送携带序列号的连接请求的时候,需要服务端回应确认报文,表示客户端的请求报文已被服务端成功接收,那当服务端发送携带序列号的连接请求给客户端时,依然也要得到客户端的回应,这样一来一回,确保双方的初始序列号能被可靠的同步,以上这种情况就需要进行三次握手。

四次挥手

为什么TCP连接断开需要使用四次挥手,而不是两次挥手、三次挥手?

因为TCP连接建立的是双向的连接,既有客户端到服务端的连接,也有服务端到客户端的连接,而一个方向的连接断开就需要请求和应答两个报文,所以TCP断开连接就需要四个报文,即四次挥手。

拥塞控制

TCP有了流量控制之后为什么还需要拥塞控制?

因为流量控制的作用是为了解决发送方和接收方速度不一致而导致数据丢失的问题,即两个端点的问题,而拥塞控制是为了解决太多的数据注入到网络中而导致网络崩溃的问题,即两个端点中间链路的问题。

流量控制方式:由接收端采用滑动窗口的形式,告知发送方允许/停止发包解决TCP丢包问题。

拥塞控制方式:由发送方采用拥塞窗口的形式去判断网络状态,从而采取不同算法执行TCP动态发包解决网络整体质量问题。

拥塞控制的四种算法:

  • 慢开始
  • 拥塞避免
  • 超时重传
  • 快重传和快恢复

具体原理请参考:TCP流量控制和拥塞控制详解!图解分,两分钟搞定TCP知识点!-CSDN博客

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

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

相关文章

学习笔记二十——Rust trait

🧩 Rust Trait 彻底搞懂版 👀 目标读者:对 Rust 完全陌生,但想真正明白 “Trait、Trait Bound、孤岛法则” 在做什么、怎么用、为什么这样设计。 🛠 方法: 先给“心里模型”——用生活类比把抽象概念掰开揉…

es 混合检索多向量

在结合向量相似度检索的同时,可以通过 bool 查询的 filter 或 must 子句实现关键词过滤。以下是一个同时包含 关键词匹配 和 多向量相似度计算 的完整示例: 参考博文:ES集群多向量字段检索及混合检索方法-CSDN博客 示例:带关键词过滤的多向量联合检索 GET /my_index/_sea…

HTML5好看的水果蔬菜在线商城网站源码系列模板4

文章目录 1.设计来源1.1 主界面1.2 关于我们1.3 商品信息1.4 新闻资讯1.5 联系我们1.5 登录注册 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/147264262 HTML5好看的水果…

Kubernetes(k8s)学习笔记(二)--k8s 集群安装

1、kubeadm kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具。这个工具能通过两条指令完成一个 kubernetes 集群的部署&#xff1a; 1.1 创建一个 Master 节点$ kubeadm init 1.2 将一个 Node 节点加入到当前集群中$ kubeadm join <Master 节点的 IP 和…

AI数据分析的优势分析

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经深入渗透到数据分析领域&#xff0c;为各行各业带来了前所未有的变革。AI数据分析作为一种新兴的技术手段&#xff0c;通过运用机器学习、深度学习等算法对海量数据进行挖掘和分析&#xff0c;显著提升了…

leetcode(01)森林中的兔子

今天开始记录刷题的过程&#xff0c;每天记录自己刷题的题目和自己的解法&#xff0c;欢迎朋友们给出更多更好的解法。 森林中的兔子 森林中有未知数量的兔子&#xff0c;提问其中若干只兔子“还有多少只兔子与你&#xff08;被提问的兔子&#xff09;颜色相同”。将答案收集到…

基于SpringBoot+Vue实现的旅游景点预约平台功能一

一、前言介绍&#xff1a; 1.1 项目摘要 随着人们生活水平的提高和休闲时间的增多&#xff0c;旅游已经成为人们生活中不可或缺的一部分。旅游业作为全球经济的重要支柱&#xff0c;其发展趋势呈现出数字化、网络化和智能化的特点。传统的旅游服务方式&#xff0c;如人工预约…

【支付】支付宝支付

下面为你详细介绍使用 Spring Boot 对接支付宝支付&#xff0c;实现支付与退款功能的具体步骤和代码示例。 添加依赖 在 pom.xml 里添加支付宝 SDK 依赖&#xff1a; <dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframewo…

shell 正则表达式与文本处理器

目录 前言 一、正则表达式 &#xff08;一&#xff09;定义与用途 &#xff08;二&#xff09;基础正则表达式 &#xff08;三&#xff09;基础正则表达式元字符 &#xff08;四&#xff09;扩展正则表达式 二、文本处理器&#xff1a;Shell 编程的得力助手 &#xff0…

ASP.NET Core 最小 API:极简开发,高效构建(上)

一、概述 构建最小 API&#xff0c;以创建具有最小依赖项的 HTTP API。 它们非常适合于需要在 ASP.NET Core 中仅包括最少文件、功能和依赖项的微服务和应用。 本文介绍使用 ASP.NET Core 生成最小 API 的基础知识&#xff0c;将创建以下 API&#xff1a; API&#xff08;应用…

Apache Parquet 文件组织结构

简要概述 Apache Parquet 是一个开源、列式存储文件格式&#xff0c;最初由 Twitter 与 Cloudera 联合开发&#xff0c;旨在提供高效的压缩与编码方案以支持大规模复杂数据的快速分析与处理。Parquet 文件采用分离式元数据设计 —— 在数据写入完成后&#xff0c;再追加文件级…

IntelliJ IDEA 2025.1 发布 ,默认 K2 模式 | Android Studio 也将跟进

2025.1 版本已经发布&#xff0c;在此之前我们就聊过该版本的 《Terminal 又发布全新重构版本》&#xff0c;而现在 2025.1 中的 K2 模式也成为了默认选项。 可以预见&#xff0c;这个版本可能会包含不少大坑&#xff0c;为下个 Android Studio 祈祷。 首先有一点可以确定&…

云效部署实现Java项目自动化部署图解

前言 记录下使用云效部署Java项目&#xff0c;实现java项目一键化自动化部署。 云效流程说明&#xff1a; 1.云效拉取最新git代码后 2.进行maven编译打包后&#xff0c;上传到指定服务器目录 3.通过shell脚本&#xff0c;先kill java项目后&#xff0c;通过java -jar 启动项…

国际数据加密算法(IDEA)详解

以下是修正后的准确版本,已解决原文中的术语、符号及技术细节问题: ​国际数据加密算法(IDEA)​ IDEA是一种分组加密算法,由Xuejia Lai(来学嘉)和James Massey于1990年设计。IDEA使用128位密钥对64位明文分组进行加密,经过8轮迭代运算后生成64位密文分组。其安全性基于…

TensorFlow介绍

TensorFlow 是由 Google 开发 的开源机器学习框架&#xff0c;主要用于构建、训练和部署机器学习模型。它支持深度学习、传统机器学习和数值计算&#xff0c;适用于图像识别、自然语言处理&#xff08;NLP&#xff09;、推荐系统、强化学习等多种任务。 核心特性 基于 数据流…

百级Function架构集成DeepSeek实践:Go语言超大规模AI工具系统设计

一、百级Function系统的核心挑战 1.1 代码结构问题 代码膨胀现象&#xff1a;单个文件超过2000行代码路由逻辑复杂&#xff1a;巨型switch-case结构维护困难依赖管理失控&#xff1a;跨Function依赖难以追踪 // 传统实现方式的问题示例 switch functionName { case "fu…

嵌入式芯片中的 SRAM 内容细讲

什么是 RAM&#xff1f; RAM 指的是“随机存取”&#xff0c;意思是存储单元都可以在相同的时间内被读写&#xff0c;和“顺序访问”&#xff08;如磁带&#xff09;相对。 RAM 不等于 DRAM&#xff0c;而是一类统称&#xff0c;包括 SRAM 和 DRAM 两种主要类型。 静态随机存…

标准的JNI (Java Native Interface) 加载函数 JNI_OnLoad

1.JNI_OnLoad 在 Android Native 开发中&#xff0c;JNI_OnLoad 是动态注册本地方法的标准入口点。以下是一个标准实现示例及其说明&#xff1a; JNI_OnLoad 标准实现 #include <jni.h> #include <string>// 声明本地方法对应的 C/C 函数 jint native_add(JNIEnv…

算法导论思考题

2-1 在归并排序中对小数组采用插入排序 c. 假定修改后的算法的最坏情况运行时间为 Θ \Theta Θ(nknlg(n/k))&#xff0c;要使修改后的算法与标准的归并排序具有相同的运行时间&#xff0c;作为n的一个函数&#xff0c;借助 Θ \Theta Θ记号&#xff0c;k的最大值是什么&#…

JavaScript 性能优化

JavaScript 性能优化是提高 Web 应用性能的关键步骤,特别是在处理大量数据、复杂计算或频繁的 DOM 操作时。以下是一些常见的 JavaScript 性能优化技巧和策略: 文章目录 @[TOC]一、代码层面优化1. **减少全局变量**2. **避免使用 `with` 语句**3. **使用局部变量**4. **减少 …