TCP的滑动窗口

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

1. 引入滑动窗口的原因

  • 如果没有滑动窗口,TCP每发送一个数据,都需要等待这一次确认应答。只有收到了上一个数据包的应答,才能再发送下一个。这样效率太低了
  • 当引入了滑动窗口机制后,就可以采取累计确认机制
  • TCP引入了窗口这个概念,有了窗口,就可以指定窗口大小,窗口大小是指无需等待确认应答,而可以继续发送数据的最大值。
  • 如图,假设窗口大小是3个TCP段。即使ACK 600确认应答报文丢失,也没关系,因为可以通过下一个确认应答进行确认。只要发送方收到了ACK700确认应答,就意味着700之前的所有数据接收方都收到了。这就是累计确认

2. 累计确认机制

滑动窗口是缓存的一部分,用来暂时存放字节流。 发送方和接收方各有一个窗口,接收方通过TCP报文段中的窗口字段告诉发送方自己的窗口大小。发送方根据这个值和拥塞窗口信息来设置自己的窗口大小。

发送窗口内的字节都允许被发送,接收窗口的字节都允许被接收,如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离。直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动窗口类似,接收窗口左部字节已经发送确认并交付主机,就右滑动接收窗口。

接收窗口只会对窗口内最后一个按序达到的字节进行确认。例如接收窗口已经收到了字节为{31,34,35},其中31是按序达到,则只对31确认。发送方得到这个字节的确认后,就知道这个字节前面的所有字节都被接收了。

3. 窗口大小由哪一方决定

  • TCP头部有一个Window字段,指明了窗口大小
  • 这个字段是接收端告诉发送端自己还有多少缓存区可以接收数据。于是发送端就可以根据接收端的处理能力来发送数据,而不会导致接收端处理不过来

3.1 发送方的滑动窗口

  • SND.WND:表示发送窗口的大小(大小由接收方指定的)
  • SND.UNA:是一个绝对指针,指向已发送但未确认的第一个字节的序列号。
  • SND.NXT:是一个绝对指针,指向未发送但处在可发送范围内的第一个字节的序列号。
  • 发送方的可用窗口大小=SND.WND-(SND.NXT-SND.UNA)

3.2 接收方的滑动窗口

  • RCV.WND:表示接收创建大小,他会通告给发送方
  • RCV.NXT:是一个指针,它指向期望从发送方发送过来的下一数据字节的序列号。

3.3 操作系统缓冲区和滑动窗口的关系

  • 发送窗口和接收窗口中存放的字节数,都是存放在操作系统内存缓冲区中的。
  • 接收方的应用程序不能及时地读取缓冲区中的内容的话,则会影响接收方的滑动窗口的大小(RCV.WND)。
    • 假设缓冲区大小为200,刚开始接收方的滑动窗口大小则也是200
    • 发送方按序发送过来了100字节的数据,并且接收方也成功接收到了。但是此时接收方应用程序只能处理50字节的数据
    • 根据滑动窗口的原理可知RCV.NXT应该会向右移动100字节。但是还有50字节需要放在缓冲区中等待应用程序处理。因为缓冲区就那么大(200字节),所以此时RCV.WND的大小就变成了150。可用大小也是150.

  •  接收端通过TCP的Window字段告诉发送端自己还能接收150字节。则也会影响发送端的发送窗口大小。

3.4 什么是窗口关闭

  • TCP通过接收方指明希望从发送方接受的数据大小(窗口大小)来进行流量控制。
  • 如果窗口大小为0时,则会阻止发送方给接收方传递数据,直到窗口变为非0为止。这个过程就是窗口关闭。
  • 当接收方的接收窗口腾出来了,则就会发送一个ACK报文,将window字段设置为非0.

3.5 窗口关闭潜在的风险

  • 接收方向发送方告知窗口大小是通过ACK报文来通告的。
  • 如果发生了窗口关闭,接收方处理完数据后,会向发送方通告一个窗口非0的ACK报文告知发送方窗口大小已经变更。但如果这个通告窗口的ACK报文在网络上丢失,那么发送方的就一直不能发送数据。

3.6 如何解决窗口带来的潜在风险

  • 当发送方收到了零窗口通知,会启动一个持续计时器。

  • 当持续计时器超时后,发送方就会主动发送一个窗口探测报文。

  • 而接收方收到这个探测报文时,会给发送方回复一个确认,并给出自己现在的可接收窗口大小

    • 如果接收窗口仍然为0,那么收到这个报文的一方就会重新启动持续计时器

    • 如果接收窗口不是0,那么就可以发送数据了。

  • 窗口探测的次数一般是3次,每次大约30-60秒,超过3次还是0的话,有的TCP实现就会发RST报文来中断连接

3.7  如果接收方每次回应的窗口很小怎么办

  • 假设接收方回应的窗口过小,比如1字节。发送方该不该继续发?(TCP头部就20字节了)
  • 解决办法一:让接收方不告知小窗口
    • 如:当窗口大小<min(MSS,缓存空间/2)。就向发送方通知窗口为0。这样就阻止发送方再发数据过来。
  • 解决方法二:避免发送方在小窗口发送数据
    • 只有等到窗口大小>=MSS才发送数据

3.8 Nagle算法如何避免大量TCP小数据报文的传输?

  • Nagle算法的策略
    • 没有已发送未确认报文时,立刻发送数据
    • 存在未确认时,直到没有已发送未确认报文数据长度达到MSS大小时,再发送数据
    • 不满足上述条件的任意一条,发送方就一直囤积数据,直到满足条件位置
  • 所以这种方式不适合网络实时游戏,比如王者荣耀
  • 系统默认开启Nagle算法,只能通过Socket设置TCP_NODELAY选项来关闭这个算法(即无法全局关闭)

3.8 什么是流量控制

  • 接收方通过TCP的window字段去告知发送方自己的实际接收能力,然后发送方根据这个实际接收能力控制自己发送的数据量,这就是流量控制。
  • 流量控制是基于滑动窗口实现的。


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

相关文章

TCP滑动窗口原理终于清楚了!

我们在学习计算机网络的时候&#xff0c;遇到很多知识点。即便是背的滚瓜烂熟&#xff0c;让你去辨别知识点背后的深层逻辑的时候&#xff0c;可能就手足无措了。 比如小邱去面A公司的时候就被问到&#xff1a; 事实上&#xff0c;这个问题很大程度弥补我计算机网络的“漏洞”…

TCP滑动窗口模拟实战

1.TCP滑动窗口机制 客户端与服务端之间的通信是一个数据传输的过程&#xff0c;消息以数据包形式进行传输。 在传输的过程中&#xff0c;通过滑动窗口机制来同时传输多个数据包&#xff1b;发送端根据接收端的处理能力&#xff0c;适当控制发送窗口大小&#xff0c;实现流量控…

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

文章目录 前言一、滑动窗口的引出二、流量控制2.1 16位窗口大小2.2 发送缓冲区2.3 逐步解析滑动窗口运作 三、快重传机制四、拥塞控制&#xff08;仅供参考&#xff09;五、延迟应答与捎带应答&#xff08;略&#xff09;总结 前言 博主个人社区&#xff1a;开发与算法学习社区…

TCP 滑动窗口(快速重传)

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

TCP滑动窗口

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

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

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

TCP滑动窗口机制(重要)

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

TCP滑动窗口详解

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

计算机视觉——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;是一种局部特征描述子。 …