TCP滑动窗口常见问题

article/2025/9/30 20:26:39

文章目录

  • 参考资料
  • TCP滑动窗口
  • 概述
  • 引入窗口概念的原因
  • 窗口大小由哪一方决定?
  • 发送方的滑动窗口
  • 接收方的滑动窗口
  • 接收窗口和发送窗口的大小是相等的吗?
  • TCP的可靠性,超时重传怎么实现
  • 滑动窗口如何实现面向流的可靠性?




参考资料

你还在为 TCP 重传、滑动窗口、流量控制、拥塞控制发愁吗?一文搞定!

太厉害了,终于有人能把TCP/IP协议讲的明明白白了!

TCP协议的滑动窗口具体是怎样控制流量的?





TCP滑动窗口

img

概述

滑动窗口协议的基本原理就是:

  • 在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口。

  • 同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。

  • 发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。

  • 发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。

滑动窗口




引入窗口概念的原因

  • 在以前,TCP在发送数据的过程中, 以1个段为单位,每发送一个段进行一次确认应答的处理。这样的传输方式有一个缺点,就是包的往返时间越长通信性能就越低。这就是停止等待协议。

就像是这样,一个单位就要来回应答一次,效率实在太差:

老师说"从"学生写"从". 学生说"嗯"老师说"前"学生写"前". 学生说"嗯"老师说"今天我还想早点下班呢..."
  • 为解决这个问题,TCP 引入了窗口这个概念。确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅地缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。

img

  • 窗口大小就是指无需等待确认应答而可以继续发送数据的单位值。例如,上图中窗口大小为4个段。这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。

窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。

假设窗口大小为 3 个 TCP 段,那么发送方就可以「连续发送」 3 个 TCP 段,并且中途若有 ACK 丢失,可以通过「下一个确认应答进行确认」。如下图:

img

图中的 ACK 600 确认应答报文丢失,也没关系,因为可以通话下一个确认应答进行确认,只要发送方收到了 ACK 700 确认应答,就意味着 700 之前的所有数据「接收方」都收到了。

这个模式就叫累计确认或者累计应答





窗口大小由哪一方决定?

TCP 头里有一个字段叫 Window,也就是窗口大小。

这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。

通常窗口的大小是由接收方的决定的。

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

img




发送方的滑动窗口

对于TCP会话的发送方,任何时候在其发送缓存内的数据都可以分为4类

  • “已经发送并得到对端ACK的”

  • “已经发送但还未收到对端ACK的”

  • “未发送但对端允许发送的”

  • “未发送且对端不允许发送”

下图就是发送方缓存的数据,根据处理的情况分成四个部分,其中蓝色方框是发送窗口,紫色方框是可用窗口:

**“已经发送但还未收到对端ACK的”“未发送但对端允许发送的”**这两部分数据称之为发送窗口。

img

TCP 滑动窗口方案使用三个指针来跟踪在四个传输类别中的每一个类别中的字节。其中两个指针是绝对指针(指特定的序列号),一个是相对指针(需要做偏移)。

  • SND.WND:表示发送窗口的大小(大小是由接收方指定的);
  • SND.UNA:是一个绝对指针,它指向的是已发送但未收到确认的第一个字节的序列号,也就是 #2 的第一个字节。
  • SND.NXT:也是一个绝对指针,它指向未发送但可发送范围的第一个字节的序列号,也就是 #3 的第一个字节。
  • 指向 #4 的第一个字节是个相对指针,它需要 SND.UNA 指针加上 SND.WND大小的偏移量,就可以指向 #4 的第一个字节了。

那么可用窗口大小的计算就可以是:

可用窗口大小 = SND.WND -(SND.NXT - SND.UNA)

  • #1是已发送并收到 ACK确认的数据:1~31 字节
  • #2 是已发送但未收到 ACK确认的数据:32~45 字节
  • #3 是未发送但总大小在接收方处理范围内(接收方还有空间):46~51字节
  • #4 是未发送但总大小超过接收方处理范围(接收方没有空间):52字节以后

当发送方把数据「全部」都一下发送出去后,可用窗口的大小就为 0 了,表明可用窗口耗尽,在没收到 ACK 确认之前是无法继续发送数据了。

img

当收到之前发送的数据 32~36 字节的 ACK 确认应答后,如果发送窗口的大小没有变化,则滑动窗口往右边移动 5 个字节,因为有 5 个字节的数据被应答确认,接下来 52~56 字节又变成了可用窗口,那么后续也就可以发送 52~56 这 5 个字节的数据了。

img




接收方的滑动窗口

img

接收窗口相对简单一些,根据处理的情况划分成三个部分:

  • #1 + #2 是已成功接收并确认的数据(等待应用进程读取);
  • #3 是未收到数据但可以接收的数据;
  • #4 未收到数据并不可以接收的数据

三个接收部分,使用两个指针进行划分:

  • RCV.WND:表示接收窗口的大小,它会通告给发送方。
  • RCV.NXT:是一个指针,它指向期望从发送方发送来的下一个数据字节的序列号,也就是 #3 的第一个字节。
  • 指向 #4 的第一个字节是个相对指针,它需要 RCV.NXT 指针加上 RCV.WND大小的偏移量,就可以指向 #4 的第一个字节了。




接收窗口和发送窗口的大小是相等的吗?

并不是完全相等。

接收窗口的大小约等于发送窗口的大小。

因为滑动窗口并不是一成不变的。

比如,当接收方的应用进程读取数据的速度非常快的话,这样的话接收窗口可以很快的就空缺出来。

那么新的接收窗口大小,是通过 TCP 报文中的 Windows 字段来告诉发送方。

那么这个传输过程是存在时延的,所以接收窗口和发送窗口是约等于的关系。




TCP的可靠性,超时重传怎么实现

M1,M2,M3,M4,M5,丢失M2;怎么重传M2?

因为每个TCP报文被发送时,都会设置一个重传定时器,若定时期到了还没收到ack包,则应重传。

为什么不用重传M4,M5?

因为采用了累积确认。有例如下:

  1. Server 发送80个字节 Part1,seq = 1
  2. Server 发送120个字节Part2,Seq = 81
  3. Server发送160个字节Part3,Seq = 201,此包由于其他原因丢失
  4. Client收到前2个报文段,并发送ACK = 201
  5. Server发送140个字节Part4, Seq = 361
  6. Server收到Client对于前两个报文段的ACK,将2个报文从窗口中移除,窗口有200个字节的余量
  7. 报文3的重传定时器到期,没有收到ACK,进行重传
  8. 这个时候Client已经收到报文4,存放在缓冲区中,也不会发送ACK【累计通知,发送ACK就表示3也收到了】,等待报文3,报文3收到之后,一块对3,4进行确认
  9. Server收到确认之后,将报文3,4移除窗口,所有数据发送完成

滑动窗口如何实现面向流的可靠性?

1)最基本的传输可靠性来源于“确认重传”机制。

2)TCP的滑动窗口的可靠性也是建立在“确认重传”基础上的。

3)发送窗口只有收到对端对于本段发送窗口内字节的ACK确认,才会移动发送窗口的左边界。

4)接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。


http://chatgpt.dhexx.cn/article/2aoLMJUd.shtml

相关文章

TCP滑动窗口协议与流量控制

谈到TCP的滑动窗口协议与流量控制,便会想起当年面试时的场景。那时刚刚毕业,匆匆学了一点TCP的皮毛,仅仅是知道了TCP是面向连接的协议,以对每个报文都进行确认超时重传的机制来保证端到端的可靠传输;并在面试前背了一下…

TCP 滑动窗口简述

窗口机制分为两种: 1.固定的窗口大小 2.滑动窗口 这是指流量控制的窗口机制;数据传输的流量控制; 窗口机制 最基本含义是;理想情况下,数据的传输是快速而有效地进行的;如果发送方计算机在发送每一…

C++模拟TCP滑动窗口传输

此程序是用C进行模拟tcp的“滑动窗口”操作,具体操作如下: 1、首先在提示下发送端输入发送信息和窗口大小 2、调用tcp()函数进行将发送端信息发送给接收端操作 3、具体具体原理如下: 1)发送端每次将窗口大小的信息传给接收端 2&am…

TCP滑动窗口、流量控制及拥塞控制详解

一、TCP滑动窗口 TCP虽然是面向字节流的,但是TCP传输的单元确实报文段。一个TCP报文段分为首部和数据部分。TCP首部前20个字节是固定的,后面有4N个字节是可选的。因此,TCP首部最小字节数是20个字节。 下面我们看下一TCP首部中几个重要的字段…

TCP 滑动窗口是个什么东西?这篇讲清楚

今天我们来看TCP的滑动窗口问题,无论是在工作中,还是在笔试面试中,滑动窗口都是非常重要的概念,今天,图文并茂给大家讲清楚,一起来看看。 一、TCP的优势 TCP经过多年厮杀,早已确立了坚实的江湖…

计算机网络之TCP滑动窗口

文章目录 计算机网络之TCP滑动窗口1.详细讲一下TCP的滑动窗口2. 聊聊 TCP 的滑动窗口 计算机网络之TCP滑动窗口 1.详细讲一下TCP的滑动窗口 在进行数据传输时,如果传输的数据比较大,就需要拆分为多个数据包进行发送。TCP 协议需要对数据进行确认后&…

运输层:TCP滑动窗口

一般来说,我们总是希望数据传输得更快一些。但是如果发送方发送的更快,接收方就可能来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。 滑动窗口就是用于实现流量控制的。可以…

TCP滑动窗口机制

滑动窗口机制 **作用:**利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。 1 . A给B发送数据,则A有发送缓冲区,B有接收缓冲区。应用层的所有需要发送的数据都被放在了发送者的发送缓冲区。发送窗口是发送缓存中的一部分&am…

TCP 滑动窗口

TCP滑动窗口主要有两个作用,可靠性、流控 TCP 如果都以一个包为单位,每发一个包进行一次确认应答的处理,这样的传输方式包的往返的时间越长和包的数量越多其通信性能就越低。 为了解决这个问题,TCP引入了窗口这个概念。在往返时…

tcp滑动窗口原理

参考:​​​计算机网络-传输层_wiscourper的博客-CSDN博客 TCP 滑动窗口 作用: 1. 提供TCP可靠性:对发送的数据进行确认2. 流量控制:窗口大小随链路变化 一、TCP窗口机制 TCP中窗口大小是指tcp协议一次传输多少个数据。因为TCP是…

TCP的滑动窗口

1. 引入滑动窗口的原因 如果没有滑动窗口,TCP每发送一个数据,都需要等待这一次确认应答。只有收到了上一个数据包的应答,才能再发送下一个。这样效率太低了当引入了滑动窗口机制后,就可以采取累计确认机制。TCP引入了窗口这个概念…

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

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

TCP滑动窗口模拟实战

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

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

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

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不稳定的边缘响应点…