网络编程5——TCP协议的五大效率机制:滑动窗口+流量控制+拥塞控制+延时应答+捎带应答

文章目录

  • 前言
  • 一、TCP协议段与机制
    • TCP协议的特点
    • TCP报头结构
    • TCP协议的机制与特性
  • 二、TCP协议的 滑动窗口机制
  • 三、TCP协议的 流量控制机制
  • 四、TCP协议的 拥塞控制机制
  • 五、TCP协议的 延时应答机制
  • 六、TCP协议的 捎带应答机制
  • 总结


前言

本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下!

本文讲解了TCP在保证安全可靠的前提下,提高效率的五大机制。


一、TCP协议段与机制

TCP协议的特点

特点说明
有连接刻意保存对端的相关信息
可靠传输尽全力将数据传输过去不是百分百成功,自己会知道数据传输是否成功
面向字节流以一个字节为基本单位(一个数据可以分成几份 多次发多次收)
有接收缓冲区,也有发送缓冲区后续文章介绍
大小不受限对于要传输的数据大小没有要求
全双工一条通信路径,双向通信。(可以同时发送和接收数据)

TCP报头结构

在这里插入图片描述

6位标志位
在这里插入图片描述


TCP协议的机制与特性

TCP的协议段格式,比UDP的协议段格式复杂一万倍!😵😵
所以他的机制与功能也比UDP更加强大!!😇😇

TCP对数据传输提供的管控机制,主要体现在两个方面: 安全和效率
这些机制和多线程的设计原则类似: 保证数据传输安全的前提下,尽可能的提高传输效率

TCP协议的机制与特性
1️⃣确认应答
2️⃣超时重传
3️⃣连接管理
4️⃣滑动窗口
5️⃣流量控制
6️⃣拥塞控制
7️⃣延时应答
8️⃣捎带应答
9️⃣面向字节流
🔟异常处理

  • 1️⃣-5️⃣是TCP协议保证数据传输安全的 安全机制
  • 6️⃣-8️⃣是TCP协议提高传输效率的 效率机制
  • 9️⃣-🔟是TCP协议的 其他特性

二、TCP协议的 滑动窗口机制

TCP协议中确认应答机制,对每一个发送的数据段,都要给一个ACK确认应答。收到ACK后再发送下一个数据段。
这样做有一个比较大的缺点,就是性能较差。

在这里插入图片描述

如上图,如果在数据往返的时间较长的时候,等待数据送达后,还要再等待ACK,这一来一返的时间就浪费了,后面要发送的数据全都得等着排队,效率就不高。


因此为了在保证可靠传输的前提下尽可能的提高效率,就引入了 滑动窗口机制

在这里插入图片描述

如上图,规定可以批量传输数据(同时发送多个数据段)。
相当于有一个窗口,窗口里的数据都可以同时发送,这些数据段的大小加在一起等于窗口大小。


假设窗口大小为4000个字节,每条数据段的大小为1000字节。

同时发送4个数据段,然后等待ACK,等到了一个呢,就可以证明有1个大小为1000个字节的数据段,送到了,那么此时就是只有3个数据段,3000个字节大小的数据在发送中。

但是窗口大小为4000个字节,所以我还可以再同时发送1000个字节的数据。窗口向下移动,再发送一个数据大小为1000字节的数据段。

这就是滑动窗口的原理: 规定一个窗口可以同时发送多少数据,当有ACK返回,确定有多少数据送到了,就再发送多少数据,从而达到了提高效率的目的。 规当传输速度足够快时,那么窗口就变成了滑动,因此叫做窗口滑动。


那么如果发生了丢包怎么办?

第一种情况:ACK丢包了

在这里插入图片描述

如上图,前三个ACK都丢包了,那也毫无影响,只要第四个ACK送达了,就没啥,因为ACK中的确认序号就是告诉他,确实序号之前的字节都收到了,因此只要最后一个ACK没丢就没事。

如果是最后一个包丢了,或者是最后几个都丢了,那就会触发超时重传机制。TCP安全第一位


第二种情况:数据丢包了

此时采取的策略为:只重传丢了的数据,不丢的数据不重传。
这个策略也称之为快速重传。

在这里插入图片描述

如上图,第二个数据段丢了,那么 后续所有应答报文中的确认序号就会一直是1001(即索要1001及以后的数据), 不会因为2001-3000送达而改变,会一直保持到1001以后的数据送到。

在这里插入图片描述

主机B当中会有一个接收缓冲区,采用特定的数据结构去组织这些收到的数据, 当1001-2000的数据送达时, 会自动排序调整位置。然后ACK中的确认序号就继续变为4001。

使用数据会从缓冲区当中拿数据,但是如果传输速度太快,那么缓冲区也会满。
如果缓冲区满了,你再发送过来数据,不会阻塞等待而是将你发来的数据直接丢掉,这就造成了效率浪费。


这就引出了另外两个个效率机制:流量控制机制与拥塞控制机制。


三、TCP协议的 流量控制机制

流量控制机制也对保证可靠传输有一定作用。

窗口滑动机制,提高了效率。但是接收缓冲区的空间也有限,如果接收缓冲区满了,那么再传输数据也是丢包,此时还不如传的慢一点。

所以啊就有了流量控制机制。

流量控制机制: 让报文中携带一个"窗口大小"这样的字段,来进行流量控制,只有ACK标志位为1时,即ACK报文才会生效

"窗口大小"的作用:建议发送方的滑动窗口大小(建议不是一定,但是作用也很大)

接收缓冲区满了,即"窗口大小"为0: 发送方暂停发送,每隔一段时间发一个窗口探测报文,如果"窗口大小"不是0了,就继续发送。


四、TCP协议的 拥塞控制机制

一条数据由一台设备发送到另一台设备中,这中间序列经过一系列的中间节点(很多个交换机和路由器)。

如果传输路径上的任何一个节点的发送能力遇到瓶颈(收发数据太多等问题),那么对经过这个节点的数据的传输速率都会产生明显的影响。
即数据传输的快不快,取决于整体路径上最慢的节点(木桶效应)。

拥塞控制: 衡量中间节点(传输路径上发送方与接收方之外的节点)的传输能力,得出一个拥塞窗口大小 ,来避免因为个别节点拉跨而带来的效率浪费。

因为网络环境复杂,每次传输可能走的路径都不同,且各个节点的传输能力也不是一成不变的(用户多时,可能就慢,用户少时,可能就快)。
因此拥塞窗口的计算方法是实验法:通过实验的方式,找到一个合适的发送速率,实现动态平衡。

拥塞窗口的计算方法:
1️⃣:开始时,以一个小速率来传输数据。
2️⃣:如果没有发送丢包,慢慢加快这个速率。
3️⃣:如果出现丢包,立即把速率再减小。
4️⃣:重复2️⃣3️⃣。

感兴趣的朋友可以去搜一下具体的计算方法。

“窗口大小” 取 流量控制(衡量接收方的处理能力) 拥塞控制(衡量中间节点的处理能力) 这两个中最小的那一个。


五、TCP协议的 延时应答机制

延时应答机制:将确认应答机制中的ACK应答报文,延时发送。

为什么延时发送ACK会提高效率呢?

TCP中决定传输效率的关键元素是"窗口大小"。
"窗口大小"取决与流量控制与拥塞控制。
而流量控制就取决于接收方的接收缓冲区。


这里咱们要搞清楚一个事情:
发送方一直发送数据(一直生产),而应用程序一直从接收方的接收缓冲区中读取数据(一直消费)。


如果立刻返回ACK,那么ACK的"窗口大小"假设为n
如果稍微等一会会,那么等的这一会,应用程序就会在这一会中消费一些数据,因此再返回ACK,那么"窗口大小"就大概率会比n大。


所以通过延时一会发送ACK,使得ACK中的"窗口大小"变大一点,传输速率也就快一点。

不是所有的包都可以延迟应答

  • 数量限制:每隔N个包就应答一次(操作系统不同N也各有差异)
  • 时间限制:超过最大延迟时间就应答一次

六、TCP协议的 捎带应答机制

捎带应答机制是基于延时应答机制开发的。

一般客户端服务器模型都是一问一答的形式。 即客户端发送一个请求request,服务器返回一个响应response。

正常流程:

1️⃣客户端向服务器发送一个request。
2️⃣服务器收到reques,并返回一个应答报文ACK
3️⃣服务器返回一个response
4️⃣客户端收到response,并返回一个应答报文

基于延时应答于捎带应答机制:

1️⃣客户端向服务器发送一个request。
2️⃣服务器收到reques(延时应答,让ACK暂缓发送)
3️⃣服务器返回一个 (response+ACK)报文 (如果response在ACK发送前就计算完毕,那么就会触发捎带应答机制,把response与ACK合并)
4️⃣客户端收到(response+ACK)报文,并返回一个应答报文

四次挥手有可能是三次挥手也与上述流程相同。

发送一个一定比发送两个快,所以效率得到了提高。


总结

以上就是今天要讲的内容,本文分享了TCP协议的五大效率机制,讲述了TCP在保证安全可靠的前提下是如何提高效率的,尽管如此,TCP的效率仍然没有UDP快,保证安全可靠必然会牺牲一部分效率。

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

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

相关文章

RabbitMQ在SpringBoot中的高级应用(2)

过期时间 1.单独的设置队列的存活时间,队列中的所有消息的过期时间一样 Bean//创建交换机public DirectExchange ttlQueueExchange(){// 交换机名称 是否持久化 是否自动删除return new DirectExchange("ttl_queue_log",true,false);}Bean//创建队列publ…

吴恩达ChatGPT《LangChain for LLM Application Development》笔记

基于 LangChain 的 LLM 应用开发 1. 介绍 现在,使用 Prompt 可以快速开发一个应用程序,但是一个应用程序可能需要多次写Prompt,并对 LLM 的输出结果进行解析。因此,需要编写很多胶水代码。 Harrison Chase 创建的 LangChain 框…

需求分析引言:架构漫谈(五)架构师成长之路

我研发领域也从事了一些年,期间也做过一些架构设计工作,包括C#单体转型为Java微服务、Python单体转型为Java微服务等, 也尝试着从自己的经验角度,来汇总一些知识点,同时描述一下如何成长为一个合格的软件架构师&#x…

基于SpringBoot+Vue+微信小程序的电影平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 研究背景:…

Docker 中的 .NET 异常了怎么抓 Dump (转载)

一、背景 1. 讲故事 有很多朋友跟我说,在 Windows 上看过你文章知道了怎么抓 Crash, CPU爆高,内存暴涨 等各种Dump,为什么你没有写在 Docker 中如何抓的相关文章呢?瞧不上吗? 哈哈,在DUMP的分析旅程中&a…

提升工作效率:推荐几款实用的Mac项目管理工具!

在当今软件和技术高度发达的时代,项目管理依然是一项非常重要的任务。现在,有越来越多的人喜欢使用mac电脑进行项目管理,因为mac众所周知的稳定性和使用便捷性。但问题是,mac系统自带的项目管理工具并不是非常完美,因此…

Linux——进程信号详解

目录 一.进程信号的理解 1.1定义: 1.2举例: 1.3总结: 二.进程信号地使用: 2.1信号种类: 2.2而操作系统向进程发送信号地方式有四种: 2.2.1以键盘的方式向进程发送信号 接下来介绍一个系统调用函数sign…

Windows系统上安装Node.js图文步骤流程

Windows系统上安装Node.js图文步骤流程,本文以安装Node.js v4.4.3 LTS(长期支持版本)版本为例: 目录 Node.js下载 Windows 上安装 Node.js 1、Windows 安装包(.msi) 2、Windows 二进制文件 (.exe)安装 版本测试 Node.js下载 Node.js 安装包及源码…

nginx七层代理和四层转发的理解

先来理解一下osi七层模型 应用层 应用层是ISO七层模型的最高层,它直接与用户和应用程序交互,提供用户与网络的接口。它包括各种应用协议,如HTTP、FTP、SMTP等,用于实现特定应用的功能和通信表示层 表示层…

Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令

目录 ProcessBuilder类的介绍及使用 【前言】 【正文】 --构造方法-- --常用方法-- --使用技巧-- --调用本地Shell命令,实例-- 【总结】 【注意】 ProcessBuilder类的介绍及使用 【前言】 在做一个项目的时候需要用到运行时动态执行JAVA命令,一…

leetcode 225.用队列实现栈

⭐️ 题目描述 🌟 leetcode链接:用队列实现栈 1️⃣ 思路和图解: push: 入栈操作只需要往不为空的队列入数据即可,如果都为空,其中任意一个队列都可以。 void myStackPush(MyStack* obj, int x) {// 往…

CS EXE上线主机+文件下载上传键盘记录

前言 书接上文,CobaltStrike_1_部署教程及CS制作office宏文档钓鱼教程,该篇介绍【使用CS生成对应exe木马,上线主机;对上线主机进行,文件下载,文件上传,键盘记录】。 PS:文章仅供学习…

数仓建设中最常用模型--Kimball维度建模详解

数仓建模首推书籍《数据仓库工具箱:维度建模权威指南》,本篇文章参考此书而作。文章首发公众号:五分钟学大数据,公众号后台发送“维度建模”即可获取此书籍第三版电子书 先来介绍下此书,此书是基于作者 60 多年的实际业…

SpringBoot前后端分离项目,打包、部署到服务器详细图文流程

文章目录 实施步骤一、修改配置文件地址1.修改MySQL配置2.修改Redis配置3.修改日志路径和字符集配置 二、将源码压缩并上传服务器1.上传前端文件2.上传后端文件(同上) 三、前端项目打包1.安装依赖2.项目打包 四、后端项目打包1.项目打包(jar包…

Ubuntu 20.04 LTS 安装 nvidia 驱动 + cuda 11.8 从开始到放弃!

升级 sources.list # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restri…

java的断言

断言介绍 Java的断言就是一条assert 声明,其中包含了一个布尔表达式。 断言可以被启用或者禁用,默认是禁用的。 断言被启用的情况下,执行到断言的声明,就会计算布尔表达式的值。如果表达式的值为false,那么就会抛出一…

9、架构:CLI 设计

通常大部分的程序员会更加习惯使用 CLI(Command-Line Interface 命令行界面)来辅助开发业务,包括初始化、更新、构建、发布等功能,可以获得沉浸式一站的开发体验。 在之前有一篇企业级 CLI 开发实战介绍过如何开发一款适用团队的…

阿里开业项目chat2DB-人工智能SQL分析介绍

1. chat2DB简介 1-1. 简介 ​ chat2DB是一款有开源免费的多数据库客户端工具,支持windows、mac本地安装,也支持服务器端部署,web网页访问。和传统的数据库客户端软件Navicat、DBeaver 相比Chat2DB集成了AIGC的能力,能够将自然语…

从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题

目录 1. 多态(polymorphism) 1.1 构成多态的两个条件 1.2 虚函数重写(覆盖) 1.3 协变构成多态 1.4 父虚子非虚构成多态 1.5 析构函数的重写 1.6 final 和 override 关键字(C11) 1.7 重载、覆盖、隐藏的对比 2. 抽象类&am…

11、架构:CI/CD 设计

本章内容是基于 DevOps 体系的精简版本,如果有阅读过之前 DevOps 小册的同学,可以快速掠过。 开局先放一张镇楼图,上图我在行云集团做的通用型 CI/CD 解决方案 ALL IN DOCKER,所有的操作构建与发布过程都在 Docker 中操作。 但很…