热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

tcp滑动窗口_TCP面试系列之滑动窗口

TCP面试系列第五弹,TCP可靠传输实现之滑动窗口。现在我们假定A收到了B发来的确认报文段,其中窗口是20(字节)ÿ
1bfd834b941d4d70e89c3f024e6e90c8.png

TCP 面试系列第五弹,TCP 可靠传输实现之滑动窗口。

现在我们假定 A 收到了 B 发来的确认报文段,其中窗口是 20(字节),而确认号是 31(这表明 B 期望收到的下一个序号是 31,且到序号 30 为止的数据已经收到了)。根据这两个数据,A 便构造出自己的发送窗口,如下图所示:

36ad963359421c48a3db6db802b8f9c9.png

为了方便大家的理解,对照着上图,对一些概念进行阐述。(注意图中的后沿与前沿)

发送窗口表示:在没有收到 B 的确认的情况下,A 可以连续把窗口内的数据都发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。

从图上很清晰地看出,发送窗口的位置由窗口前沿和后沿的位置共同确定。

发送窗口后沿的后面部分表示已发送且已收到了确认。这些数据显然不需要再保留了。

而发送窗口前沿的前面部分表示不允许发送的,因为接收方都没有为这部分数据保留临时存放的缓存空间

关于发送窗口后沿的可能变化:

  1. 不动(没有收到新的确认)
  2. 前移(收到了新的确认)

关于发送窗口前沿的可能变化:

  1. 向前移动。正常发送新的数据
  2. 不动。原因可能是没有收到新的确认,对方的通知窗口大小也没变;收到了新的确认,但对方通知的窗口缩小了,刚刚好不动

了解了滑动窗口的基本知识后,下面我们考虑更加滑动窗口一些常见的复杂情况。

7c723f7d83df49abdea9a03d44599f16.png

上图简要前置假设说明:

  • A 发送了序号为 31~41 的数据。
  • 发送窗口内靠后面有 11 个字节(灰色小方框表示)表示已发送但未收到确认。
  • 发送窗口内靠前面的 9 个字节(42~50)是允许发送但尚未发送的。

现在分析接收窗口 B:

  • B 的接收窗口大小是 20。
  • 接收窗口内的序号(31~50)是允许接收的。
  • 在接收窗口外面,到 30 号为止的数据是已经发送过确认,并且已经交付主机了。因此在 B 可以不再保留这些数据。
  • 注意,重点来了,现在假设数据没有按序到达,即序号为 31 的数据没有收到(滞留在网络中的某处),也就是说 B 收到了序号为 32 和 33 的数据,却没有收到 31 的数据。这种情况下,B 发送的确认报文段中的确认号 ACK 仍然是 31(即期望收到的序号),而不是 32 或者 33。因为 B 只能对按序收到的数据中的最高序号给出确认。

滑动窗口还有很多复杂的情况,帅天就不一一列举了。但是对于发送窗口、接收窗口和发送前沿和后沿是需要重点掌握的。

如果喜欢这篇文章,请点个关注,你的关注是我最大的动力。



推荐阅读
  • 深入解析:阿里实战 SpringCloud 微服务架构与应用
    本文将详细介绍 SpringCloud 在微服务架构中的应用,涵盖入门、实战和案例分析。通过丰富的代码示例和实际项目经验,帮助读者全面掌握 SpringCloud 的核心技术和最佳实践。 ... [详细]
  • ThinkPHP框架中处理JS和CSS缓存问题的解决方案
    本文探讨了在ThinkPHP框架中,当启用调试模式(APP_DEBUG)时,删除public文件夹中的CSS和JS文件后页面仍然显示旧样式的问题,并提供了一种有效的解决方法。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 本文介绍了Linux系统中的文件IO操作,包括文件描述符、基本文件操作函数以及目录操作。详细解释了各个函数的参数和返回值,并提供了代码示例。 ... [详细]
  • 本文探讨了 Swapper 工具对系统内存和存储设备(如 SD 卡)的潜在影响,解释其工作原理及使用时需要注意的问题。 ... [详细]
  • 本文详细介绍了 RosPack 类的功能和用法,探讨了其在 ROS 系统中的重要作用。RosPack 类提供了类似于终端命令 rospack 的功能,能够方便地查询和管理 ROS 包的相关信息。 ... [详细]
  • MySQL 高性能实战教程
    本课程深入探讨 MySQL 的架构、性能调优、索引优化、查询优化及高可用性等关键领域。通过实际案例和详细讲解,帮助学员掌握提升 MySQL 数据库性能的方法与技巧。 ... [详细]
  • 探讨了如何解决Ajax请求响应时间过长的问题。本文分析了一个从服务器获取少量数据的Ajax请求,尽管服务器已经对JSON响应进行了缓存,但实际响应时间仍然不稳定。 ... [详细]
  • MySQL PMM:MyISAM 和 Aria 存储引擎的性能优化
    本文探讨了 MyISAM 和 Aria 存储引擎在 MySQL 中的关键性能指标,包括密钥缓冲区效率、页面缓存读写性能以及事务日志同步策略。通过优化这些参数,可以显著提升数据库的整体性能。 ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • 本文详细介绍了如何在 MySQL 中授予和撤销用户权限。包括创建用户、赋予不同级别的权限(如表级、数据库级、服务器级)、使权限生效、查看用户权限以及撤销权限的方法。此外,还提供了常见错误及其解决方法。 ... [详细]
author-avatar
520谢鹏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有