TCP滑动窗口协议与流量控制
创始人
2024-05-23 14:07:46
0

        谈到TCP的滑动窗口协议与流量控制,便会想起2006年去华为-3COM(现H3C公司时)面试时的场景。

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

        结果面试时领导只问了我二个问题:1,和我讲讲TCP滑动窗口协议与流量控制的过程。2,请详细描述一下TCP慢启动的原理。这二个问题当场就把我打回了原形。虽然最终,领导也许看我那时年纪尚小还有进步空间(骨骼清奇,是一个练武的奇才)最终还是给我发了offer,但这二个问题一直记我记忆尤新。

        时光飞逝,自己人到中年,自己也成了带团队的所谓领导了。10多年来,面人无数,面试时也一直用这二个问题来考查应聘者对TCP的理解程度以及面试着对技术的刨根问底的精神,实际上这么多年也几乎没有碰到过能真正讲清楚这二个问题的应聘者,能讲一些大面上的基本原理的应聘者已经算是佼佼者了。最近新的实验室时老碰到网络的连接问题,所以花了点时间给部门里的同事准备了一系列TCP/IP相关的培训。事后有同事向我反馈:TCP滑动窗口协议与流量控制,TCP慢启动这二块不是很好理解,问我能不能写做个简单的汇总,写成文章以备后续查阅,所以就有了此文。

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

一,什么是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协议以上述的滑动窗口协议为基础,通过4种具体的算法:慢启动、拥塞避免、快重传、快恢复、来达到尽可能提高TCP的吞吐量的目标。我们可以在后续的文章中,再进行介绍。

相关内容

热门资讯

烟台海昌鲸鲨馆导游词 烟台海昌鲸鲨馆导游词3篇  篇一:烟台海昌鲸鲨馆导游词  来到鲸鲨馆门前,别具一格的螺状建筑展现在眼...
神农架导游词 神农架导游词推荐  神农架于1986年经国务院批准为国家级森林和野生动物自然保护区。  神农架区为湖...
云南九乡导游词 云南九乡导游词  导游词是导游人员引导游客观光游览时的讲解词,是导游员同游客交流思想,向游客传播文化...
五台山殊像寺导游词 五台山殊像寺导游词  导语:对五台山的殊像寺,导游会怎样解说?下面是小编整理的五台山殊像寺导游词,欢...
孝感董永公园导游词 孝感董永公园导游词  董永公园位于孝感市,国家AAAA级旅游景区,位于孝感市城区槐荫大道东段,距武汉...
拜将台的导游词 拜将台的导游词  我们现在就来到了拜将台。拜将台作为汉初三遗址之一,它坐落在汉中城南,是刘邦拜韩信为...
庐陵文化生态园导游词 庐陵文化生态园导游词  庐陵文化生态园位于江西省吉安市吉州区城北、赣江之滨,整个公园是利用螺子山山体...
玉林都峤山导游词 玉林都峤山导游词  作为一位尽职的导游,可能需要进行导游词编写工作,导游词可以加深游客对景点的印象,...
山西省榆次常家庄园简介导游词 山西省榆次常家庄园简介导游词  常家庄园位于榆次西南东阳镇车辋村,距榆次17.5公里。车辋由四个小自...
黄山的景点导游词 黄山的景点导游词(通用7篇)  作为一名导游,通常需要准备好一份导游词,导游词一般是根据实际的游览景...
西双版纳热带植物园导游词 西双版纳热带植物园导游词推荐  各位朋友,大家好。今天我们将游览闻名遐迩、风光绚丽的中国科学院西双版...
浙江仙华山导游词 浙江仙华山导游词  作为一名具备丰富知识的导游,通常会被要求编写导游词,导游词事实上是一种对旅游景点...
广州资政大夫祠的导游词 广州资政大夫祠的导游词  新华镇三华村,有一处资政大夫祠古建筑群,建于清同治二年(1863)  整个...
贵州万峰林导游词 贵州万峰林导游词  作为一位杰出的导游,总不可避免地需要编写导游词,导游词具有极强的实用性,涉及的知...
鸟巢导游词英文 鸟巢导游词英文范文  作为一名乐于为游客排忧解难的'导游,通常需要准备好一份导游词,导游词的主要特点...
开封包公祠导游词 开封包公祠导游词  包公祠全名“包公孝肃祠”,位于合肥市 环城南路东段的一个土墩上,是包河公园的主 ...
浙江省安吉大竹海导游词 浙江省安吉大竹海导游词  导游内容:大竹海概况→五女湖.五女船→竹龙引泉→动感影视吧→投缘池→幽泉煮...
斗篷山导游词最新 斗篷山导游词最新范文  作为一位不辞辛劳的导游,就不得不需要编写导游词,导游词是讲解当地的基本情况,...
云南省大理概况导游词 云南省大理概况导游词(精选5篇)  作为一无名无私奉献的导游,通常会被要求编写导游词,导游词是导游员...
武当山南岩宫导游词 武当山南岩宫导游词(精选12篇)  作为一名可信赖的导游人员,常常需要准备导游词,导游词具有极强的实...