TCP 滑动窗口(快速重传)

article/2025/9/30 19:56:16

目录

一、滑动窗口的来由

二、滑动窗口

1、滑动窗口模型

2、滑动窗口可能出现的状况

(1) 客户端发送的报文丢了(快重传机制)

(2) 服务端发送的ACK丢了(先收到了排序靠后的ACK)

三、滑动窗口大小为0时,何时才能继续发送数据?

1、策略一:发送方定期发送不携带数据的报文

2、策略二:接收方缓冲区一旦更新立马通知发送方

四、总结


一、滑动窗口的来由

TCP由于存在确认应答机制,在一方发出一条消息以后,另一方要发送ACK表明自己收到消息。如果按照下面这种形式,每次收到ACK才发出下一条消息,这种一发一收的效率太低。但是如果客户端不急着接收ACK,可以利用等待ACK的空挡直接发送下一批数据,这样就可以做到短时间内发送多批数据。这就是滑动窗口的基本思想。

窗口大小就是 这几批数据的所占字节数,以下面这个为例,窗口大小就是3000。在发送前三批数据的时候,可以不用等待ACK直接发送。

注意:一次不能发送太多,因为要看对方接收缓冲区的接受能力。

二、滑动窗口

假设发送缓冲区是一个大数组,数组的每一个位置是以字节为单位的。我们将发送缓冲区分为三个部分:

第一部分是存放已经发送而且收到ACK的数据,假设是0~1000个字节;

第二部分存放准备发送或者已经发送但没有收到ACK的数据,假设是1001~4000个字节;

第三部分存放尚未发送的数据(短时间内不会发送),假设是4001~ 5000 个字节;

1、滑动窗口模型

滑动窗口控制着我们每次所能发送的数据量,避免发送的数据量超出对方的接收能力。滑动窗口滑动的基本思想如下:

(1) 客户端将1001~4000 的数据分三批发送,即1001~2000、2001~3000、3001~4000。当客户端收到了1001~2000的ACK时,此时滑动窗口的左边界向右移动1000个字节;

(2) 如果ACK报文中的“16位窗口大小”的字段表明对方的接收缓冲区剩余空间为500字节,说明接收方还能再发500字节,那么滑动窗口的右边界向右移动500字节. 

因此,滑动窗口就结果而言,看起来像是在滑动,其本质是 根据是否收到ACK以及对方接收缓冲区的大小来移动左右边界。

2、滑动窗口可能出现的状况

上面只是做了一个简单的介绍,实际过程中可能会遇到很多种情况,这里我们从两个问题来了解滑动窗口的作用过程:第一个点是,中间的报文丢了,即2001~3000的报文丢了;第二个点是后发送的先收到了ACK,即没有收到2001~3000,但是收到了3001~4000的报文的ACK。

(1) 客户端发送的报文丢了(快重传机制)

ACK确认应答机制中有一个很关键的点就是,接收方必须是按序回复。假设服务端收到了1001~2000、3001~4000的数据,但是没有收到2001~3000的数据。

- 服务端收到了1001~2000的数据,那就回复确认序号2001+ACK,表明2001之前的数据已经全部收到,下一次从2001的字节位置开始发

- 服务端没有收到2001~3000,此时服务端不会发送ACK;

- 服务端即便收到了3001~4000的数据,等了一段时间依然没有收到2001~3000的数据,说明2001~3000的报文丢了。此时发送的确认序号不是4001,而是2001,表明目前只收到了2001之前的数据。

现在站在客户端的角度,客户端如果连续多次(一般是连续三次)收到了2001的确认应答,说明序号为2001之后的报文丢了,此时就会重传2001~3000的报文。服务端收到2001~3000的报文以后,由于之前已经收到了3001~4000 的报文(暂时存放在接收缓冲区),那么服务端相当于已经收到了全部的报文,此时服务端发送的确认序号是 4001,表明4001之前的报文已经全部收到,下一次可以从第4001个位置开始发。

这种重发机制被称为“快重传”,与超时重传不同的是,超时重传是等待60s以后还没有收到ACK,此时客户端就会重新发送报文;而快重传更注重效率,只要收到多个相同的确认序号,就立马重传。

(2) 服务端发送的ACK丢了(先收到了排序靠后的ACK)

现在服务端是正常收到了三批数据,并一一发送确认应答,但是客户端仅收到了1001~2000、3001~4000的ACK,说明2001~3000要么丢了,要么因为网络状况延迟到达。

- 客户端收到了1001~2000,此时滑动窗口的左边界向左移动1000个字节;根据缓冲区剩余空间大小移动右边界。

- 客户端没有收到2001~3000,但是收到了3001~4000的ACK。没关系,因为服务端必须是按序号回复的,如果服务端没有收到2001~3000的数据,根本不会发送3001~4000的ACK,因此可以认为 服务端已经收到了三批数据。此时滑动窗口的左边界向左移动至4001,同时根据对方接收缓冲区剩余空间大小移动右边界。

三、滑动窗口大小为0时,何时才能继续发送数据?

如果对方上层的处理速度较慢,导致对方接收缓冲区里的数据没有被取走,滑动窗口只有左边界在移动,滑动窗口的大小很快就会变成0。为了应对这种情况,TCP有两种策略。

1、策略一:发送方定期发送不携带数据的报文

发送方定期可以发送一个不携带数据的报文,报文不携带数据,也就不会占用服务端的缓冲区,接收方返回的ACK中会携带窗口大小,以此来判断是否可以继续发送数据。

2、策略二:接收方缓冲区一旦更新立马通知发送方

接收方的上层把数据取走的时候,服务端主动发送一个窗口更新的通知报文,该报文不携带任何数据,只是在报文首部设置了16位窗口大小

注意:在实际使用时,一般是两种方式同时使用。

四、总结

第一,滑动窗口是发送缓冲区的一部分,控制着每次所能发送数据量的最大值。

第二,滑动窗口的大小跟对方的接收能力有关,滑动窗口的大小不是固定的。如果对方上层一直不读取数据,对方的缓冲区剩余空间大小一直在减少,滑动窗口的大小也一直在减小。(其实接收能力还跟网络状况有关,这个就留到TCP拥塞控制说明)


http://chatgpt.dhexx.cn/article/3ukp2HwQ.shtml

相关文章

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,里面很详细,可以更好的学习。这里就不多…

32-SIFI特征点提取(EmguCV学习)

文章目录 RecordCode效果 Record 1、特征点检测与匹配常用的算法:FAST(FastFeatureDetector)、STAR(StarFeatureDetector)、SIFT、SURF、ORB、MSER、GFTT(GoodFeaturesToTrackDetector)、HARRI…