TCP滑动窗口机制(附图例)

news2025/1/15 6:43:32

文章目录

  • 前言
  • 一、滑动窗口的引出
  • 二、流量控制
    • 2.1 16位窗口大小
    • 2.2 发送缓冲区
    • 2.3 逐步解析滑动窗口运作
  • 三、快重传机制
  • 四、拥塞控制(仅供参考)
  • 五、延迟应答与捎带应答(略)
  • 总结


前言

博主个人社区:开发与算法学习社区

博主个人主页:Killing Vibe的博客

欢迎大家加入,一起交流学习~~

本篇基于TCP确认应答机制基础上,对TCP传输效率作一个提高优化。也就是新增了流量控制和拥塞控制,下面博主将详细总结TCP的滑动窗口机制。

一、滑动窗口的引出

TCP的确认应答策略,对每一个发送的数据段,都要给一个ACK确认应答。收到ACK后再发送下一个数据段。这样做有一个比较大的缺点,就是性能较差。尤其是数据往返的时间较长的时候。

在这里插入图片描述
既然这样一发一收的方式性能较低,那么我们一次发送多条数据,就可以大大的提高性能(其实是将多个段的等待时间重叠在一起了)。

在这里插入图片描述

  • 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。上图的窗口大小就是4000个字节(四个段)。
  • 发送前四个段的时候,不需要等待任何ACK,直接发送;
  • 收到第一个ACK后,滑动窗口向后移动,继续发送第五个段的数据;依次类推;
  • 操作系统内核为了维护这个滑动窗口,需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答;只有确认应答过的数据,才能从缓冲区删掉;
  • 窗口越大,则网络的吞吐率就越高;

这个一次性发送多条数据的量也是有上限的,TCP的发送端会根据对方接收能力和网络承载能力,动态地调节自己的发送流量。(提高到达率)

二、流量控制

  • 接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。
  • 因此TCP支持根据接收端的处理能力,来决定发送端的发送速度。这个机制就叫做流量控制(FlowControl);

2.1 16位窗口大小

流量控制是根据对方的接收能力来调节发送窗口大小(允许发送的数据量大小)

首先接收端需要知道对方的接收能力,最好是实时感知到,应该怎么做到?

就需要对方告诉接收端,在Segment Header 中把接收能力携带给发送方。

在这里插入图片描述

  • 接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段,通过ACK端通知发送端;
  • 窗口大小字段越大,说明网络的吞吐量越高;
  • 接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端;
  • 发送端接受到这个窗口之后,就会减慢自己的发送速度;
  • 如果接收端缓冲区满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。

注意

16位数字最大表示65535,那么TCP窗口最大就是65535字节么?

实际上,TCP首部40字节选项中还包含了一个窗口扩大因子M,实际窗口大小是 窗口字段的值左移 M位;

接收窗口 = 接收缓冲区的大小 - 已用大小(接受的数据,暂时没被应用层读走)

最大发送量 = 对方的接收窗口

2.2 发送缓冲区

TCP会通过滑动窗口来控制发送量!!!!保证数据不会发送过量!

滑动窗口是发送缓冲区上一块可以“滑动” 的窗口。

下面逐步梳理一下发送缓冲区的逻辑部分有哪些:

1.三次握手阶段,能收到对方送过来的segment,里面会带有对方的接收窗口大小。

在这里插入图片描述

2.随着应用层写入了数据。

在这里插入图片描述
写入的数据有可能超过对方接收窗口,也可能少于

在这里插入图片描述
3.此时TCP可以把缓冲区的一些数据发送出去

在这里插入图片描述
有可能全部发发送了,也有可能只发送了一部分


4.然后收到了服务器传回来的应答

在这里插入图片描述
这部分发送已应答的数据就没必要存在缓冲区了,可以视为可用空间了。

在这里插入图片描述

2.3 逐步解析滑动窗口运作

有了上面的铺垫,下面博主用图片逐步演示滑动窗口是怎么运作的:

  1. 首先是三次握手后,得知了对方接收窗口(假设此时服务器的接收窗口 = 1000),发送端的发送缓冲区是2000。

在这里插入图片描述

  1. 此时发送缓冲区收到了应用层的1500个数据(黄色部分是对方接收窗口大小1000,蓝色部分+黄色部分是 接受的1500个数据)

在这里插入图片描述

  1. 然后TCP发送了500个数据出去(紫色部分),然后有300个数据被对方的接收缓冲区接受了,服务器返回应答,假设应答中返回的接收窗口大小是900。(因为有可能对方应用层只消耗了200个数据,还有100个没消耗掉,所以接收窗口大小为900)

  2. 那么这应答了的300个数据就等于说是完成了使命,不用留在发送缓冲区了,可以变成可用空间了。(左边300个数据就变成了白色,滑动窗口左边界缩小1000-300 = 700),但注意,因为收到应答中,窗口大小已经变成了900,所以黄色右边界就要扩大了,900-700 = 200 , 可以看图中,右边界从1000 扩到了1200.

在这里插入图片描述

  1. 假设此时应用层又写入了300个数据到发送缓冲区里(蓝色右边界往右扩了300)

在这里插入图片描述

  1. 此时收到了服务器传来的ack,确认之前发的那500个数据已经接收完毕了,窗口大小为1000。(紫色部分变成了白色部分,黄色右边界右移300),此时黄色窗口大小是1000,蓝色+黄色是1300,左边白色是500,右边白色是200,此时缓冲区是还有1300个数据没有发送的,因为之前是1500个数据发了500个出去,然后又新增了300个数据进来,就是1300了。

在这里插入图片描述

  1. 然后TCP发了500数据出去,又发了300出去。。。(以此类推)

在这里插入图片描述

从上面一系列状态,相信已经很明白了,滑动窗口的大小就是紫色+黄色的那部分数据,每次紫色变成白色之后,黄色右边界就要根据传回来的window大小往右滑~~

三、快重传机制

默认情况,只有超时时间到了才会重传,而且超时时间是ms为单位的,相对认为是非常久的。

TCP做了个加速机制,如果连续收到ASN = 重复编号 的应答,就不超时等待了,而是立即重传。

在这里插入图片描述

  • 当某一段报文段丢失之后,发送端会一直收到 1001 这样的ACK,就像是在提醒发送端 “我想要的是 1001” 一样;
  • 如果发送端主机连续三次收到了同样一个 “1001” 这样的应答,就会将对应的数据 1001 -2000 重新发送;
  • 这个时候接收端收到了1001 之后,再次返回的ACK就是7001了(因为2001 -7000)接收端其实之前就已经收到了,被放到了接收端操作系统内核的接收缓冲区中;

四、拥塞控制(仅供参考)

同理,拥塞控制是根据网络的承载能力来调节发送窗口大小的。

  • 虽然TCP有了滑动窗口这个大杀器,能够高效可靠的发送大量的数据。但是如果在刚开始阶段就发送大量的数据,仍然可能引发问题。
  • 因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下,贸然发送大量的数据,是很有可能引起雪上加霜的。
  • TCP引入 慢启动 机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据;

拥塞窗口其实是通过一个动态算法来实时算出来的 —— 估算值。

既然是算,算法有很多种。

在这里插入图片描述

现在博主拿一个非常古老的算法,这个算法已经不适用于现在的网络环境了,只适用于以前网络质量普遍不高,丢包情况频发的环境。

以下算法仅用于学习(参考TCP/IP卷):

在这里插入图片描述

  • 此处引入一个概念程为拥塞窗口 ;
  • 发送开始的时候,定义拥塞窗口大小为1;
  • 每次收到一个ACK应答,拥塞窗口加1;
  • 每次发送数据包的时候,将拥塞窗口和接收端主机反馈的16位窗口大小做比较,取较小的值作为实际发送的窗口

像上面这样的拥塞窗口增长速度,是指数级别的。“慢启动” 只是指初使时慢,但是增长速度非常快。

  • 为了不增长的那么快,因此不能使拥塞窗口单纯的加倍。
  • 此处引入一个叫做慢启动的阈值
  • 当拥塞窗口超过这个阈值的时候,不再按照指数方式增长,而是按照线性方式增长

在这里插入图片描述

  • 当TCP开始启动的时候,慢启动阈值等于窗口最大值
  • 在每次超时重发的时候,慢启动阈值会变成拥塞窗口峰值的一半,同时拥塞窗口置回1;

现在的网络环境已经不用这么胆小的算法了,现在都是把初始的这个拥塞窗口设定的很高,然后再根据网路环境慢慢减小拥塞窗口的。

五、延迟应答与捎带应答(略)

这里感兴趣小伙伴可以自行网上搜索一下相关的,比较简单,博主就不赘述了。

总结

以上就是TCP滑动窗口机制的详解了,作图码字不易,觉得有帮助的可以点个赞 +收藏起来,关注博主不迷路~~ 有问题可以私信博主。

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

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

相关文章

测开-刷笔试题时的知识点

圈复杂度(暂缓)复杂度越大,程序越复杂计算公式:V(G) E - N 2E代表控制流边的数量,n代表节点数量V (G) P 1p为判定节点数几种常见的控制流图:Linux文件权限具有四种访问权限:r(可…

进程信号理解3

进程信号理解3 1.什么叫做信号递达 实际执行信号的处理动作叫做信号递达,比如默认,忽略,自定义动作 2.什么叫做信号未决? 信号产生到信号递达的状态叫做信号未决 3.进程被阻塞和进程被忽略有什么区别? 进程被阻塞属…

iPhone更换字体教程,无需越狱,支持所有苹果设备!

上周开始,技术大神zhuowei 发现了一个iOS系统更换字体的漏洞,经过不断修正,现在已经可利用上了! 先来看看更换字体后的效果,更换之后,所有App上的字体都得到更改,下图是打开文章的效果 下图是聊…

excel查重技巧:如何用组合函数快速统计重复数据(上)

统计不重复数据的个数,相信不少小伙伴在工作中都遇到过这样的问题。通常的做法都是先把不重复的数据提取出来,再去统计个数。而提取不重复数据的方法之前也分享过,基本有三种方法:高级筛选、数据透视表和删除重复项。其实使用公式…

Ngnix 实现访问黑名单功能

前言 有时候在配置的时候我们会禁用到一些IP,使用nginx 禁用到ip但是需要重启nginx,这样当我们要是实现动态的这种就比较麻烦,当然你可以使用网关来实现相对于nginx实现的这种方式要好很多,但是今天咱们说到这里,那就…

数据可视化系列-05数据分析报告

文章目录数据可视化系列-05数据分析报告1、了解初识数据分析报告数据分析报告简介数据分析报告的作用报告的能力体现报告编写的原则报告种类2、掌握数据分析报告结构标题页目录前言正文结论与建议附录3、了解报告的描述规范报告注意事项报告表达的维度数据结论可用指标数据可视…

代码随想录算法训练营第3天| 203. 移除链表元素、206. 反转链表

代码随想录算法训练营第3天| 203. 移除链表元素、206. 反转链表 移除链表元素 力扣题目链接 删除链表中等于给定值 val 的所有节点。 这里以链表 1 4 2 4 来举例,移除元素4。 那么因为单链表的特殊性,只能指向下一个节点,刚刚删除的是链表…

RS485通信----基本原理+电路图

一、RS485 通信----简介 RS485 是美国电子工业协会(Electronic Industries Association,EIA)于1983年发布的串行通信接口标准,经通讯工业协会(TIA)修订后命名为 TIA/EIA-485-A。 RS485 是一种工业控制环境…

获取Java集合中泛型的Class对象

直接获取时获取不到的,类型被虚拟机擦除了 泛型的正常工作是依赖编译器在编译源码的时候,先进行类型检查,然后进行类型擦除并且在类型参数出现的地方插入强制转换的相关指令实现的。编译器在编译时擦除了所有类型相关的信息,所以…

【36张图,一次性补全网络基础知识】

OSI和TCP/IP是很基础但又非常重要的知识,很多知识点都是以它们为基础去串联的,作为底层,掌握得越透彻,理解上层时会越顺畅。今天这篇网络基础科普,就是根据OSI层级去逐一展开的。 01 计算机网络基础 01 计算机网络的…

让阿里再次伟大--钉钉如何长成独角兽的?

文章目录引子开端发展历程:从2014到2022钉钉和阿里云的全面融合钉钉体系架构技术挑战ToB与ToC的差异安全要求高稳定性要求高业务多样性钉钉的创新存储创新单元化平台开放这些年,钉钉做了哪些优化?钉钉的技术栈钉钉的竞争对手们飞书微信华为welink未来参…

ArcGIS基础实验操作100例--实验58二维点、线转三维

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验58 二维点、线转三维 目录 一、实验背景 二、实验数据 三、实验步骤 (1&…

二、kubernetes集群环境搭建

文章目录1.前置知识点2.kubeadm 部署方式介绍3.安装要求4.最终目标5.集群环境6 初始化环境6.1 检查操作系统版本6.2 主机名解析6.3 时间同步6.4 禁用selinux6.5 禁用swap分区6.6 修改linux的内核参数6.7 配置ipvs功能6.8 安装docker6.9 安装Kubernetes组件6.10 准备集群镜像6.1…

多线程案例

日升时奋斗,日落时自省 目录 1、单例模式 1.1、饿汉模式 1.2、懒汉模式 1.3、饿汉和懒汉的线程安全 2、生产者消费者模型 2.1、理论解释 2.2、优势 2.3、阻塞队列代码解析 2.4、生产者消费者代码解析 2.5、简单实现阻塞队列代码解析 3、定时器 3.1、定时…

Java中String、StringBuffer 和 StringBuilder 的区别

1. String 字符串常量,字符串长度不可变。Java 中 String 是 immutable(不可变)的。 2. StringBuffer 1.如果要频繁对字符串内容进行修改,出于效率考虑最好使用 StringBuffer,如果想转成 String 类型,可以调…

论文笔记Neural Ordinary Differential Equations

论文笔记Neural Ordinary Differential Equations概述参数的优化连续标准化流(Continuous Normalizing Flows)生成式的隐轨迹时序模型(A generative latent function time-series model)这篇文章有多个版本,在最初的版…

嵌入式系统IO体系简述

前言: CPU的主要职责是负责运算,而计算机是需要各种外设的,否则无法和人进行交互。早期x86体系的CPU,需要使用前端总线(fsb)和北桥芯片相连,北桥再和南桥相连。南北桥是一种架构的划分&#xff…

数据结构与算法——算法分析(3)

算法的时间复杂度计算 算法基本操作执行的次数还会随着问题输入的数据集不同而不同 最坏时间复杂度:在最坏的情况下,算法的时间复杂度 平均时间复杂度:所有可能输入在等概率的情况下算法的期望运行时间 最好时间复杂度:在最好的…

企业内训方案|数据治理/项目管理/敏捷项目管理/产品管理

企业内训方案|数据治理/项目管理/敏捷项目管理/产品管理 》》数据治理 数据管理基础 数据处理伦理 数据治理 数据架构 数据建模和设计 数据安全 数据集成和互操作 文件和内容管理 参考数据和主数据 数据仓库和商务智能 元数据管理 数据质量 大数据和数据科学 数据管理成熟度评…

网络协议HTTP:了解Web及网络基础

文章整理自图书图解Http第一章:使用Http协议访问Web第二章:Http的诞生第三章:网络基础TCP/IP协议一:应用层二:传输层三:网络层四:链路层五:TCP/IP通信传输流第四章:IP、T…