考点六:TCP可靠传输和拥塞控制

考点六:TCP可靠传输和拥塞控制

TCP的任务是在IP层不可靠的、尽力而为的服务的基础上建立一种可靠数据传输服务。TCP的校验机制与UDP校验一样,而且TCP提供面向字节的序号、确认、超时和自动重传等机制来达到可靠传输。注意,判断一个协议是不是可靠协议,只有该协议具有编号、确认、检错、超时和自动重传机制这些机制,我们才说这个协议是可靠协议。大家可以回忆一下我们学过的协议,只有TCP协议才同时具有这些机制,也就只有TCP协议才是可靠的协议,其他协议都是不可靠的协议。

1.面向字节的序号

TCP首部的序号字段用来保证数据能有序提交给应用层。TCP把数据看成有序的字节流,对发送数据中的每个字节进行编号。在TCP首部中的序号字段指出本报文段所发送数据的第一个字节的序号,而且不同TCP数据段中的数据是按照同一个顺序进行编号的。例如,第一个TCP数据段的序号是0,长度是1024个字节,其对应的编号是0~1023;第二个TCP数据段的序号需要在第一个TCP数据段的基础上编号,那么第二个TCP数据段的序号是1024。在实际的传输中,为了方便管理和提升系统效率,TCP协议使用面向字节的窗口机制(图5-15)对字节的序号和数据的发送进行管理。

图5-15 面向字节的窗口机制

发送方和接收方都维持一定大小的窗口,发送方的数据分为已经发送并收到确认、已发送尚未收到确认、允许发送但尚未发送、不允许发送。其中,落在发送窗口内的数据有允许发送但尚未发送和已发送但尚未收到确认。

对于发送方而言,只有落到发送窗口的数据才可以发送;对于接收方而言,只有落到接收窗口的数据才可以接收。发送窗口并不总是和接收窗口一样大。TCP的流量控制和拥塞控制都是基于面向字节的窗口机制实现的。

2.确认机制

在TCP中,当发送方的数据到达接收方时,接收方主机会返回一个已收到消息的通知。这个消息称为确认应答。

我们举个平时两人聊天的例子,在两个人聊天时,在谈话的停顿处可以点头或询问以确认谈话内容。如果对方迟迟没有任何反馈,说话的一方可以再重复一遍以保证对方确实听到。因此,对方是否理解了此次对话内容,对方是否完全听到了对话的内容,都要靠对方的反应来判断。网络中采用“确认应答”或“否定确认应答”这样的概念。当听懂对话内容时会说:“嗯!”,这就相当于返回了一个确认应答;而没有理解对话内容或没有听清时会问一句“嗯?”,这好比一个否定确认应答。

确认机制是接收方对发送方发送的每个字节进行确认,请特别注意,TCP协议的确认机制是对每个收到的字节进行确认,而不是对每个TCP数据段进行确认。TCP首部的确认号就提供了对发送方发送的数据的确认,其含义期望收到对方的下一个报文段的数据的第一个字节的序号。如果接收方收到一个报文段,此时接收方希望收到的下一个报文段的数据序号是从当前收到的TCP数据段的最大编号的下一个字节开始的。如果发送方在规定时间内没有收到接收方发送的确认数据,将进行自动重传未收到确认的数据段。如图5-16(a)所示,没有出错的情况下,通过发送和确认确保数据有序发送。而错误有两种:第一种是发送的丢失[图5-16(b)],第二种是确认数据丢失[图5-16(c)]。发送方发送数据之后,立即开启计时器,当特定时间内,发送方没有收到确认数据,都将自动重传未收到确认的数据段。

图5-16 发送和确认数据的情况

3.超时机制和自动重传机制

由于网络的不稳定等因素,有可能会导致数据丢失。当数据出现丢失时,为了保证可靠传输,必须要对数据进行重传,有两种事件会导致TCP对报文段进行重传(这个也是发送方重传数据的标志):超时和冗余ACK。其中,超时是发送方的主动行为,只要超时,发送方就会重传数据;而冗余ACK是被动行为,当收到冗余ACK时,发送方等于收到了接收方的信号,立即重传丢失的数据。需要注意的是,重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。

(1)超时:TCP每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到期但还没有收到确认,就要重传这一报文段。

(2)冗余ACK:发送方通常可在超时事件发生之前通过冗余ACK来检测丢包情况。冗余ACK就是再次确认某个报文段的ACK,而发送方之前已经收到过该报文段的确认。

我们通过一个例子来说明冗余ACK,如图5-17所示,发送方发送了序号为M1、M2、M3、M4、M5的TCP报文段。其中,M3报文段在网络中丢失,它将无法到达接收方,那么M4、M5号报文段对于接收方来说就成了失序报文段。TCP规定每当比期望序号大的失序报文段到达时,发送3个冗余ACK,指明下一个期待字节的序号。M4、M5报文段到达接收方,但它们不是接收方所期望收到的下一个报文段,于是接收方就发送3个对M2报文段的冗余ACK,表示自己期望接收M3报文段。TCP规定当发送方收到对同一个报文段的3个冗余ACK时,就可以认为跟在这个被确认报文段之后的报文段已经丢失。这时发送方可以立即对M3报文段执行重传,这种技术通常也称为快速重传。

图5-17 冗余ACK

4.TCP流量控制的实现

TCP提供流量控制是让接收方来控制发送方发送数据的速度,以便接收方能够及时接收和处理数据,以免造成数据溢出和丢失。TCP提供一种基于滑动窗口协议的流量控制机制,在数据链路层讲解过,此处讲解TCP利用窗口机制实现流量控制。

在通信过程中,接收方根据自己接收缓存的大小,设置一个窗口的大小,这个值其实就是TCP报文段首部中的“窗口”字段值,也就是接收窗口。同时根据其对当前网络拥塞程度的分析确定另一个窗口值,称为拥塞窗口,其大小与网络的拥塞状况相关。在实际工作中,接收窗口和拥塞窗口的大小会不断地变化,让发送窗口的实际大小去接收窗口和拥塞窗口中的最小值,从而实现利用接收方的接收能力来控制发送方的发送速度。

注意: 数据链路层的滑动窗口协议的窗口大小不能动态变化,传输层则可以动态变化。

5.TCP拥塞控制

计算机网络就跟交通网络一样,在某段时间,如果对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,也就是产生拥塞;如果网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降。拥塞控制的前提是网络能够承受现有的网络负荷。

这里我们要区分拥塞控制和流量控制的概念。

拥塞控制是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。

流量控制往往是指在给定的发送方和接收方之间的点对点通信量的控制。流量控制所要做的就是抑制发送方发送数据的速率,以便使接收方来得及接收。

类比交通网络,流量控制是控制道路入口的车辆,而拥塞控制不但要考虑道路入口的车辆,还要考虑道路上的情况。例如,道路入口可能畅通,但是道路上发生了故障,这个就是拥塞控制,而不是流量控制。

解决拥塞问题,有以下两种思路:

(1)开环控制:就是在设计网络时事先将有关发生拥塞的因素考虑周到,力求网络在工作时不产生拥塞。

(2)闭环控制:是基于反馈环路的概念。属于闭环控制的有3种措施:监测网络系统以便检测到拥塞在何时、何处发生;将拥塞发生的信息传送到可采取行动的地方;调整网络系统的运行以解决出现的问题。

其中,闭环控制是进行拥塞管理最主要的方法,该方法定义了4种算法:慢开始、拥塞避免、快重传、快恢复。下面介绍几个重要概念:

(1)MSS(Maximum Segment Size)是TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节。”

(2)接收窗口(rwnd):接收方根据目前接收缓存的大小所允许的最新窗口值,反映了接收方的容量,由接收方根据其放在TCP报文首部的窗口字段通知发送方。

(3)拥塞窗口(cwnd):发送方维持一个称为拥塞窗口的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地变化。发送方让自己的发送窗口等于拥塞窗口,发送方控制拥塞窗口的原则:只要网络没有出现拥塞,拥塞窗口就会再增大一些,以便把更多的分组发送出去。只要网络出现拥塞,拥塞窗口就会减小一些,以减少注入网络中的分组数。

(4)发送窗口:发送窗口的上限值应取接收窗口(rwnd)和拥塞窗口(cwnd)中较小的一个,即发送窗口的上限值=min(rwnd,cwnd)。

图5-18 传输轮次

(5)传输轮次:把拥塞窗口所允许发送的报文段都连续发送出去,并收到了对已发送数据的最后一个字节的确认。一个传输轮次所经历的时间其实就是往返时间(RTT)。如图5-18所示,当拥塞窗口cwnd=4时,往返时间RTT就是发送方连续发送4个报文段,并收到这4个报文段的确认总共花费的时间。

需要注意的是,虽然每个传输轮次会让发送窗口的大小加倍,但是每次收到一个数据确认只会让发送窗口加1。宏观加倍,微观加1。

(6)慢开始门限(ssthresh):这是慢开始算法所能达到的阈值,当慢开始算法达到慢开始门限时,就要采用拥塞避免算法。

6.慢开始和拥塞避免

拥塞控制背后的思想很直观,当网络中没有出现拥塞时,就逐渐增加发送的数据量,以实现充分发送数据的目标。当网络中出现拥塞时,立即减少发送的数据量,以便让网络有时间消化这些数据。

(1)慢开始算法。在TCP刚刚连接好,开始发送TCP报文段时,先令拥塞窗口cwnd=1,即一个最大报文段长度(MSS)。而在每收到一个对新的报文段的确认后,将cwnd加1,用这样的方法逐步增大发送方的拥塞窗口(cwnd),可以使分组注入到网络的速率更加合理。

例如,发送方A向接收方B发送数据,当发送时A的拥塞窗口为2,那么A一次可以发送两个TCP报文段,当经过一个RTT后(也称为一个传输轮次),A收到B对刚才两个报文段的确认,于是就把拥塞窗口调整为4,下一次发送时就可以一次发送4个报文段。

使用慢开始算法后,每经过一个传输轮次(往返时延RTT),拥塞窗口就会加倍,即拥塞窗口的大小呈指数形式增长。这样慢开始一直把拥塞窗口增大到一个规定的慢开始门限(ssthresh)(阈值),然后改用拥塞避免算法。

(2)拥塞避免算法。当拥塞窗口达到慢开始门限值时,发送方的拥塞窗口每经过一个往返时延(RTT)就增加一个MSS的大小,使拥塞窗口(cwnd)按线性规律缓慢增长(加法增大),而当出现一次网络拥塞时,令慢开始门限(ssthresh)等于当前拥塞窗口的一半(乘法减小)。根据拥塞窗口的大小执行不同的算法。慢开始门限(ssthresh)的用法如下:

当cwnd<ssthresh时,使用慢开始算法。

当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法。

当cwnd=ssthresh时,既可使用慢开始算法,也可使用拥塞避免算法(通常做法)。

(3)网络拥塞的处理。当网络出现拥塞时,无论是在慢开始阶段还是在拥塞避免阶段,只要发送方检测到超时或事件的发生,就要把慢开始门限(ssthresh)设置为出现拥塞时发送方拥塞窗口(cwnd)值的一半(但不能小于2),然后把拥塞窗口(cwnd)重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的时间把队列中积压的分组处理完毕。需要注意的是,拥塞避免并非完全能避免拥塞。利用以上措施要完全避免网络拥塞是不可能的,拥塞避免是指在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络不容易出现拥塞。

慢开始算法和拥塞避免算法的实现过程如图5-19所示。

图5-19 慢开始算法和拥塞避免算法的实现过程

初始时,拥塞窗口置为1,即cwnd=l,慢开始门限置为16,即ssthresh=16。在慢开始阶段,cwnd初值为1,以后发送方每收到一个确认ACK,cwnd值加1,也即经过每个传输轮次(RTT),cwnd呈指数规律增长。

当拥塞窗口(cwnd)增长到慢开始门限(ssthresh)时(当cwnd=16时),就改用拥塞避免算法,cwnd按线性规律加法增大。

假定cwnd=24时,网络发生拥塞,更新ssthresh值为12(变为超时时cwnd值为24的一半),cwnd重置为1,并执行慢开始算法;当cwnd=12时,改为拥塞避免算法。

在慢开始(指数级增长)阶段,若2×cwnd>ssthresh,则下一个RTT的cwnd应等于ssthresh,而不是2×cwnd,即cwnd不能跃过ssthresh值。在图5-19中,在第16个轮次时,cwnd=8、ssthresh=12,在第17个轮次时,cwnd=12,而不是16。

7.快重传和快恢复

(1)快重传算法。快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方,如图5-20所示。

图5-20 快重传算法的实现过程

发送方只要连续收到3个重复确认,就应当立即重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。

(2)快恢复算法。当发送方收到连续3个冗余ACK(重复确认)时,就执行“乘法减小” 算法,把慢开始门限(ssthresh)设置为出现拥塞时发送方cwnd的一半。快恢复算法与慢开始算法的不同之处是:它把拥塞窗口(cwnd)的值设置为慢开始门限(ssthresh)改变后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大,所以被称为快恢复。快恢复算法的实现过程如图5-21所示,作为对比,虚线为慢开始的处理过程。

图5-21 快恢复算法的实现过程

①发送方发送窗口的实际大小由流量控制和拥塞控制共同决定。因此,当题目中同时出现接收窗口(rwnd)和拥塞窗口(cwnd)时,发送方实际的发送窗口大小是由rwnd和cwnd中较小的那个确定的。

②当rwnd<cwnd时,是接收方的接收能力限制发送窗口的最大值。

③当cwnd<rwnd时,是网络的拥塞限制发送窗口的最大值。

④在考试中,有这样一个考点,TCP Reno中的发送窗口减半的原因不是拥塞,而是丢包,而TCP Tahoe中的发送窗口变为1的原因是超时或拥塞。

【政哥点拨】

1.在TCP协议中,若确认号是500,则含义是( )。

A.已经收到499字节 B.已收到500字节

C.报文段499已经收到 D.报文段500已经收到

解析 A 本题考查TCP协议的确认号的概念。确认号是500,表示500之前的字节都收到了,即已经收到了499字节,期待收到第500字节。注意,TCP是面向字节流的,不是面向报文段的。TCP协议数据是按照一个字节一个字节来传送的,每个字节都有相应的编号。序号字段的值表示本报文段的第一个字节的序号。故而,本题选择A项。

2.在一个TCP连接中,MSS为1KB,当拥塞窗口为34KB时收到了3个冗余ACK报文段。如果在接下来的4个RTT内报文段传输都是成功的,那么当这些报文段均得到确认后,拥塞窗口的大小是( )。

A.8KB B.16KB C.20KB D.21KB

解析 D 当收到3个连续的冗余ACK时,发送方执行“乘法减小”算法,将慢开始门限(ssthresh)变为原来的一半,即17KB。与慢开始算法将拥塞窗口(cwnd)减为1不同,快恢复算法在下一个RTT将拥塞窗口的值变为原慢开始门限的一半,即17KB。之后开始执行拥塞避免,加法增大。

第2个RTT拥塞窗口变为18KB,第3个RTT拥塞窗口变为19,以此类推,第4个RTT的拥塞窗口是20KB。当发出的报文都得到确认后,拥塞窗口再加1,变为21KB。故而,选择D项。

要点一:拥塞避免算法。

当拥塞窗口值大于慢开始门限时,停止使用慢开始算法而改用拥塞避免算法。拥塞避免算法使发送方的拥塞窗口每经过一个往返时延(RTT)就增加一个MSS的大小。

要点二:快恢复算法。

①当发送方收到连续3个重复的ACK时,就重新设置慢开始门限(ssthresh)。

②与慢开始的不同之处是拥塞窗口(cwnd)不是设置为1,而是设置为ssthresh+3MSS。

③若收到重复的ACK为n个(n>3),则将cwnd设置为ssthresh+nMSS。

④若发送窗口值还容许发送报文段,则按拥塞避免算法继续发送报文段。

⑤若收到了确认新的报文段的ACK,则将cwnd缩小到ssthresh。

3.假设在没有发生拥塞的情况下,在一条往返时间(RTT)为10ms的线路上采用慢开始拥塞避免策略。如果接收窗口的大小为24KB,最大报文段MSS为2KB,那么需要( )ms发送方才能发送第一个完全窗口。

A.30 B.40 C.50 D.60

解析 B 本题考查慢开始拥塞避免算法。在慢开始算法中,拥塞窗口和发送方的发送窗口的大小一致,即一个最大报文段(MSS)的长度为2KB。一个RTT之后,大小变为4KB,两个RTT之后变为8KB,3个RTT之后变为16KB。因为接收窗口的大小为24KB,所以第4个RRT能发送一个完全窗口。每个RTT是10ms,4个RTT是40ms。故而,选择B项。

4.一个TCP连接总是以1KB的最大段长发送TCP段,发送方有足够多的数据要发送,当拥塞窗口为16KB时发生了超时,如果接下来的4个RTT时间内的TCP报文段的传输都是成功的,那么当第4个RTT时间内发送的所有TCP报文段都得到肯定应答时,拥塞窗口的大小是( )KB。

A.7 B.8 C.9 D.16

解析 C 当拥塞窗口为16KB时发生了超时,门限值将变成8KB。接下来4次成功传输,拥塞窗口的大小将分别为1个报文段、2个报文段、4个报文段、8个报文段。

在第4次传输成功之后,拥塞窗口的大小已经达到了门限值8KB,第5次开始拥塞窗口就需要线性增长,等于8KB+1KB=9KB。故而,本题选择C项。

政哥应试提醒:拥塞控制一直是考试的重点,其中的4个算法的运行过程,大家需要重点掌握。

难度系数:★★★

牛刀小试

1.在滑动窗口机制中,发送窗口中的报文段可能的状态不包括( )。

A.已发送但尚未确定  B.未发送但可以连续发送

C.已发送且已得到确认 D.未发送但已得到确认

2.TCP协议为了实现可靠的服务,采用超时重传和累计确认技术,并规定,确认号为( )。

A.上一个已接收的报文段的末字节序号 B.下一个希望接收的报文段的首字节序号

C.下一个将要发送的报文段的末字节序号 D.下一个将要发送的报文段的首字节序号

3.在TCP协议中,发送方的窗口的大小是由( )的大小决定的。

A.仅接收方允许的窗口 B.接收方允许的窗口和发送方允许的窗口

C.接收方允许的窗口和拥塞窗口 D.发送方允许的窗口和拥塞窗口

4.下列选项中,( )不是TCP协议用来保证可靠传输的措施。

A.超时重传机制 B.单独应答与捎带相结合的应答机制

C.校验和机制 D.数据包加密机制

5.在一个TCP连接中,MSS为1KB,当拥塞窗口为34KB时发生了超时事件。如果在接下来的4个RTT内报文段传输都是成功的,那么当这些报文段均得到确认后,拥塞窗口的大小是( )。

A.8KB B.9KB C.16KB D.17KB

6.当一个TCP连接的拥塞窗口为64个最大报文段(MSS)的大小时超时,之后假设分组不丢失,且不考虑其他开销,则该连接在超时后处于慢开始阶段的时间是( )。

A.4RTT B.5RTT C.6RTT D.不确定

7.TCP流量控制中拥塞窗口指的是( )。

A.接收方根据网络状况得到的数值 B.发送方根据网络状况得到的数值

C.接收方根据接收能力得到的数值 D.发送方根据发送能力得到的数值

8.对于网络拥塞控制描述正确的有( )。

A.拥塞控制主要用于保证网络传输数据通畅,是一种局部性的控制措施

B.拥塞控制涉及网络中所有与之相关的主机和路由器的发送与转发行为

C.拥塞控制涉及网络中端到端主机的发送和接收数据的行为

D.拥塞控制和流量控制没有任何区别

9.假设TCP的拥塞窗口的慢开始门限值初始为8(单位为报文段),当拥塞窗口上升到12时发生超时,TCP开始慢开始和拥塞避免,那么第13次传输时拥塞窗口的大小为( )。

A.4 B.6 C.7 D.8

10.一个TCP连接的数据传输阶段,如果发送方的发送窗口值由2000变为3000,意味着发送方可以( )。

A.在收到一个确认之前可以发送3000个TCP报文段

B.在收到一个确认之前可以发送1000字节

C.在收到一个确认之前可以发送3000字节

D.在收到一个确认之前可以发送2000个TCP报文段

11.A和B建立TCP连接,MSS为1KB。某时,慢开始门限值为2KB,A的拥塞窗口为4KB,在接下来的一个RTT内,A向B发送了4KB的数据(TCP的数据部分),并且得到了B的确认,确认报文段中的窗口字段的值为2KB,那么在下一个RTT中,A最多能向B发送( ) 数据。

A.2KB B.8KB C.5KB D.4KB

牛刀小试解析

1.D 解析 本题考查滑动窗口机制中发送窗口内报文段的可能状态。滑动窗口中的报文段,其状态可能是已发送但尚未确认、未发送但可以连续发送和已发送且已得到确认;但是未发送的字节,肯定不会被确认。

2.B 解析 本题考查确认号的含义。TCP协议的确认号表示期待收到对方传送的下一个报文数据的首字节的序号,选择B项。值得注意的是,确认号为K,则表明之前传送的K-1个字节都已经被正确接收。

3.C 解析 本题考查TCP协议的发送窗口大小决定要素。发送窗口大小=min[接收方允许的窗口,拥塞窗口]。故而,发送窗口的大小是由接收方允许的窗口和拥塞窗口共同决定的,其大小等于接收方允许的窗口和拥塞窗口的较小值。

4.D 解析 本题考查TCP协议用来保证可靠传输的措施。加密机制是用来保证数据的机密性的,不是用来保证数据的可靠传输的。故而选择D项。其他几项都是用来保证可靠传输的。

5.C 解析 当拥塞窗口为34KB时发生超时,慢开始门限值被设置为17KB(拥塞窗口34KB的一半),而拥塞窗口的大小在接下来的一个RTT内变成1KB。经过第2个RTT,变成2KB,经过第3个和第4个RTT分别变为4KB和8KB。当这些报文段都得到确认以后,拥塞窗口的大小变为16KB。

此时,慢开始门限(ssthresh)为17KB,显然大于拥塞窗口。故而,本题选择C项。

6.B 解析 超时时拥塞窗口大小是64KB,发生超时之后的一个RTT时间内,慢开始门限(ssthresh)变为32KB,拥塞窗口(cwnd)变为1KB,经过第2个RTT变为2KB,经过3个RTT变为4KB,经过4个RTT变为8KB,经过5个RTT变为16KB。

要点:慢开始算法。

在主机刚刚开始发送报文段时可先将拥塞窗口(cwnd)设置为一个最大报文段(MSS)的数值。在每收到一个对新报文段的确认后,将拥塞窗口至多增加一个MSS的数值。用这样的方法逐步增大发送端的拥塞窗口(cwnd),可以使分组注入到网络的速率更加合理。

7.B 解析 本题考查拥塞窗口的概念。TCP流量控制,实质是接收方根据自己接收缓存的大小动态地调整发送方的发送窗口的大小,使接收方来得及接收发送方发送过来的数据。

注意:传输层的流量控制与数据链路层都使用滑动窗口协议来实现流量控制,但是这两者是不一样的。前者定义了端到端用户之间的流量控制;数据链路层则定义了两个端对应的这两台主机之间(这两台主机之间可以有多个相邻的节点)的两个相邻节点之间的流量控制。

8.B 解析 本题考查拥塞控制。首先,我们来区分一下拥塞控制和流量控制。

①拥塞控制是一个全局性的过程,涉及所有的主机、所有的路由器、路由器内部的存储转发处理过程,以及与降低网络传输性能有关的所有因素。

②流量控制往往指在给定的发送方和接收端之间的点对点通信量的控制。流量控制所要做的就是抑制发送方发送数据的速率,以便接收方来得及接收。

9.C 解析 在慢开始算法和拥塞避免算法中,拥塞窗口初始值为1,窗口大小开始按指数增长。当拥塞窗口大于慢开始门限后停止使用慢开始算法,改用拥塞避免算法。此处慢开始算法的门限值为8,当拥塞窗口增大到8时改用拥塞避免算法。窗口大小按线性增长,每次增加1个报文段,当增加到12时,出现超时,重新设门限值为6(12的一半),拥塞窗口再重新设置为1,执行慢开始算法,到门限值为6时执行拥塞避免算法。这样,拥塞窗口的变化为:1,2,4,8,9,10,11,12,1,2,4,6,7,8,9……其中,第13次传输时拥塞窗口的大小为7。

10.C 解析 TCP提供的是可靠的字节流传输服务,使用窗口机制进行流量控制与拥塞控制。TCP的滑动窗口机制是面向字节的,因此窗口大小的单位为字节。假设发送窗口的大小为N,这意味着发送方可以在没有收到确认的情况下连续发送N个字节。

11.A 解析 本题中出现了拥塞窗口和接收窗口,那么发送窗口就是取二者的较小值。先看拥塞窗口,由于慢开始门限值为2KB,第一个RTT中A拥塞窗口为4KB,按照拥塞避免算法,收到B的确认报文后,拥塞窗口增长为5KB。再看接收窗口,B通过确认报文段中窗口字段向A通知接收窗口,那么接收窗口为2KB。因此,在下一次发送数据时,A的发送窗口应该为2KB,即一个RTT内最多发送2KB。所以A项正确。

大显身手

1.当TCP连接初始化时,把拥塞窗口(cwnd)设置为1,慢开始门限的初始值设置为16。假设当拥塞窗口值为24时,发生拥塞。试运用慢开始算法和拥塞避免算法画出拥塞窗口值与传输轮次的关系曲线。

2.当TCP连接初始化时,把拥塞窗口(cwnd)设置为1,慢开始门限的初始值设置为16。假设当拥塞窗口值为24时,发送方连续收到3个重复的确认报文段。试运用慢开始算法、拥塞避免算法、快重传算法和快恢复算法画出拥塞窗口值与传输轮次的关系曲线。

3.TCP的拥塞窗口(cwnd)大小与传输轮次n的关系如表5-7所示。

表5-7 拥塞窗口(cwnd)大小与传输轮次n的关系

(1)试画出拥塞窗口与传输轮次的关系曲线。

(2)指明TCP工作在慢开始阶段的时间间隔。

(3)指明TCP工作在拥塞避免阶段的时间间隔。

(4)在第16轮次和第22轮次之后发送方是通过收到3个重复的确认,还是通过超时检测到丢失了报文段?

(5)在第1轮次、第18轮次和第24轮次发送时,慢开始门限(ssthresh)分别被设置为多大?

(6)在第几轮次发送出第70个报文段?

(7)假定在第26轮次之后收到了3个重复的确认,因而检测出了报文段的丢失,那么拥塞窗口(cwnd)和慢开始门限(ssthresh)应设置为多大?

4.一个TCP连接总是以1KB的最大段长发送TCP报文段,发送方有足够的数据要发送。当拥塞窗口为16KB时发送了超时,如果用慢开始算法,接下来的4个RTT(往返时间)时间内的TCP报文段的传输是成功的,那么当第4个RTT时间内发送的所有TCP报文段都得到肯定应答时,拥塞窗口大小是多少?请叙述慢开始算法与拥塞避免算法并给出此刻的拥塞窗口大小。

大显身手解析

1.解析 本题考查TCP的慢开始算法和拥塞避免算法。

下面详细画出整个过程图(图5-22),这是本章的重点和难点,请学生理解和掌握。

图5-22 拥塞控制原理(1)

在执行慢开始算法时,拥塞窗口(cwnd)的初始值为1,发送第一个报文段M0(图5-23)。

图5-23 拥塞控制原理(2)

发送方收到ACK1(确认M0,期望收到M1)后,将cwnd从1增大到2。于是,发送方可以接着发送M1和M2两个报文段(图5-24)。

图5-24 拥塞控制原理(3)

接收方发回ACK2和ACK3。发送方每收到一个对新报文段的确认ACK,就把发送方的拥塞窗口加1。现在发送方的cwnd从2增大到4,并可发送M3~M6共4个报文段(图5-25)。

图5-25 拥塞控制原理(4)

发送方每收到一个对新报文段的确认ACK,就把发送方的拥塞窗口加1,因此拥塞窗口(cwnd)随着传输次数按指数规律增长(图5-26)。

图5-26 拥塞控制原理(5)

当拥塞窗口(cwnd)增长到慢开始门限(ssthresh)值时(当cwnd=16时),就改去执行拥塞避免算法,拥塞窗口按线性规律增长(图5-27)。

图5-27 拥塞控制原理(6)

假定拥塞窗口的数值增长到24时,网络出现超时(表明网络拥塞了)(图5-28)。

图5-28 拥塞控制原理(7)

更新后的ssthresh值变为12(发送窗口数值24的一半),拥塞窗口再重新设置为1,并执行慢开始算法(图5-29)。

图5-29 拥塞控制原理(8)

当cwnd=12时,改为执行拥塞避免算法,拥塞窗口按线性规律增长,每经过一个往返时延就增加一个MSS的大小(图5-30)。

图5-30 拥塞控制原理(9)

【易错知识点】

“拥塞避免”并非指能够完全避免拥塞,而是利用以上的措施要完全避免网络拥塞是不可能的。

“拥塞避免”是指在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络不容易出现拥塞。

2.解析 快重传算法规定发送方只要连续收到3个重复的ACK即可断定有分组丢失了,就应该立即重传丢失的报文段而不必继续等待为该报文段设置的重传计时器的超时。

快恢复算法规定如下:

①当发送方收到连续3个重复的ACK时,就重新设置慢开始门限(ssthresh)。

②与慢开始不同之处是拥塞窗口(cwnd)不是设置为1,而是设置为ssthresh+3×MSS。

③若收到的重复的ACK为n个(n>3),则将cwnd设置为ssthresh+n×MSS。

④若发送窗口值还容许发送报文段,则按拥塞避免算法继续发送报文段。

⑤若收到了确认新的报文段的ACK,则将cwnd缩小到ssthresh,如图5-31所示。

图5-31 快重传算法工作原理

3.解析 (1)拥塞窗口与传输轮次的关系曲线如图5-32所示。

图5-32 拥塞窗口与传输轮次的关系曲线

(2)开始时,当拥塞窗口小于慢开始门限值32,采用了慢开始算法,拥塞窗口指数增长。由图5-32可知,慢开始时间间隔为[1,6]和[23,26]。

(3)在拥塞避免阶段,为了减少进入网络的数据量,避免拥塞,采用线性增长的办法。由图5-32可知,拥塞避免时间间隔为[6,16]和[17,22]。

(4)在第16轮次之后发送方通过收到3个重复的确认检测到丢失的报文段。在第22轮次之后发送方通过超时检测到丢失的报文段。

(5)在第1轮次发送时,慢开始门限(ssthresh)被设置为32。在第18轮次发送时,慢开始门限(ssthresh)被设置为发生拥塞时的一半,即21。在第24轮次发送时,慢开始门限(ssthresh)是26的一半,即13。

(6)在慢开始阶段,拥塞窗口分别为1、2、4、8、16、32,到此总共传输了63个报文段。下一轮次的拥塞窗口大小是33,该轮可以发送出第64~96个报文段,故而第70个报文段在第7轮次发送出。

(7)在第26轮之后,拥塞窗口变为8,收到了3个重复的确认,拥塞窗口cwnd和门限ssthresh应设置为8的一半,即4。

4.解析 当拥塞窗口变为16KB时,发生了超时,慢开始门限值变为原来的一半,即8KB,拥塞窗口则变为1KB。

第1个往返之后拥塞窗口变为2,然后向接收方发送两个最大报文段。在规定时间段里收到接收方的确认之后,拥塞窗口变为4。

此时,发送方可以向接收方连续发送4个报文,如果报文正常传输,即接收方能够正确收到并确认这些报文,在第3个往返之后拥塞窗口变为8。

如果报文正常传输,第4个往返之后开始拥塞避免算法,将拥塞窗口比以前增加一个最大报文段,即拥塞窗口设置为9。