javaEE 初阶 — 滑动窗口

news2024/11/27 12:33:07

文章目录

  • 滑动窗口
    • 1 滑动窗口下如何处理丢包

TCP 工作机制

确认应答机制

超时重传机制

连接管理机制

滑动窗口


确认应答机制、超时重传机制、连接管理机制 都是给 TCP 的可靠性提供支持的。
虽然事变的比较可靠了,但是是有牺牲的,那就是传输的效率变低了。

就比如说,做题目的时候如果写的比较快,虽然效率比较高,但是正确率会相对低一些。
如果做题的比较慢,每一个过程都仔仔细细的计算,那正确率就会比较高,但是效率就会降低。
这是一个道理的。

可靠性 和 效率 是冲突的,因此,UDP 虽然没有可靠性,但是传输的效率要比 TCP 高。

即使 TCP 的效率再怎么提高,也没有办法和 UDP 完全不考虑可靠性相比。所以说如果是只考虑效率不考虑可靠性的场景,
UDP 会比 TCP 更加的适合。


滑动窗口的本质上就是降低了确认应答,等待 ACK 消耗的时间。

滑动窗口通过批量发送,批量等待来把多分等待时间合并成一份来降低等待 ACK 消耗的时间。

进行 IO 操作的时候,其实时间成本主要是有两个部分:

1、等待的时间
1、数据传输的时间(数据拷贝)

大多数情况下, IO 花的时间成本大部分都是在等待。
比如说坐高铁回家过年,真正花在路上上的时间可能只有两个小时,但是 这其中有不少候车的时间。




对于确认应答的情况来说,每发送一次数据都是需要等待 ACK 到了才会再发下一个数据。

比如说在和别人聊天的时候,我只有等对方回复我之后,我才可以继续发送消息和对方聊天。




滑动窗口的本质就是不等待的批量发送一组数据,然后使用一份时间来等待着一组数据的多个 ACK。
把不需要等待就能直接发送的数据的最大量,称为 “窗口大小”
上述的图中展示的窗口大小就是 4000。

滑动窗口就相当于是一次发送一个窗口大小的数据量,然后等待对方的回复。

只不过不是要等待所有的 ACK 到达后才能继续发送数据,而是到达一个 ACK 就可以继续发送下一条数据。
这就会致使此处等待的 ACK 始终是 四条。

这里的滑动窗口类似于帮室友带午饭,甲同学想吃炒面、乙同学想吃麻辣烫、丙同学想吃炒菜。
我去买的时候,为了防止带回来的午饭晾了,就要先点一份炒面,在等待炒面出锅之前就去点麻辣烫和炒菜。
每次点完一个就去点下一个,避免点一次点等待一次。窗口的大小始终不变,但是点的午饭会改变。(不可能每天都吃同样的)




本来等待 ACK 是 1001~5000,接下来收到了 2001 这个 ACK ,说明 2001 之前的数据(1001 ~ 2000)已经接收到了。
此时就可以直接发送 5001~6000 的数据,此时意味着等待 ACK 的返回范围就是 2001 ~ 6000。(③的情况)

需要注意的是上述的情况前提是窗口大小是图中为4个段情况。

1 滑动窗口下如何处理丢包


这里分为 ACK 丢了 和 发送的数据 丢了两种。

1、ACK 丢了


在这里插入图片描述

如果是返回的 ACK 丢了,则不需要做任何的处理。

这里的 1001 ACK 虽然丢包了,但是 下一个 2001 ACK 顺利的到达了,此时 2001 之前的数据都已经确认到达了。
2001 这个 ACK 其实就包含了上一个 1001 这个 ACK 的信息。

比如说,每个人几乎都是先从小学、初中、高中再到大学这样的求学顺序。
如果张三上了大学就意味着他已经上过小学、初中和高中了,也就是说后面的会包含前面的。

如上图所示,其实所有的 ACK 并不会全部都在发送,可能会故意商法一部分,这样既不会影响可靠性,也可以节省系统资源。
ACK 也不会全部丢包,如果丢包的概率非常大,那就说明此时的网络出故障了。


2、发送的数据丢了



据上图可知 2001 ~ 7000 的数据都已经被 B 收到了,接下来 B 索要的数据就是 7001。

还可以根据上图发现,1001 ~ 2000 丢包了,接下来 2001 ~ 3000 到达主机 B 之后,B 给 A 返回的 ACK 确认序号仍然是 1001。
(此时和发来的数据序号是什么关系不大了)
也就是说,现在是在索要 1001 开头的数据。

接下来的几个数据,B 返回的确认序号都是 1001,此时站在 A 的角度就会发现自己已经发了不少的数据了,
但是 B 仍是在索要 1001 ,说明 B 没有收到 1001,此时就要重传了。


上述丢包重传的方式叫做 “快速重传”(只重传丢失的数据),这个操作可以视为超时重传机制在滑动窗口下的变形。

如果当前传输的数据密集,按照滑动窗口的方式来传输,此时按照快速重传来处理丢包。
如果当前传输数据稀疏,不再按照滑动窗口方式,此时还是按照之前的的超时重传来处理丢包。

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

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

相关文章

黑马SpringCloud知识点和面试题

目录 一、微服务 1.1、微服务技术栈 1.2、微服务的介绍: 1.3、微服务技术对比 1.4、认识微服务-springcloud 1.4.1、springcloud和springboot的兼容性(左边springcloud右边springboot版本) 1.5、服务拆分,服务远程调用&…

数学建模美赛【LaTeX】公式、表格、图片

数学建模美赛【LaTeX】公式、表格、图片 1 宏包 \package{ } 就是在调用宏包,对计算机实在外行的同学姑且可以理解为工具箱。 每一个宏包里都定义了一些专门的命令,通过这些命令可以实现对于一类对象(如数学公式等)的统一排版&a…

opencv的TrackBar控件

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

HTML预格式化文本pre标签

文章目录参考white-spaceword-breakfont-family参考 https://blog.csdn.net/weixin_44368963/article/details/120054949 https://www.zhangxinxu.com/wordpress/2017/03/css-font-family-chinese-english/ pre 元素可定义预格式化的文本。被包围在 pre 元素中的文本通常会保留…

UG二次开发装配篇 添加/拖动/删除组件方法的实现

我们在UG装配的过程中,经常会遇到需要调整组件目录位置,在软件设计过程中可以通过在目录树里面拖动组件来完成。 那么,如果要用程序实现组件的移动/拖动,我们要怎么做呢? 本节就完成了添加/拖动/删除组件方法的实现&…

ZooKeeper集群搭建步骤

一、准备虚拟机准备三台虚拟机,对应ip地址和主机名如下:ip地址Hostname192.168.153.150ant163192.168.153.151ant164192.168.153.152ant165修改hostname,并使之生效[rootlocalhost /]# hostnamectl set-hostname zookeeper1 //修改hostname …

分享好玩的h5小游戏制作步骤_怎么做h5微信小游戏

近年来,市面上一直流行各种h5游戏,例如投票、答题、刮刮乐、大转盘等等等等,而且我在各种营销场景下经常看到它们的身影,是做促销,引流和宣传的神器之一!那么,怎么做好玩的h5游戏?还…

网络安全-Nmap

网络安全-Nmap Nmap-号称诸神之眼 这个呢就是用来扫描网络端口的 Namp的工作原理很像一个雷达 做任何攻击之前,得先知道怎么去找破绽,而不是钢铁洪流,那个是不叫渗透了,叫硬钢。 咋用呢? 很简单 直接 nmap 后面跟网址…

Linux内核转储---kdump原理梳理

文章目录Kexec和Kdump设计的区别kexeckdumpKdump的执行流程kexec的实现用户空间kexec内核空间vmcoreKdump的实现可以分为两部分:内核和用户工具。内核提供机制,用户工具在这些机制上实现各种转储策略,内核机制对用户工具的接口是一个系统调用…

华为HCIE学习之Openstack Nova组件

文章目录一、openstack组成形式二、Nova的模块1、Nova-api功能2、Nova-scheduler功能3、Nova-conductor功能4、Nova-novncproxy5、Nova-compute三、nova中的一些概念 一、openstack组成形式 openstack由一个个组件组成,每个组件由一个个模块组成。 二、Nova的模块…

mac上安装redis的两种方法

mac上安装redis的两种方法1. 安装方式1->使用homebrew安装redis1.1 安装redis1.1.1 安装homebrew1.1.2 查看redis安装目录1.2 安装等简单命令1.3 启动等相关命令1.3.1 使用brew命令启动1.3.2 redis-cli连接redis服务1.3.3 使用配置文件启动1.42. 安装方式2->官网下载安装…

Spring Cloud之Zuul

目录 简介 Zuul中的过滤器 过滤器的执行流程 使用过滤器 route过滤器的默认三种配置 路由到服务 路由到url地址 转发给自己 自定义过滤器 简介 Zuul是Netflix开源的微服务网关,主要功能是路由转发和过滤器,其原理也是一系列filters&#xff0…

图文解说S参数(进阶篇)

S参数是RF工程师/SI工程师必须掌握的内容,业界已有多位大师写过关于S参数的文章,即便如此,在相关领域打滚多年的人, 可能还是会被一些问题困扰着。你懂S参数吗? 图文解说S参数(基础篇) 请继续往下看...台湾…

数据结构(三):集合、字典、哈希表

数据结构(三)一、集合(Set)1.封装一个集合类2.集合常见的操作(1)并集(2)交集(3)差集(4)子集二、字典(Map)三、…

Powershell Install SQL Server 2022

前言 SQL Server 2022 (16.x) 在早期版本的基础上构建,旨在将 SQL Server 发展成一个平台,以提供开发语言、数据类型、本地或云环境以及操作系统选项。 SQL Server Management Studio (SSMS) 是一种集成环境,用于管理从 SQL Server 到 Azure SQL 数据库的任何 SQL 基础结构…

nginx如何用html显示多个图片并加入播放链接

需求背景通过nginx来做个点播服务,ffmpeg截取视频中的某一帧作为视频的封面,前端页面展示这个封面,,并链接到对应的视频播放链接,加载播放器进行播放简单介绍一下ffmpeg截取视频中的某一帧的方式截取视频的第一帧&…

HashedWheelTimer

序言这种算法是一种轮询算法的优化升级,能够以只有一个Timer的情况下处理大量的定时任务.Begin结合HashedWheelTimer的思想根据自然时间1分钟为例,来做大批量的定时任务触发首先定一个长度为60的数组,数组中存放的是Set集合,集合里面是任务详情.当有定时任务刚来的时候判断是否…

死锁检测组件 -- 使用hook检测死锁

目录 hook hook是什么 dlsym()函数 hook的实现步骤 加入hook的demo C/CLinux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂 hook hook可以把系统或第三方库提供的函数,替换成我们写的同名函数。会调用我们实现的函数。 hook是什么 hook提供了两…

07-Java异常分类以及处理机制

1.异常概念 Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类。Throwable又派生出Error类和Exception类。 1.错误:是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示…

企业电子招采系统源码——信息数智化招采系统

​ 信息数智化招采系统 服务框架:Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构:VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术:Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、…