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

article/2025/9/30 18:32:38

        谈到TCP的滑动窗口协议与流量控制,便会想起当年面试时的场景。那时刚刚毕业,匆匆学了一点TCP的皮毛,仅仅是知道了TCP是面向连接的协议,以对每个报文都进行确认+超时重传的机制来保证端到端的可靠传输;并在面试前背了一下TCP协议头部的数据结构后,便信心满满的自以为已经掌握TCP的所有精髓成为一个不折不扣的TCP专家了。

        结果面试时领导只问了我二个问题:1,TCP滑动窗口协议与流量控制的过程。2,请详细描述一下TCP慢启动的原理。这二个问题当场就把我打回了原形,这二个问题一直记我记忆尤新。

        最近新的实验室时老碰到网络的连接问题,所以花了点时间给部门里的同事准备了一系列TCP/IP相关的培训。事后有同事向我反馈:TCP滑动窗口协议与流量控制,TCP慢启动这二块不是很好理解,问我能不能写做个简单的汇总,写成文章以备后续查阅,所以就有了此文。

       本文假设,读者有TCP的基本常识,理解并掌握了:IP协议,TCP是面向连接的可靠传输协议,TCP会重传,网络延时RTT,网络延时抖动,网络丢包率,网络带宽。

       已经理解滑动窗口协议读者,可以直接转向:

  •        TCP的三个窗口:发送窗口swnd、接收窗口rwnd、拥塞窗口cwnd
  •        TCP的拥塞控制:慢启动与拥塞避免,快重传与快恢复

一,什么是TCP的流量控制

        大家都已经知道 TCP是面向连接的可靠的传输协议,顾明思义,TCP协议能保证每人数据包被正确的从发送方传送到接收方,它所依赖的最重要的手段就是就是重传与确认应答机制,但如果只依赖于重传和确认应答机制,在某些场景(或者说大部分)下是会出错的,我们还需要流量控制,来保证发送方和接收方之间的数据流发送速度才可以让TCP稳定运行,这就是控制发送方和接收方之间的数据流发送速度就是流量控制。

二,什么场景下要做流量控制

        考虑到发送方和接收方的能力不同,有以下三个场景:

1,发送方发送得慢,接收方接收得快----------------------------不需要流量控制

2,发送方的发送速度和接收方的接收速度一样快-------------不需要流量控制

3,发送方发送得快,接收方接收得慢----------------------------需要流量控制

所以只有第3个场景需要做流量控制,让我们来考虑一下:

        如果发送者发送数据过快,接收者来不及接收,那么当接收方的缓冲区满了之后,就会有分组报文丢失。

        分组报文丢失后,接收方就不会发送确认报文回给发送方,那么进一步就会引发发送方的重发,发送方重发的报文越多,则接收方更来不及处理,丢失的报文就会越多,丢失的报文越多,则又会引发发送方发送更多的重发报文......

        由此恶性循环,最终导致网络状态持续恶化直到TCP连接断开或者网络崩溃。那么为了避免分组丢失及网络的持续恶化,我们在这样的情况下需要对发送方的发送速度进行控制,使得接收者来得及接收,这就是流量控制

       流量控制根本目的是防止分组丢失,避免不必要的报文重发,它是构成TCP可靠性的非常重要的一方面。

三,如何实现流量控制

       为了实现流量控制,TCP协议引入了滑动窗口协议(连续ARQ协议)。滑动窗口协议既保证了分组无差错、有序接收,也实现了流量控制。一句话总结起来非常简单:接收方返回的 ACK 中会包含自己的接收窗口的大小,并且发送发检查这个窗口的大小,用来控制自己的数据发送速度。

四,流量控制的具体原理

       首先我们来看一下,TCP应答机制下,如何来保证数据的传输的可靠性,既如何保证报文被发发送方正确的发送到接收方。

A,引入停止等待协议和重传机制,来保证传输的可靠性

数据发送方在发送下一个数据块之前需要等待接收对已发送数据的确认,如下图所示:

        这种协议的优点在于每个报文都能得到及时的反馈,一般只用于需要即时响应并对分组的发送顺序有严格的顺序要求的协议。

        这种方法存在最大的问题在于,网络利用率极低,以上图为例,假设按照主机A的处理速度和网络的带宽,发送一个分组需要t毫秒时间,那么本来t4-t1这个时间间隔内最多可以发送(t4-t1)/t个分组报文,但因为停等的原因t4-t1这个时间间隔内只发送了一个分组报文,t4-t1-t的时间都被浪费在那里做等待了,所以网络带宽的利用率仅为 t/(t4-t1)*100%,当网络延时比较大的时候,则t4-t1的值很大的时候,网络的利用率就非常低,绝大部分时间都空闲在那里等待分组确认信息了。

       接下来,我们看一下TCP做为一个数据传输协议,如何改进停止等待协议,以提高网络利用率,来提高吞吐量(throughput)

B, 提高网络利用率,允许发送方在收到第一个分组等待确认前可以连续发送多个分组

        这个思路其实很简单,既然有t4-t1的时间空闲,那么我们允许发送方在收到“分组确认”之前继续发送多个分组,则可以把空停止等待期间的时间与网络带宽利用起来。如图可见t4-t1的时间内,此时发送了100个分组,我们继续假设发送一个分组需要t毫秒时间,那么网络的利用率就提高到100t/(t4-t1)*100%,为原来的100倍。

        同时如果每个分组都发回一个分组确认响应(ACK)的话,网络上会存在大量的分组确认响应(ACK)包,ACK包会占用大量的带宽,所以这里同时做了一个改进,减少ACK报文的数量。具体方法为在ACK信息里带上数字编号,表明小于这个数字的所有的包都已经正确接收,如图中“ACK(下一个包是1001)”表明1001之前的包都已经全部正确接收了,那么就减少了999个ACK报文。

        考虑t4-t1和t之间的关系,现实中,因为主机发送速度不同,网络的延时不同,t4-t1和t之前的数值关系可能会出现“100t>t4-t1”,在这种情况下,显然发送方不可以连接发送100个报文。那么问题就来了,我们该如何定义发送端在收到分组确认报文ack前可以连续发送多少个报文呢?这就需要在发送端引入滑动窗口的概念,根据当前窗口的大小来决定发送端在未收到新的一个ACK前可以最多再发送多少个分组报文。

C,理想网络中引入滑动窗口以控制发送方的发送速度

        为了简化理解,我们先认为网络是个理想网络,无抖动,不会丢包,不会乱序(即:数据包总是按发送的先后顺序到达接收方)。我们已经知道,在刚刚定义的理解网络中,只有发送方的发送速度大于接收方的接收速度的时候,我们才需要引入滑动窗口协议控制发送速度。

        这样的情况下,接收方通过ACK,对发送方的发送窗口大小进行控制,从而达到控制发送发发送速度的目的。我们先看一下滑动窗口的几个定义。

       我们给每个分组定义序号,如下图所示1,2,3,4.....(在TCP中序号表的是字节数,4就表示第4n个字节);图中方框(框住1-6的方框)是接收方通告给发送方的发送方的最大的发送窗口的大小(即提供的窗口),表明的发送方最多能够发送有6个已经发送但未接收到确认的分组(TCP中表示字节),此时,可用的窗口大小和最大发送窗口的大小是一至的。在窗口之外的(>7)的都定义为不能够发送

        当发送端启动发送了6个分组(TCP中为6n个字节),其中1-3个分组(TCP中为1n-3n个字节)已经发送并收到确认,4-6分组(TCP中为4n-6n个字节)已经发送但未收到确认后,此时提供的窗口大小不变还是6,但滑动到4-9的位置,此时4-6已经不可用,可用的窗口缩减为7-9,这表明这7-9是还能够发送的,如果发送端有发送要求,还可以继续利用这7-9进行发送。大于等于10的落在窗口之外,就算发送端有发送需求,也不能够发送,直到提供的窗口移动过来才可用。

        所以接收端通过给发送端发送回的ACK,来控制窗口的滑动,进而通过控制发送端剩余可以发送分组数量来控制接收端的发送速度,这就行成了上述定义的理想网络中的滑动窗口协议,完成发送速率控制。

        上图从左到右可以分割成4部分:发送并被确认,发送但未被确认,以够发送,不能够发送

发送但未被确认+能够发送,这二部分共同构成了提供的发送窗口的总大小。

D,真实网络中滑动窗口协议的改进

        真实的网络中,总是会存在丢包和乱序二种情况。那么丢包的就永远不会到达必须依赖发发送方重新发送,而乱序则意味着后发的报文可能会先到,接收方需要先把后发送的报文存起来,等待先发送的报文到达。

        TCP是面向连接的保证顺序的协议,所以TCP要确保在接收方分组报文是按照发送时的顺序被正确的重新组合起来后,再提供给上层应用的。

        所以窗口的滑动会受到丢包与乱序的影响,增加了三个指针(未收到确认的发送分组的起始点,下一个可发磅的分组编号,等待接收的分组报文的起始点),以及将C中的发送但未被确认的分成二部分:落在起始点后的未被确认的分组,和已经被确认的分组。

        如上图中,发送方能够清楚的知道4和5没有被确认,而6和7已经被确认,那么发送方可以清楚的知道要重新发送4和5,而不用重发6和7。

        以上是常规的滑动窗口协议的设计。

        在TCP中,考虑到重发,以及TCP是对每个字节编号,并且在 ACK总是回复确认序号(即确认序号之前的所有字节都已经被正确接收),而不是给每一个分组编号并给每一个分组产生ACK的。所以TCP的接收端总是回复“期待收到的下一个字节序号”。所以如上图中,收到6和7时都回复分组4的第一个字节的序号,表示分组4未收到,期待收到从分组4里的第一个字节的序号开始的数据,那么发送端就知道要重新发送4了。5也是同理,所以当4,5重发并都被正确接收后,接收端因为已经正确的接收了6和7了,就会直接发确认7+1=8的第一个字节的序号了,发送方就不会再生发6和7了。

        注意,通常我们所说的TCP的滑动窗口由发送窗口swnd和接收窗口rwnd组成,而且因为TCP是全双工通信,所以两边的主机同时都是发送方和接收方,所以两边的主机都同时维护了自己的滑动窗口(发送窗口swnd和接收窗口rwnd)。但在通常的局域网中,最大带宽大小固定,几乎无抖动,几乎不会因为网络原因丢包,几乎不会发生乱序。

        在这样的理想网络中,不用考虑拥塞控制等算法的情况下,滑动窗口发送窗口swnd和接收窗口rwnd就会退化成完全相等的同一个窗口。本文章的基于这样的理想网络,再加上只考虑一边固定为发送方另外一边固定为接收方的模型下讨论的。

        TCP协议以上述的滑动窗口协议为基础,通过4种具体的算法:慢启动、拥塞避免、快重传、快恢复、来达到尽可能提高TCP的吞吐量的目标。我们可以在TCP的拥塞控制算法:慢启动算法、拥塞避免算法,快速重传与超时重传算法,快速恢复算法中进行介绍。


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

相关文章

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

SIFT图像匹配原理及python实现(源码实现及基于opencv实现)

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