TCP滑动窗口详解

article/2025/9/30 20:27:15

相较于UDP,TCP有以下区别:
1、可靠传输
2、流量控制

这两个功能都是依靠滑动窗口来实现的,本文就来解密TCP中的滑动窗口

TCP实现可靠传输依靠的有 序列号自动重传滑动窗口确认应答等机制。

序列号

首先我们说下序列号,TCP中将要发送的数据包的每个字节都分配了序列号,用来唯一标识一个字节。序列号随着数据包的发送而增加。

只有为每个字节分配一个序列号,每个数据包都对应着一个序列号区间,才能确定哪个数据包发送出现意外了。

序列号的初始化是由操作系统分配的,是一个32位的数字。

TCP初始化序列号不能设置为一个固定值,因为这样容易被攻击者猜出后续序列号,从而遭到攻击。

RFC1948中提出了一个较好的初始化序列号ISN随机生成算法。

ISN = M + F(localhost, localport, remotehost, remoteport).

M是一个计时器,这个计时器每隔4us加1。

F是一个随机算法,根据源IP、目的IP、源端口、目的端口生成一个随机数值。

确认应答

当接收方收到一个数据包后,会直接返回一个ACK包,或者延迟一段时间返回一个ACK包,一次性确认多个数据包。

ACK包中有一个ack字段,代表着seq小于ack的数据包都已经被接收完毕。
在这里插入图片描述

自动重传 ARQ

ARQ的详解分析可以看我的另一篇文章ARQ详解

当TCP发送端发送了一个TCP数据包的时候,会设置一个定时器,如果在定时器期间没有收到接收方对这个数据包的确认应答包,也成为ACK包,就会重新发送对应的TCP数据包。

自动重传有以下两个原因:
1、数据包丢失
2、ack数据包丢失

在这里插入图片描述

超时时间的选择
超时时间既不能太长,又不能太短。

超时时间过长存在的问题:
当发生丢包的时候,需要等待好长时间才会重新发送,这个时候TCP就处于等待时期,什么也干不了,浪费资源,发送效率低下。

超时时间过短存在的问题:
如果超时时间太短,会发生多次发送重复包的情况。当ACK包还在路上的时候,由于超时时间太短而导致发送端重复的发送不必要的数据包。会加重网络的负担,导致网络阻塞等问题。网络发生阻塞的话,会进一步正反馈导致更多的重传。

重传超时时间简称为RTO

RTO是略大于RTT的。

RTT指的是一个数据包从发送到接收到ACK确认包的花费时间,RTT是会随着网络的变化而变化,是会波动的。

滑动窗口的出现原因

滑动窗口 分为 发送窗口接收窗口

发送窗口 用来 发送数据

接收窗口 用来 接收数据

客户端和服务器端 都有一个 发送窗口接收窗口

在这里插入图片描述

为什么会引入滑动窗口呢?

如果不存在发送窗口的话,TCP发送一个数据包后会等待ACK包,因为必须要保存对应的数据包,数据包很有可能需要重新发送。

这样的话发送效率会很慢。大部分时间都在等待。
在这里插入图片描述

引入了发送窗口,发送窗口的做法是:

只要处于发送窗口范围中的数据包都可以被发送,不需要等待前面数据包的ack包。

如果发送窗口的大小为3个TCP数据包,那么发送方就可以连续发送3个TCP数据包,而不用等待前2个数据包的ack包。

在这里插入图片描述

滑动窗口详解

发送窗口

在这里插入图片描述

发送窗口存在于操作系统中开辟的一块缓冲区,用来存放当前需要发送的数据。本质是一个循环数组的实现。利用三个指针来维护相关的区域。

发送窗口就是一个循环利用的缓冲区,应用层发送数据,就是往缓冲区中写入数据。收到ACK后,就相当于从缓冲区中移除数据,不过并不会真正移除数据,只需要后移对应的指针就可以了。

应用层会将数据写入到缓冲区中,当超过缓冲区的最大地址后,就循环利用头部,覆盖头部的数据。

发送缓冲区分为四个部分:

1、已经收到ack包的数据
已经收到ack包的数据,代表接收窗口已经接收了对应的数据,可以被新数据覆盖。

2、已经发送还未接收到ack包的数据
已经发送出去,但是还未收到接收方对应的ack包

3、允许发送但是还未发送的数据
允许发送但是还未发送的数据。

4、不允许发送的数据。

发送窗口之外的数据,排队等待后续发送。

区间2 和 区间3 构成了发送窗口,两个区间的大小总和对应着发送窗口的大小

TCP中用三个指针来区分这个四个部分
在这里插入图片描述
指针1: 指向第一个已发送但是未接收到ack的字节
指针2: 指向第一个允许发送但是还未发送的字节
指针3: 发送窗口的大小

这时还允许发送数据,就会将可用窗口中的数据发送给接收窗口。

在这里插入图片描述

这个时候,可用窗口大小为0,这个时候会等待接收方发送ack包。

如果这个时候如果接收一个ack包为37,这个时候发送窗口会向右边移动5位,52-56会变成可用窗口。
在这里插入图片描述

接收窗口

接收窗口中的字节序列号都是与发送窗口一一对应的。
在这里插入图片描述

接收窗口也是存在于操作系统中开辟的一块缓冲区,用于接收数据。缓冲区本质是一个循环数组的实现。利用两个指针来维护相关的区域。

接收窗口存在于一个循环利用的缓冲区,接收数据 就是往缓冲区中写入数据。应用层读取数据后,就相当于从缓冲区中移除数据,不过并不会真正移除数据,只需要后移对应的指针就可以了。

当数据写入超过缓冲区的最大地址后,就循环利用头部,覆盖头部的数据。

缓冲区分为三部分:
1、应用层已经读取的数据
已经接收到的数据,并且已经发送了ack包,并且已经被应用层读取。

2、接收窗口中的数据
接收窗口中存储的是当前允许被接收的数据。

接收窗口允许无序接收数据包,所以接收窗口中有一部分数据接收到了,一部分没接收到,将无序的数据包直接缓存到接收窗口中。

因为无序的接收数据包,接收窗口中是存在空隙的,因为先发送的数据包由于网络原因,反而可能会后到接收方。

当数据包缓存到接收窗口中,就会返回ack包,ack包中会携带SACK信息,也就是选择重选信息。

3、还未收到的数据
还不能接收数据的区域,也就是接收窗口之外的数据。

接收窗口由一个RCV_NEXT和接收窗口大小WND来维护。

RCV_NEXT
下一个希望接收的数据包的序列号,当接收到对应的数据包后,会将RCV_NEXT右移,右移到缓冲区中第一个为空的位置。

同时将WND 减去 移动的个数。

WND
接收窗口的大小。

WND有以下两种变化:

1、接收窗口 有序的接收到对应的数据包,WND会减去对应的数据包长度。

2、应用程序读取了数据包,会将WDN增加对应的数据包的长度

接收窗口详情

接收窗口接收数据包后,即使应用程序没有读取对应的数据包,也会立马返回ack应答包,ack应答包中会携带当前接收窗口的大小WND和接收窗口的数据包缓存信息。

1、当数据包的seq == RCV_NEXT的数据包的时候,将接收窗口的RCV_NEXT右移到缓冲区中第一个为空的位置,WND减去对应的移动字节数;

2、当数据包的seq > RCV_NEXT 并且 seq < RCV_NEXT+ WND的时候,会将其加入到滑动窗口中对应的位置。

3、如果数据包的seq < RCV_NEXT,说明该数据包已经被接收了,但是对应的ack包因为阻塞或者异常没有发送到发送方。
这时接收方会利用其发送窗口发送一个ack包。

4、当应用程序将接收到的数据包读取之后,会将WND加上对应的读取数据包的大小。

滑动窗口的大小

发送窗口的大小要取决于接收窗口,如果发送窗口大于接收窗口的大小,会导致接收窗口无法完全接收数据包,导致一些数据包被丢弃,导致发送窗口的超时重传,浪费资源。

tcp报文头部中有一个window字段,代表着接收窗口的接收数据能力,发送窗口会根据window字段来调整发送窗口大小,保证接收窗口正常接收数据包。

发送窗口的大小不能超过接收窗口的大小,否则接收窗口不能正常接收数据。

总结

客户端和服务器都各自维护一个发送窗口和发送窗口,用来流水线模式的发送和接收数据。

发送窗口和接收窗口的本质是在操作系统中开辟的一块循环利用的缓冲区,用于存储要发送和接收数据。本质是一个循环数组的实现。利用若干指针来维护相关的区域。当数据写入超过缓冲区的最大地址后,就循环利用头部,覆盖头部的数据。

发送窗口就是一个循环利用的缓冲区,应用层发送数据,就是往缓冲区中写入数据。收到ACK后,就相当于从缓冲区中移除数据,不过并不会真正移除数据,只需要后移对应的指针就可以了。

发送缓冲区分为四个部分:

1、已经收到ack包的数据
已经收到ack包的数据,代表接收窗口已经接收了对应的数据,可以被新数据覆盖。

2、已经发送还未接收到ack包的数据
已经发送出去,但是还未收到接收方对应的ack包

3、允许发送但是还未发送的数据
允许发送但是还未发送的数据。

4、不允许发送的数据。

发送窗口之外的数据,排队等待后续发送。

区间2 和 区间3 构成了发送窗口,两个区间的大小总和对应着发送窗口的大小

接收窗口接收数据包后,会立马返回ack应答包,即使应用程序没有读取对应的数据包。

接收窗口也是一个循环利用的缓冲区,接收数据 就是往缓冲区中写入数据。应用层读取数据后,就相当于从缓冲区中移除数据,不过并不会真正移除数据,只需要后移对应的指针就可以了。

接收窗口详情

接收窗口接收数据包后,即使应用程序没有读取对应的数据包,也会立马返回ack应答包,ack应答包中会携带当前接收窗口的大小WND和接收窗口的数据包缓存信息。

1、当数据包的seq == RCV_NEXT的数据包的时候,将接收窗口的RCV_NEXT右移到缓冲区中第一个为空的位置,WND减去对应的移动字节数;

2、当数据包的seq > RCV_NEXT 并且 seq < RCV_NEXT+ WND的时候,会将其加入到滑动窗口中对应的位置。

3、如果数据包的seq < RCV_NEXT,说明该数据包已经被接收了,但是对应的ack包因为阻塞或者异常没有发送到发送方。
这时接收方会利用其发送窗口发送一个ack包。

4、当应用程序将接收到的数据包读取之后,会将WND加上对应的读取数据包的大小。


http://chatgpt.dhexx.cn/article/jrwTuCr7.shtml

相关文章

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

第二章&#xff1a;SIFT&#xff08;尺度不变特征变换&#xff09; 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实现)

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

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

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

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

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

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

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

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

1.引言 SIFT3D的理论基础完全是从图像特征SIFT2D中迁移类比过来的&#xff0c;类似的还有Harris3D和Harris6D的理论也是来源于Harris2D的&#xff0c;这些点云特征在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) 对于初学者&#xff0c;从David G.Lowe的论文到实现&#xff0c;有许多鸿沟…

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

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

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

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

简述人脸识别技术

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

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

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

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

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

SIFI尺度不变特征变换算法

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

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

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

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

文章目录 RecordCode效果 Record 1、特征点检测与匹配常用的算法&#xff1a;FAST&#xff08;FastFeatureDetector&#xff09;、STAR&#xff08;StarFeatureDetector&#xff09;、SIFT、SURF、ORB、MSER、GFTT&#xff08;GoodFeaturesToTrackDetector&#xff09;、HARRI…

SIFI特征点提取

尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT) Just For Fun zdd zddmailgmail.com 对于初学者&#xff0c;从David G.Lowe的论文到实现&#xff0c;有许多鸿沟&#xff0c;本文帮你跨越。 1、SIFT综述 尺度不变特征转换(Scale-invariant feature tr…

图像SIFI笔记

Image/userl representation > down screen tasks 端到端的 文本领域 字典 visual word本质是 local feature handcraft feature 希望这个具有足够的泛华性 generalize 为了有交集 泛化性 clustering 聚类 Quantization 量化 每张图像 有特征点 local feature sift(128d维…

特征点匹配(SIFI)

1.SIFI https://blog.csdn.net/weixin_38404120/article/details/73740612&#xff08;参考了这个作者的内容&#xff09; 结合书上加博客的内容进行理解&#xff1b; 求取SIFI特征的步骤&#xff1a; 首先要对图像归一化&#xff0c;然后将图像扩大为原来的两倍&#xff0…

SIFI和ORB在尺度缩放、旋转、仿射上的特征点不变实验代码,并比较SIFI和ORB提取特征点的速度

SIFI和ORB在尺度缩放、旋转、仿射上的特征点不变 一、SIFI算法1.验证旋转不变性2.验证尺度不变性3.验证仿射不变性 对原图进行仿射变换并输出 二、ORB算法1.验证旋转不变性2.验证尺度不变性3.验证仿射不变性 对原图进行仿射变换并输出 三、比较SIFT和ORB的尺度旋转&#xff0c;…