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

article/2025/9/30 19:50:07

文章目录

  • 前言
  • 一、滑动窗口的引出
  • 二、流量控制
    • 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://chatgpt.dhexx.cn/article/fHd2Fm4I.shtml

相关文章

TCP 滑动窗口(快速重传)

目录 一、滑动窗口的来由 二、滑动窗口 1、滑动窗口模型 2、滑动窗口可能出现的状况 (1) 客户端发送的报文丢了(快重传机制) (2) 服务端发送的ACK丢了(先收到了排序靠后的ACK) 三、滑动窗口大小为0时,何时才能继…

TCP滑动窗口

1、滑动窗口的概念 TCP每发送一个数据,都需要进行一次应答。当收到了上一个应答,在发下一个数据,但这种方式效率比较低。数据包往返时间越长,通信的效率就越低。   为了解决这个问题,TCP引入了窗口概念。即在接收窗口…

TCP 滑动窗口详解(非常实用)

一、滑动窗口简介 滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的 拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包, 谁也发…

TCP滑动窗口机制(重要)

本文参考了一些优秀的书籍->图解TCP/IP,TCP协议卷一,小林coding,还有等等的知乎,百度. 小林coding 小林coding 知乎牛客的文章 : 万字长文 | 23 个问题 TCP 疑难杂症全解析_技术交流_牛客网 这篇文章是关于TCP的又一个重要机制-->滑动窗口,下面是这篇文章的思维导图: 目…

TCP滑动窗口详解

相较于UDP,TCP有以下区别: 1、可靠传输 2、流量控制 这两个功能都是依靠滑动窗口来实现的,本文就来解密TCP中的滑动窗口。 TCP实现可靠传输依靠的有 序列号、自动重传、滑动窗口、确认应答等机制。 序列号 首先我们说下序列号&#xff0c…

计算机视觉——SIFT图像匹配算法

第二章:SIFT(尺度不变特征变换) 1. SIFT简介1.1 SIFT算法特点1.2 SIFT特征检测的步骤 2. 尺度空间3. 高斯模糊3.1 高斯模糊3.2 高斯金字塔 4. DoG金字塔4.1 DoG局部极值检测4.2 DoG去除边缘响应4.2.1低对比度的响应点4.2.2不稳定的边缘响应点…

SIFT图像匹配原理及python实现(源码实现及基于opencv实现)

写在前面 黄宁然,看过你看过的算法,数学不好是硬伤。 问题来源: An***** xue100: https://bbs.csdn.net/topics/*********?spm1001.2014.3001.**77 (1)相机置于地面,离天花板的高度始终不变。在某位置拍…

计算机视觉——sift特征匹配+opencv(包含sift的低于3.4.3的opencv安装方法)

文章目录 实验环境环境配置(低于3.4.3的opencv安装方法)虚拟环境的搭建(非必要)局部图像描述子Harris 角点检测基本原理SIFT特征提取代码实现运行实例匹配图像展示匹配结果和分析 实验环境 系统:Ubuntu16.04 语言&…

使用 Javascript 和 OpenCV.js 进行人脸检测

大家好,我们将研究如何使用常规 Javascript、HTML Canvas 和 OpenCV.js 库从图像中检测人脸。 让我们先看一些例子,然后我们将继续编写代码并解释 如果您需要查看完整的代码库刚刚获得我的 github 存储库 GitHub - reactcodes/face-detection-javascript…

图像处理:局部描述子SIFT算法

目录 0、关于SIFT的介绍 1、兴趣点 2、描述子 SIFT算法实现 1.实例化sift 2.利用sift.detectAndCompute()检测关键点并计算 3.将关键点检测结果绘制在图像上 Opencv实现 总结 0、关于SIFT的介绍 SIFT,即尺度不变特征变换,一种局部特征描述子&…

SIFT3D点云关键点提取详细介绍

1.引言 SIFT3D的理论基础完全是从图像特征SIFT2D中迁移类比过来的,类似的还有Harris3D和Harris6D的理论也是来源于Harris2D的,这些点云特征在PCL库中都有具体的实现。Harris3D和Harris6D目前已经有很好的博客和视频讲解了但是SIFT3D却没有一个比较好的介…

java sift 图片相似度,简单快速的图像相似性比较方法

我最近也面临同样的问题,为了解决这个问题(简单快速的算法比较两个图像),我贡献了 img_hash module 要打开“控制”,您可以从 this link . img_哈希模块提供六种图像哈希算法,非常容易使用。 代码示例 起源Lena 模糊莉娜 调整Lena的大小 移动Lena #include #include #include…

图像特征提取(二)——SIFT算法详解

转载自:http://blog.csdn.net/zddblog/article/details/7521424尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT)Just For Fun zdd zddmailgmail.com or (zddhubgmail.com) 对于初学者,从David G.Lowe的论文到实现,有许多鸿沟…

Matlab实现sift特征检测+图像拼接

Matlab实现sift特征检测图像拼接共有12个m文件,其中main为主程序,点击运行即可。 一、部分代码示例 close all; clear; clc;im1imread(test3.png); im2imread(test4.png);gray1img2gray(im1); gray2img2gray(im2);[des1,loc1]sift(gray1); [des2,loc2]…

sfm算法之三角化(三角测量)

sfm算法流程一般是特征点提取、特征点匹配、计算本质矩阵/基础矩阵,最后三角化。但是利用机械臂去观察周围,前后帧姿态变化参数是具有的,所以不需要通过基础矩阵获取。 即利用机械臂的信息直接进行深度估计。已知:手眼标定、相机外…

简述人脸识别技术

简介 人脸识别技术是一种生物识别技术,可以用来确认用户身份。人脸识别技术相比于传统的身份识别技术有很大的优势,主要体现在方便性上。传统的身份认证方式诸如:密码、PIN码、射频卡片、口令、指纹等,需要用户记住复杂密码或者携…

Python机器视觉--OpenCV进阶(核心)-边缘检测之SIFT关键点检测

SIFT关键点检测 SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 …

图像特征与描述子(直方图, 聚类, 边缘检测, 兴趣点/关键点, Harris角点, 斑点(Blob), SIFI, 纹理特征)...

1.直方图 用于计算图片特征,表达, 使得数据具有总结性, 颜色直方图对数据空间进行量化,好比10个bin 2. 聚类 类内对象的相关性高 类间对象的相关性差 常用算法:kmeans, EM算法, meanshift&#…

SIFI尺度不变特征变换算法

SIFT 尺度不变特征变换算法 David Lowe关于Sfit算法,2004年发表在Int. Journal of Computer Vision的经典论文中,对尺度空间(scal space)是这样定义的 : It has been shown by Koenderink (1984) and Lindeberg (1994) that un…

Opencv图像识别从零到精通(34)---SIFI

一、理论知识 Scale Invariant Feature Transform,尺度不变特征变换匹配算法,对于算法的理论介绍,可以参考这篇文章http://blog.csdn.net/qq_20823641/article/details/51692415,里面很详细,可以更好的学习。这里就不多…