核心机制:滑动窗口

article/2025/7/4 23:59:44

TCP 协议

        1.确认应答        可靠传输的核心机制

        2.超时重传        可靠传输的核心机制

        3.连接管理        TCP/网络 最高的面试题

                三次握手,建立连接(必须是 三次)

                四次挥手,断开连接(可能是 三次)

核心机制四:滑动窗口

算法中的"滑动窗口" 出自 TCP

前面的三个机制,实现 TCP 的"可靠性",滑动窗口,是提高效率

可靠性是要付出代价的,传输效率的降低

每次发一个数据,都要等 ack..单位时间内能传输的数据就少了

每一份等待都是等一个 ack 的到达

把每次发送都等待 ack => 批量发送一波,在等待 ack(花一份的等待时间,等待多个 ack)

等待的一份时间中,就是在等待 4 组 ack 的到达,肯定不能完全不等(可靠性形同虚设了),就把批量发送多少数据不需要等待 称为"窗口大小"

问题是,发送方,是收到 4 个 ack,再继续往后 4 组数据?还是收到 1 个 ack,就立即往后发 1组数据(正确)

1001 - 5001 等待四组 ack

A 收到 2001 ack 就视为 1001 - 2000 已经收到了,就可以立即发送 5001 - 6000,此时等待 ack 的窗口就变成了 2001 - 6000

每次收到一个 ack,窗口都会往后平移一个格子,如果收到 ack 的速度很快,平移的过程就好像"滑动"的过程

滑动窗口的效率提高,本质是"亡羊补牢""止损",再怎么提高,也不会超过 UDP 无可靠传输机制的协议的

最理想的状态下,TCP 和 UDP 速度相当,不可能因为滑动窗口让 TCP 比 UDP 更快\

滑动窗口的机制下,出现丢包,怎么办?

情况一:数据包已经抵达,ACK 被丢了

后一个 ack 会覆盖前一个 ack

如果只是 ack 丢包, 在滑动窗口机制下,不需要做任何处理!!!

ack 的确认序号的设定规则

ack 的确认序号,表示序号之前的所有数据都已经收到了,ack => 1001, 1001 之前的数据都收到了

情况二:数据包直接丢了

B 向 A 索要 1001 这个数据

B 反复向 A 索要没有收到的 1001 这个数据, A 感知到 B 连续多次索要 1001 之后,就会认为 1001 丢包,触发重传 1001

一旦 1001 - 2000 数据 B 收到了,此时 B 观察发现,自己的接受缓冲区里,已经有 2001 - 7000 这些数据了,接下来从 7001 索要即可

快速重传(滑动窗口机制下的重传机制,相当于超时重传的变种)

滑动窗口(批量传输) 快速重传 和 确认应答 超时重传 关系

上面这两套,是共存的机制并不冲突

如果使用 TCP 传输比较大的数据的时候,自然就会触发,滑动窗口,重传机制采取快速重传

如果使用 TCP 传输较少的数据,此时就仍然是按照 确认应答 和超时重传 方式来进行

想象一下,TCP 的代码里,触发重传的条件有两个

1)连续多次收到同一个 ack

2)一定时间内没有收到 ack

触发重传


http://www.hkcw.cn/article/TOoFCmuROA.shtml

相关文章

JAVA核心知识点--元注解详解

📚博客主页:代码探秘者 ✨专栏:《JavaSe》 其他更新ing… ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏作者水平有限,欢迎各位大佬指点&…

微软markitdown PDF/WORD/HTML文档转Markdown格式软件整合包下载

本次和大家分享另一个微软发布的非常热门的文件文档转Markdown格式文档的软件markitdown,软件可以将PDF,word,ppt,Excel等十几种格式文档转换为markdown格式文档,我基于当前最新0.1.2版本制作了免安装一键启动整合包。…

(八)登录认证与学生写作画像

本次将赵昱琨同学之前完成的学生写作画像与智能学习路径规划的后端与目前已有的后端框架进行整合。同时为了实现学生写作画像与智能学习路径规划,需要在之前简易的登录系统上进行重构,所以本次大规模重写了登录模块,同时发现很多过去冗余的代…

【agent开发】部署LLM(一)

本周基本就是在踩坑,没什么实质性的进展 下载模型文件 推荐一个网站,可以简单计算下模型推理需要多大显存:https://apxml.com/tools/vram-calculator 我的显卡是RTX 4070,有12GB的显存,部署一个1.7B的Qwen3应该问题…

【Linux】pthread多线程基础

参考博客:https://blog.csdn.net/Alkaid2000/article/details/128121066 线程概述 与进程类似,线程(thread)是允许应用程序并发执行多个任务的一种机制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同程序,且共享同一份…

瑞萨CS+ for CC V8.13.00环境安装教程

前言:最近接触到瑞萨的芯片,需要安装对应的集成开发环境,发现这与ARM内核的单片机存在很大的不同,这里先简单介绍一下其IDE的安装配置方式。 1,官网下载 瑞萨半导体开发环境安装网址 CS | Renesas 当然在下载安装包之…

【知识点】第3章:基本数据类型

文章目录 知识点整理数字类型字符类型 练习题判断题程序题 知识点整理 数字类型 Python语言提供整数、浮点数、复数3种数字类型。 不同进制的引导符号: 不考查进制间的转换。 浮点数类型与数学中实数的概念一致,表示带有小数的数值。Python语言要求所…

【算法】回溯法

一、回溯法的基本思想 回溯法有“通用解题方法”的美称,解题过程是一个搜索过程。在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回(也就是递归返回),尝试别的路径。因此&#xff0…

AIGC 基础篇 高等数学篇 01函数与极限

声明:本文章仅用于博主本人复习,请不要将本文章当成预习篇或者讲解篇 此外,此文章不会包含全部的高等数学知识,仅仅是为了学习AI而进行的前期学习,因此知识含量不会很多,由于博主是第一次尝试做&#xff0…

如何在 Windows 11 Home 版上下载和安装 Hyper-V

Windows 11 Home 版与之前的微软操作系统版本一样,没有自带 Hyper-V 管理器。因此,如果您想在 Windows 11 Home 上下载和安装 Hyper-V,以下是详细的步骤教程。 Hyper-V 是微软提供的一种虚拟化解决方案,允许用户为各种操作系统创建虚拟机。与 VMware 或 VirtualBox 不同,…

C++ --- string类的简单实现

string类的简单实现 前言1、基本成员2、构造方法和析构方法2.1无参构造2.2有参构造2.3析构函数2.4拷贝构造函数 3、遍历方式3.1operator [ ]3.2iterator3.2.1正向迭代器3.2.2const正向迭代器 3.3范围for 4、常用方法,运算符重载c_str()size()reverse()push_back()po…

ESP32之Linux编译环境搭建流程

背景:为了解决 “windows环境中编译ESP32代码速度慢” 的问题,现搭建一个Linux环境,让windows下的VScode连接到Linux环境,VSCode负责编辑代码,虚拟机用于编译代码。 目录 一、安装VMware 1.1 获取VMware安装包 1.2…

Python-matplotlib中的Pyplot API和面向对象 API

matplotlib中的Pyplot API和面向对象 API Pyplot API(状态机模式)面向对象 API 详解二者差别核心区别方法命名差异注意事项差别举例 🍅 Pyplot API(状态机模式)和面向对象 API 是两种不同的编程接口.🍅 它们…

BUUCTF之[ACTF2020 新生赛]BackupFile

打开环境就一句话 找出源文件! 结合题目名字&#xff1a;BackupFile 先用dirsearct扫描网站文件 发现一个index.php.bak ,拼接url下载 打开发现php代码 <?php include_once "flag.php";if(isset($_GET[key])) {$key $_GET[key];if(!is_numeric($key)) {exit…

Spring Boot 3.X 下Redis缓存的尝试(一):初步尝试

背景 想像一下有这么一个场景&#xff0c;一个系统有超多角色、角色下有多个菜单、菜单下有多个按钮权限&#xff0c;这种子父级关系查询每次向数据库查询相当耗时&#xff0c;那么我们是否可以将这种更新频次不高&#xff0c;而查询耗时的数据且不直接影响业务的数据放进缓存中…

基于springboot的民间文化艺术品销售系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

9 动态规划

9.3 爬楼梯 从1开始举例子发现规律 dp[i]dp[i-1]dp[i-2]; class Solution { public:int climbStairs(int n) {if(n<1){return 1;}vector<int>dp(n1);dp[2]2;dp[1]1;for(int i3;i<n;i){dp[i]dp[i-1]dp[i-2];}return dp[n];} }; 9.29 打家劫舍 1 确定dp数组下标与…

Playwright 测试框架 - Node.js

🚀超全实战:基于 Playwright + Node.js 的自动化测试项目教程【附源码】 📌 本文适合自动化测试入门者 & 前端测试实战者。从零开始手把手教你搭建一个 Playwright + Node.js 项目,涵盖配置、测试用例编写、运行与调试、报告生成以及实用进阶技巧。建议收藏!👍 �…

4.RV1126-OPENCV 图像轮廓识别

一.图像识别API 1.图像识别作用 它常用于视觉任务、目标检测、图像分割等等。在 OPENCV 中通常使用 Canny 函数、findContours 函数、drawContours 函数结合在一起去做轮廓的形检测。 2.常用的API findContours 函数&#xff1a;用于寻找图片的轮廓&#xff0c;并把所有的数…

Cursor从入门到精通实战指南(五):一键生成流程图/架构图,开发者必备收藏!

解锁Cursor&#xff1a;开启高效开发新境界 结合了GPT-4、Claude 3.5等强大的大语言模型&#xff0c;能够通过自然语言交互实现代码生成、原型设计、流程优化等功能。无论是编程新手还是经验丰富的开发者&#xff0c;都能借助Cursor的智能特性&#xff0c;快速完成复杂的编码任…