TCP协议关于速率的优化机制-滑动窗口详解

在上一章中,我们讲述了TCP协议在传输过程中的可靠性http://t.csdnimg.cn/BsImO,这里衔接上一篇文章继续讲,TCP协议的特性,TCP协议写完之后就写,Http和Https等内容吧

1.  滑动窗口

这里的滑动窗口不是指算法里面的双指针那个滑动窗口,这个滑动窗口是为了在TCP协议传输过程中提高传输效率的。但是有了滑动窗口这个特性,也只是略微提高一下传输效率,因为TCP协议的可靠性已经注定了,TCP协议不可能比UDP协议快。所以也是一种亡羊补牢的特性。

首先,这幅图上一篇文章中应该也提到了,服务端向客户端发送请求的时候,大部分时间会浪费在等待ACK上面。这一个非常浪费时间的操作。所以引入滑动窗口就是为了减少上述等待时间。这是使用了滑动窗口后的图

和刚刚不同的是,刚刚一条一条的发,变成了现在一组一组的发。也就和数据库中一条一条的查询,和一次性查询很多条是一个道理。也就是不需要等待ACK就一口气直接发,就等于就一份的等待时间等待4个ACK。这里我们把一次性发几个ACK不需要等待的大小称为“ 窗口 ”。  此时窗口越大效率越高,但是窗口不能无限大,要是无限大了,则滑动窗口就变成TCP协议了,而且服务器能不能处理的过来也是一个问题。所以窗口要设置合适的大小。这里讲解完了窗口。

那滑动的含义是什么捏。看下面这张图

 下面这张图就是我们此时向服务器发送了

  • 1001-2000
  • 2001-3000
  • 3001-4000
  • 4001-5000

此时我们向服务器发送了4条请求。这里我们按照最理想的情况

服务器依次返回2001,3001,4001,5001这几条确认应答。这样在客户端收到了2001这条确认应答之后。会立即向服务端发送5001-6000这条数据,而不是等待4条确认应答都收到后再发送,是收到了一条就向后发送一条(服务器依次返回的情况下) ,所以这样看起来就和算法的滑动窗口很像,可以一直保持等待4个确认应答的状态。这就是滑动的含义。

滑动窗口的本质就是 批量发送数据

但是要是在滑动窗口机制下,丢包了怎么办,因为TCP协议的核心是可靠性,不能为了效率牺牲这个可靠性。

此时我们还是分为了2种情况 

第一,请求已经发送成功了,但是ACK丢失

但其实仔细一想,其实ack丢了完全没有啥影响,因为确认应答返回的序列号的含义是比如此时返回1001,此时表示的含义就是1001之前的数据都收到了,所以要是3001丢失了,但是客户端收到了4001这条ACK的话,也就表示服务器3001也收到了。此时就会像客户端又发送几条请求,直到补齐"窗口"的大小。 

第二,请求包丢失了

这个和上面就不同了,这里的话就必须要进行重传了,但要进行重传,就需要考虑2个特性

  1. 什么时候重传
  2. 改如何重传

这是确认序号的含义就发挥了尤为重要的作用。确认序号表示的为序号前的所有内容都收到了,所以当我们传上述1-1000  1001-2000 2001-3000  3001-4000 4001 - 5001 .....时,要是假设1001-2000这条数据丢失了。此时服务器每次收到请求之后,能返回的结果都只是1001,当客户端收到一定数量的1001这个确认序号的时候,就可以大概确定1001-2000这条数据大概率是丢了。所以此时就重新向服务器发送1001-2000这条请求,此时客户端收到请求之后,由于前面的2000-7000已经接收了,所以此时客户端直接返回7001,表示7001以前的数据都进行了接收。所以他只需要重传丢失的数据,已经发送的数据则无需再发。 这一操作也叫快速重传,本质还是超时重传的一种变形。 

而且在使用TCP的过程中不一定会用到滑动窗口,当数据量特别大的时候,会使用到滑动窗口,此时数据丢失就叫快速重传, 

但是数据量较少,隔很久才发一个请求的话,此时就不会使用滑动窗口,还是超时重传策略。

2. 流量控制

流量控制其实也算滑动窗口机制的一个补充,作用就是怕“ 窗口 ”太大,服务端接收不过来。适当的减少部分流量的。

这里我们用一个很常见的模型,生产者消费者模型,在很多地方都是可以使用的,比如在线程中有一个阻塞队列,在消息队列中也会经常使用到。

当我们客端户向服务器发送请求的时候也可以看做是一个生产者消费者模型。在服务器一般会有内核态和用户态,在内核态中会有一个接收缓冲区,就是一个类似于队列的结构。来接收客户端发送的请求,而此时用户态就会拿取接收缓存区中的内容进行使用,客户端向服务器发送请求的时候,要是发送的速度太快同时用户态来不及处理这些缓冲区内容,缓冲区就会被占满。 要是满了之后,客户端的请求服务器就接受不了了,就会发生丢包的情况。用户态的消费速度取决于代码的实现。所以一般我们不希望这种方式会引起丢包。

而流量控制就是解决上诉问题,根据接受方的处理能力,来限制发送方的发送速率(窗口大小)

所以此时就根据就根据接收方的接收缓冲区的剩余空间大小来作为衡量的标准,要是剩余空间越大,发送就越快。 所以该怎么判断剩余缓冲区大小呢。 这里又请出了我们昨天的那张图

里面的16为窗口大小就表示了剩余缓存区的容量大小,同时这一字段也只针对应答报文ACK生效,通过16位窗口的大小来对传输速率进行调整。

那么这里的16位大小是否仅仅只能表示64kb的大小呢,不是的因为在协议中有一个选项这一个选项就是数据上面那一个,表示了扩展因子。实际大小为16位窗口大小位移选项位大小。所以可以表示的大小其实是非常大的,位移一位是*2 是指数级别的增加。

此时在每一条返回数据的过程中,除了会返回确认应答序号,还会返回 接收缓冲区剩余容量(16位窗口大小) 要是窗口大小为0的时候,也就表示窗口满了。 就会听着发送,反正发了也会丢包,就直接暂停发送等待窗口有大小之后进行发送。 但是发送方也不知道服务器什么时候会有空间,所以不定时会发一个窗口探测包来确定大小为多少。一旦发现大小不为0就可以继续发送了。

但是仅仅只考虑接收方是远远不够的,我们还需要考虑中间链路的处理能力。 这就涉及到TCP的下一个特性拥塞控制了。

3. 拥塞控制

在刚刚的过程中,我们只对接受方的性能进行了考虑,但是在实际网络通信的过程中,一个请求由客户端发送到服务器,可能是需要经过多次路由的,所以在路由的过程中是和木桶效应那样的。是取决于最低的那一个节点,如果转发过程中经过一个路由器的性能较差,此时请求的发送速度不会超过该路由的速率值,但是如何衡量中间路由设备的速率呢。

这里TCP协议在转发过程中不会去衡量中间设备的硬件能力,而是通过“实验”的形式,动态调整,最后产生出一个合适的窗口大小,期间,中间的所有设备都会看做为一个整体。

  • 如果较小窗口传输通畅,就调大窗口。
  • 如果较大窗口传输过程中丢包率变高,就调小窗口。

拥塞控制具体的展开过程:

1. 慢启动:在刚开始启动的时候,先使用一个非常小的窗口,先试试水。

2. 指数增长:在传输通畅的情况下,拥塞的窗口会以指数的形式成长(就是每次都*2)。但是不能一直增长,不然后面的值会非常的大。

3.线性增长:当窗口的大小到达了预设值之后,就会从指数增长,变为线性增长。就不是*2了而是每次+n。 线性增长也是一直在增长,到达一定程序,接近网络的极限之后,就可能会

出现丢包问题了。

4. 要是出现丢包了,就认为是网络达到阈值了,就会把大窗口变为最初的小窗口,同时也会根据阈值的大小去调整指数增长哪里的阈值(指数增长->线程增长)

1

而拥塞控制就是不断进行阈值动态变化和调整的一种机制,这样做的好处是,可以不断适应多变的一个网络环境。 当然也会存在性能损失,因为每次回到小窗口的时候速度会变慢。上述问题也是重点关注策略,而不是参数。

最后实际的窗口大小会取,拥塞控制和流量控制的较小值

4. 延迟应答

延迟应答也可以进行传输速率的优化,延迟应答其实也是围绕滑动窗口的一种模式,让我们在有限的条件下,尽可能的扩大窗口的大小,在返回ack的时候,拖延一点时间,利用拖延的这个时间,可以给应用数据程序更多消费数据的时间,此时接受缓冲区的空间就会更大了,具体来说就是比如我们此时有一个10kb大小的接收缓冲区收到了一个请求之后,此时接受缓冲区还有3kb了,如果立即返回ack的话,窗口大小的显示就该说明此时缓冲区还有3kb,但是如果我们等待500ms在进行ack的返回,在这500ms期间,应用程序又消耗掉了2kb数据呢,此时我们可以返回的窗口大小就为5kb了,所以延迟应答能提高多少速率还是取决于,应用程序对数据的消耗速度。

同时也不是所有的包都可以进行延迟应答

  • 数量限制:每隔N个包就应答一次 (针对滑动窗口)
  • 时间限制:超过最大延迟时间就应答一次 (针对非滑动窗口)

5. 捎带应答

捎带应答是在延迟应答的基础上引入的一个进一步提高速率的机制,捎带应答就是,在延时应答的基础上,让数据进行一个合并的机制。

就类似于在三次握手的过程中,对中间的数据进行和并一样,就是客户端向服务器发送一个请求之后,服务器延迟应答后返回一个ack,同时如果服务器本来就要向客户端返回数据的话,则会把这次数据和ack当成一个报文进行返回。

下一篇文章就写Http或者Https或者IP协议了 这里给大家推荐一本书《图解TCP/IP》,下一篇也有可能写一写蓝桥的题目。

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

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

相关文章

品牌百度百科词条需要什么资料?

品牌百度百科词条是一个品牌的数字化名片,更是品牌历史、文化、实力的全面展现。 作为一个相当拿得出手的镀金名片,品牌百度百科词条创建需要什么资料,今天伯乐网络传媒就来给大家讲解一下。 一、品牌基本信息:品牌身份的明确 品…

用 PyTorch 构建液态神经网络(LNN)

用 PyTorch 构建液态神经网络(LNN) 文章目录 什么是液态神经网络为什么需要液态神经网络LNN 与 RNN 的区别用 PyTorch 实现 LNNStep 1. 导入必要的库Step 2. 定义网络架构Step 3. 实现 ODE 求解器Step 4. 定义训练逻辑 LNN 的缺陷总结 什么是液态神经网络…

C语言-嵌入式-STM32:FreeRTOS说明和详解

Free即免费的,RTOS的全称是Real time operating system,中文就是实时操作系统。 注意:RTOS不是指某一个确定的系统,而是指一类操作系统。比如:uc/OS,FreeRTOS,RTX,RT-Thread 等这些都…

docker自定义java运行环境镜像

一、下载jre/jdk 压缩包,centos:7基础镜像 1、 下载jdk/dre 下载jdk或jre 官网下载 根据需求下载 jdk:SE Development Kit(开发环境) jre: SE Runtime Environment (运行环境)2、下载centos:7 # 下载centos7 docker镜像 docker pull centos:7#centos查看系统时间 …

面试经典算法题之双指针专题

力扣经典面试题之双指针 ( 每天更新, 每天一题 ) 文章目录 力扣经典面试题之双指针 ( 每天更新, 每天一题 )验证回文串收获 392. 判断子序列 验证回文串 思路 一: 筛选 双指针验证 class Solution { public:bool isPalindrome(string s) {// 所有大写字母 > 小写 去除非字母…

对比mongodb查询的执行计划,说一说组合索引的优化方案(上)

一、背景 Mongodb数据库,有个160w数据量规模的集合,字段多达几十个,随着需求的迭代,查询条件也是五花八门。 为了提高某个查询的效率,结果都以新增索引解决问题,最后多达16个索引。 这里仅贴出本文会提及…

引领农业新质生产力,鸿道(Intewell®)操作系统助力农业机器人创新发展

4月27日至29日,2024耒耜国际会议在江苏大学召开。科东软件作为特邀嘉宾出席此次盛会,并为江苏大学-科东软件“农业机器人操作系统”联合实验室揭牌。 校企联合实验室揭牌 在开幕式上,江苏大学、科东软件、上交碳中和动力研究院、遨博智能研究…

Spring Boot Admin

概述 Spirng Boot Admin 登录页面 Spring Boot Admin是一个用于管理Spring Boot应用的监控工具,它允许你查看和管理多个Spring Boot应用实例。用于应用信息进行界面化的展示,常常辅助我们开发人员快速查看服务运行状态在微服务架构中,Spring Boot Admin通…

中科院突破:TalkingGaussian技术实现3D人脸动态无失真,高效同步嘴唇运动!

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享,与你一起了解前沿深度学习信息! 引言:探索高质量3D对话头像的新方法 在数字媒体和虚拟互动领域,高质量的3D对话头像技术正变得日益重要。这种技术能够在虚拟现实、电影…

谷粒商城实战(020 RabbitMQ-消息确认)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第258p-第p261的内容 消息确认 生产者 publishers 消费者 consumers 设置配置类 调用api 控制台 抵达brocker 代理 新版本ReturnCallbac…

【webrtc】MessageHandler 8: 基于线程的消息处理:处理音频输入输出断开

m98代码,看起来m114 去掉了MessageHandler :音频的录制和播放 都使用了on message,但只是用来通知并处理流的断开的。AAudioRecorder AAudioRecorder 处理流断开 OnErrorCallback :有可能 错误回调是别处来的,是其他线程, 但是这个错误的处理要再自己的线程执行: 音频播…

北京大学肖臻老师《区块链技术与应用》P14(ETH概述)和P15(ETH账户)

1️⃣ 参考 北京大学肖臻老师《区块链技术与应用》 P14 - ETH概述篇P15 - ETH账户篇 1️⃣4️⃣ETH概述 ① 比特币与以太坊的对比 比特币(区块链 1.0)以太坊(区块链 2.0)出块时间大约10 min十几秒mining puzzle计算密集型Memo…

【计算智能】基本遗传算法在优化问题中的应用与实验【理论到程序】

文章目录 1. 引言:遗传算法简介2. 基本遗传算法(SGA)2.1 基本遗传算法的构成要素1. 染色体编码2. 适应度函数3. 遗传算子 2.2 实验设计与方法1. 算法流程2. 伪代码3. python实现1. 导入模块2. 目标函数 f(x)3 初始化种群4. 计算适应度5. 选择…

Django后台项目开发实战二

我们的需求是开发职位管理系统 三个功能: 管理员发布职位候选人能浏览职位用户能投递职位 第二阶段 创建应用 jobs,实现职位数据的建模 python manage.py startapp jobs 然后再 setting .py 注册应用,只需添加应用名称到最后一行 INST…

VTK —— 二、教程六 - 为模型加入3D微件(按下i键隐藏或显示)(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功,若无VTK库则请先参考如下链接编译vtk源码: VTK —— 一、Windows10下编译VTK源码,并用Vs2017代码测试(附编译流程、附编译好的库、vtk测试源码) 教程描述 本…

探索未来道路:智慧高速系统架构的革命性进步

随着科技的飞速发展,智慧高速系统架构正在成为道路交通领域的一项重要创新。这一系统结合了先进的信息技术和智能化设备,为高速公路提供了全新的管理和服务模式,极大地提升了交通运输效率和安全性。本文将深入探讨智慧高速系统架构的革命性进…

ping命令操作记录

1,ping 主机可查看主机是否在线 2,ping -a参数,解析主机的名称 3,ping -r 跟踪打印路由信息 ping命令的作用:确认目标主机是否存活,确定网络是否畅通 ping的原理:ping发送ICMP(互联…

【算法】【贪心算法】【leetcode】870. 优势洗牌

题目地址:https://leetcode.cn/problems/advantage-shuffle/description/ 题目描述: 给定两个长度相等的数组 nums1 和 nums2,nums1 相对于 nums2 的优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。 返回 nums1 的任意排列&…

Open CASCADE学习|BRepFill_SectionPlacement

BRepFill_SectionPlacement 是一个与计算机辅助设计(CAD)相关的术语,通常用于指代一个几何对象或操作,它是Open CASCADE Technology(OCCT)中的一个类。Open CASCADE Technology是一个开源的CAD内核&#xf…

AnomalyGPT——使用大型视觉语言模型进行工业异常检测的算法解析与应用

1.概述 工业缺陷检测是工业自动化和质量控制中的一个重要环节,其目的是在生产过程中识别和分类产品或组件中的缺陷,以确保最终产品的质量满足既定标准。这项技术的应用可以显著提高生产效率,降低成本,并减少由于缺陷产品导致的潜…
最新文章