TCP滑动窗口

news2025/1/14 1:08:41

为什么会有滑动窗口

  • 在计算机网络中,数据通常被分成小块(也叫数据段)在网络中传输(为什么会被分成小块,请了解拥塞窗口和流量控制)。这些小块可能会在传输的过程中遇到延迟、丢失或乱序等问题。为了保证数据的正确传输,我们需要一种方法来管理数据的发送和接收。

  • 而滑动窗口就像是一个虚拟的窗口,用来控制发送方和接收方之间的数据交换。当发送方把数据段发送给接收方时,发送窗口会向前滑动,表示发送方可以继续发送更多的数据。接收方会根据自己的接收窗口的大小,告诉发送方它可以接收多少数据。如果发送方发送的数据超过了接收方的窗口大小,接收方会拒绝接收多余的数据,以避免数据的丢失或混乱。

  • 同时,滑动窗口机制也有助于优化网络的利用率。发送方不需要等待每个数据段的确认,它可以持续发送多个数据段,只要发送窗口内的数据没有超过接收窗口的大小。这样可以充分利用网络的带宽,提高数据传输效率。

简单来说,滑动窗口机制就是为了在网络通信中更好地管理数据的传输。它确保发送方和接收方之间的数据交换有序、可靠,同时最大限度地利用网络资源。就像拍照时要控制好光线,光线过强会导致过曝,太弱会导致欠曝。

滑动窗口是什么

在这里插入图片描述

  • 滑动窗口实际上是发送缓冲区的一部分,滑动窗口左边代表已经确认发送成功,即接收到来自对端发送的ACK报文,是可以被覆盖的无效数据。

  • 滑动窗口内部代表不需要应答,直接就可以发送的数据和已经发送但未确认应答的数据。发送到数据大小根据对端给的应答报文中窗口大小来确定。

  • 滑动窗口的右边代表着尚未发送到数据内容。滑动窗口内的数据发送完后,滑动窗口就会右移,窗口大小由对端的应答报文中的窗口大小决定。

滑动窗口工作原理

  1. 应答报文中会返回下一次发送数据的序号, 窗口的下一次起始位置就等于返回的序号
    应答报文中的会返回此时接收端接收缓冲区的大小。而窗口的起始位置 + 缓冲区大小就是窗口的大小,即决定了窗口的结束位置

  2. 滑动窗口只能向右滑动,因为向左没有意义,左边是已经发送的废弃数据。

  3. 窗口大小可大可小,是浮动的,也能变0,代表对端不能再接收数据了,对端的接收缓冲区可用容量为0了,此时就进入到了发送端的窗口探测阶段和对端的窗口更新通知阶段。

  4. 如果报文丢失了呢

    1. 应答丢失

      假设有1000-5000序号的数据发送,对端返回应答,丢失了2001,但我们收到了3001,4001和5001的确认应答。虽然丢掉了2001应答,但收到了后面的数据应答,这意味着之前的数据对端都接收到了,只是应答丢了而已,而发送端只需要关心我的数据是否成功发送,不关心应答,所以应答丢失了2001不重要,不关心。
      在这里插入图片描述

    2. 数据丢失

      假设有1000-5000序号的数据发送,丢失了2000之前的数据,对端返回应答时就不会返回后面的确认应答序号,而返回1001。由于发送端发送的是1000-5000,而收到的应答中确认序号却是1001,代表1000后面的数据丢包了,此时滑动窗口不动,等待超时重传。

      无论滑动窗口中丢失的是最左侧的数据、中间的数据还是最末尾的数据,通过数据重传和确认,及窗口滑动的过程,被确认的正常数据都会从窗口的左侧被删除,最后剩下的无论是左侧、中间还是末尾的丢失数据,都将转换为相对窗口而言的左侧丢失。

      具体分析:

      • 最左侧数据丢失 - 此时窗口不能滑动,直到最左侧数据重传并确认,窗口才开始滑动。
      • 中间数据丢失 - 中间数据之前和之后的正常数据会被确认,窗口会滑动到中间数据,此时对窗口来说,中间数据就转换为了左侧丢失。
      • 最末尾数据丢失 - 除了最末尾的数据,其他的数据都会得到确认,窗口滑动到最末尾数据,对窗口来说,它现在就是左侧丢失。
      • 通过重复以上过程,最后都会转换为窗口左侧数据的丢失。

    实际上快重传和超时重传就是依托滑动窗口接受ACK确认之前会保留的特性来实现的。

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

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

相关文章

学习ts(六)数据类型(元组、枚举、Symbol、never)与类型推论

1.元组 元组(Tuple)是固定数量的不同类型的元素的组合。是数组的变种。 元组与集合的不同之处在于,元组中的元素类型可以是不同的,而且数量固定。元组的好处在于可以把多个元素作为一个单元传递。如果一个方法需要返回多个值&…

适配器模式实现stack和queue

适配器模式实现stack和queue 什么是适配器模式?STL标准库中stack和queue的底层结构stack的模拟实现queue的模拟实现 什么是适配器模式? 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结)&#xff…

微信小程序最新获取头像和昵称的方法 直接用!

调整背景 微信小程序获取用户头像和昵称一个开放接口是wx.getUserInfo,2021年4月5日被废弃,原因是很多开发者在打开小程序时就通过组件方式唤起getUserInfo弹窗,如果用户点击拒绝,无法使用小程序,这种做法打断了用户正…

Camunda_4:监听器相关

Camunda的监听器非常之多,常见的如任务监听与执行监听。我们可以实现相关监听器进行相关操作。 首先明确的是,当执行到某一个节点时,会先进入执行监听,然后进入任务监听。 执行监听和任务监听主要监听以下阶段。 然后我们就能去…

excel中如果A列中某项有多条记录,针对A列中相同的项,将B列值进行相加合并统计

excel中如果A列中某项有多条记录,针对A列中相同的项,将B列值进行相加合并统计。 如: 实现方法: C1、D1中分别输入公式,然后下拉 IF(COUNTIF($A$1:A1,A1)1, A1,"") #A1根据实际情况调整,如果…

学习笔记|课后练习解答|电磁炉LED实战|逻辑运算|STC32G单片机视频开发教程(冲哥)|第八集(下):课后练习分析与解答

课后练习解答 增加按键3,按下后表示启动,选择的对应的功能的LED持续闪烁,表示正在工作,且在工作的时候无法切换功能。 需求分解 1 增加按键3 #define KEY3 P34 //增加按键32 按下后表示启动 电平控制3 工作状态锁定 表示正在…

IDEA项目实践——mybatis实践,创建一个父目录专门存放mybatis项目

系列文章目录 IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍_intellij 创建scala IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——动态SQL、关系映…

方案:AI边缘计算智慧工地解决方案

一、方案背景 在工程项目管理中,工程施工现场涉及面广,多种元素交叉,状况较为复杂,如人员出入、机械运行、物料运输等。特别是传统的现场管理模式依赖于管理人员的现场巡查。当发现安全风险时,需要提前报告&#xff0…

【SpringSecurity】四、登录处理器

文章目录 1、登录成功处理器2、登录失败处理器3、无权限处理器4、登出(退出)处理器5、安全配置类WebSecurityConfig 前后端分离背景下,前后端通过json进行交互,登录成功或失败,返回的不是一个html页面,而是…

python 基础篇 day 2 基本输入输出转换

文章目录 输入函数——input()原型示例注意 输出函数——print()原型示例 数据类型转换转换路径图示格式举例int(x)float(x)bool(x) 注意 格式化输出法一:%格式 类型表举例第二种:format格式类型表举例第三种:f (format简化版&…

论文速递 Nature 2023 | Heat-assisted detection and ranging

注1:本文系“计算成像最新论文速览”系列之一,致力于简洁清晰地介绍、解读非视距成像领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, SIGGRAPH, TPAMI; Light‐Science & Applications, Optica 等)。 本次介绍的论文是: 2023年,Nature,“…

2023年国赛 高教社杯数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 最短时…

6个比较火的AI绘画生成工具

随着人工智能技术的发展,市场上出现了越来越多的人工智能图像生成工具。这些人工智能图像生成工具可以自动创建惊人的图像、艺术作品和设计,以帮助设计师和创意人员更快地实现他们的创造性想法。在本文中,我们将推荐7种最近流行的人工智能图像…

Michael.W基于Foundry精读Openzeppelin第30期——ECDSA.sol

Michael.W基于Foundry精读Openzeppelin第30期——ECDSA.sol 0. 版本0.1 ECDSA.sol 1. 目标合约2. 代码精读2.1 toEthSignedMessageHash(bytes32 hash) && toEthSignedMessageHash(bytes memory s)2.2 toTypedDataHash(bytes32 domainSeparator, bytes32 structHash)2.3…

Just KNIME it[S2C21] 图像识别

朋友们,Just KNIME it 还有在跟进吗? 本季已经到 21 期啦。 本期探讨的主题是图像识别问题,快随指北君一起看看吧。 挑战 21:帮助球童(第 1 部分) 级别:中 描述:球童汤姆是一位最受欢迎的高尔夫…

thinkphp6.0 配合shell 脚本 定时任务

1. 执行命令&#xff0c;生成自定义命令 php think make:command Custom<?php declare (strict_types 1);namespace app\command;use app\facade\AdmUser; use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\console\i…

第 6 章 递归(3)(八皇后问题)

6.7递归-八皇后问题(回溯算法) 6.7.1八皇后问题介绍 八皇后问题&#xff0c;是一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯贝瑟尔于1848年提出&#xff1a;在88格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c…

堆内存和栈内存的区别

什么是栈内存&#xff1f; 栈内存是为线程流出来的临时空间&#xff0c;每一个线程都有它的临时空间&#xff0c;而且每一个栈都只能被当前的线程访问。 所以它是线程安全的。栈内存的分配和回收是由系统完成的。 当函数调用的时候 系统就会为这个函数分配栈空间&#xff0c;当…

国产化kylin配置网络不通解决方案—1

kylin镜像自行官网下载 kylin系统安装外网不通配置 进入vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITyes IPV6_AUTOCONFyes IPV6_DEFROUTEyes IPV6_FAILURE_FAT…

虚拟化技术——存储虚拟化

概念 通过虚拟化技术&#xff0c;把存储资源整合到一起后对外提供服务&#xff0c;同时实现数据安全性、容量提升、性能提升等效果。 存储资源整合对象 多套存储 多颗硬盘 多个盘符 数据安全性 容量提升 性能提升 对象及实现技术 磁盘虚拟化 保护数据安全&#xff0…