TCP滑动窗口机制(重要)

article/2025/9/30 20:29:49

本文参考了一些优秀的书籍->图解TCP/IP,TCP协议卷一,小林coding,还有等等的知乎,百度.

小林coding  小林coding

知乎牛客的文章 : 万字长文 | 23 个问题 TCP 疑难杂症全解析_技术交流_牛客网

这篇文章是关于TCP的又一个重要机制-->滑动窗口,下面是这篇文章的思维导图:

目录

理解滑动窗口

为啥要引入滑动窗口呢??

窗口的实质

理解累计确认

如何理解窗口大小

滑动窗口机制下,如何处理丢包??

ACK丢包???

数据包丢失???

发送方窗口与接收方窗口

发送方窗口

程序中是如何划分为这4个部分的??

窗口是如何滑动的???

接收方窗口

程序中是如何划分为这3个部分的??

接收的窗口大小与发送的窗口大小是完全相等的么??


理解滑动窗口

为啥要引入滑动窗口呢??

在没有引入窗口的概念之前,都是发送方发一个数据报,接收方返回一个ACK,发送方才可以发送下一个数据报,这样的缺点就是如果数据报往返时间较长的话,传输数据的效率低下.

所以我们引入了窗口,在没有接收到上次发送数据的ACK,还可以发送下一个数据报,可以通过后面的ACK来确认前面发送的数据报也称为累计确认.

举一个例子给朋友发微信

没有窗口的情况下(一发一应的形式) :我给朋友发微信,我只能一直等待它给我回复信息,这样我等待的时间不能做其他的事情只能等待---降低了通信效率

有窗口的情况下 : 我给朋友发微信,我一次把我想说的话全部给他发过去,然后我先做其他的事情,等到不忙了在看他有没有回复信息,这样我可以在等待的时间做其他的事情,大大的提高通信效率.

窗口是将等待ACK的时间重叠在一起,可以一次发送多条数据,就大大的提高性能.

窗口的实质

窗口实际上是操作系统开辟的一块缓冲区, 发送方发送数据就会将数据存放在缓冲区里面,如果发送方收到接收方回应的确认应答,这个数据就会从缓冲区里面删除.

理解累计确认

 这里假设窗口大小为3,使用滑动窗口机制连续发送3条数据,但是前两条数据的ACK丢失,但是由于第三个ACK是3001没有丢失,那证明3001之前的数据都收到了,这就是累计确认.

如何理解窗口大小

窗口大小是指在不等待ACK的前提下,所能发送数据的最大值.

  • 窗口大小由谁确定???

窗口大小是由接收方告诉发送方自己还有多少缓冲空间可以接收数据,以至于发送方根据接收方的处理能力控制窗口大小来发送数据,防止接收方处理不过来.

所以,窗口大小是由接收方窗口大小确定的.

发送方的窗口大小不能大于接收方的窗口大小,防止接收方不能正常的接收数据(处理不过来).

  • 可用窗口大小为0 ???

如果可用窗口大小为0,那证明发送方需要等待收到确认应答之后才能发送数据,否则不能发送数据.

滑动窗口机制下,如何处理丢包??

ACK丢包???

 这里假设窗口大小为3,使用滑动窗口机制连续发送3条数据,但是前两条数据的ACK丢失,但是由于第三个ACK是3001没有丢失,那证明3001之前的数据都收到了,这就是累计确认.

  • 中途ACK丢包可以通过下一确认应答进行确认.
  • 如果最后一个ACK丢失,那就是滑动窗口机制最坏的情况下,也就触发超时重传.

数据包丢失???

当某个报文段丢失,窗口大小又比较大的情况下,接收方在没有收到自己预期的序号,会对上一次收到的数据进行确认应答,如果接收方连续三次收到重复的确认应答,那么就需要发送方重传数据包,这样的机制也要做快速重传机制 

在滑动窗口机制下,如果数据报(报文段)丢失,那就会触发快速重传机制.

发送方窗口与接收方窗口

发送方窗口

 接收窗口被划分为4个部分:

  • 数据已被发送并且接收到ACK
  • 数据已被发送但没有接收到ACK
  • 数据未发送但在接收方处理能力范围之内
  • 数据未发送并且不在接收方处理能力范围之内

程序中是如何划分为这4个部分的??

程序根据3个指针来进行划分的,分别是2个绝对指针,一个相对指针进行划分

  • SND.WND :代表发送窗口的大小
  • SND.UNA : 指向已经发送数据但没有接收到ACK部分的第一个序号
  • SND.NXT : 指向数据未发送但在接收方处理能力范围内的部分第一个序号
  • 还有一个相对指针,根据SND.NXT + SND.WND的偏移量计算出来的,指向数据未发送不在接收方处理能力范围内的第一个序号.

窗口是如何滑动的???

 当接收方返回4个确认应答,那么发送窗口就向右移动4个位置,同时窗口的每个部分都在同时变化.

这里注意如果发送方一下把数据全部发送,可用窗口大小就为0,那么就无法再次发送数据,需要等待接收方确认应答腾出窗口大小才能发送数据

接收方窗口

接收窗口分为3个部分

  •  已经成功接收,并且已经被接收方确认的数据
  • 还没有收到的数据,但是可以接收
  • 没有接收到的数据,还不可以被接收

程序中是如何划分为这3个部分的??

通过2个指针来进行划分

  • RCV.WND : 代表窗口大小
  • RCV.NXT : 绝对指针,指向还没有收到的数据,但可以接收部分的第一个序号
  • 相对指针 指向还没有收到的数据,不可以被接收的第一个序号,利用RCV.NXT + RCV.WND的偏移量

接收的窗口大小与发送的窗口大小是完全相等的么??

可以认为是约等于的关系,把数据放到接收缓冲区里面还需要应用进程来进行读取,如果应用进程读取数据过快,接收缓冲区很快就空了,接收窗口很快就空出来,这时还要将新窗口的大小需要通过TCP的Windows字段告诉我们,这个传输过程存在时延迟,所以不是完全相等的.

这里还要注意接收方将数据放到接收缓冲区里面不是立即就能读取的,需要应用进程进行读取.


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

相关文章

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…

SIFI特征点提取

尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT) Just For Fun zdd zddmailgmail.com 对于初学者,从David G.Lowe的论文到实现,有许多鸿沟,本文帮你跨越。 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(参考了这个作者的内容) 结合书上加博客的内容进行理解; 求取SIFI特征的步骤: 首先要对图像归一化,然后将图像扩大为原来的两倍&#xff0…