zoukankan      html  css  js  c++  java
  • 【知识强化】第五章 传输层 5.3 TCP协议

    这节课我们来学习一下TCP协议的特点以及TCP报文段的格式。

    首先呢我们来看一下TCP有哪些特点呢。之前我们说过TCP它是一个比较可靠的面向连接的协议,所以最主要的特点它是可以面向连接的一种传输层协议。那之所以说面向连接呢就是指应用程序在使用这个TCP协议之前,必须要先建立好一个TCP的连接,在传输数据完毕之后呢再释放这个已经建立的连接。也就是说俩应用进程之间的通信啊好像就是在打call一样,啊只要两个人电话打通了才可以进行数据的传输,也就是TCP它面向连接的一个特点。那这里面为什么说它是虚连接呢?这其实跟我们之前讲传输层逻辑通信是一样的道理,它并不是实际的一个物理连接,因为实际上这个连接过程应该是啊把这个数据报加上各个层次的首部之后,放到链路上面传输,然后再到接收端进行一步又一步的解封装。这个是一个完整的物理连接。但是TCP协议的使用呢,就好像两个进程之间建立一个一点对另一点的这种点对点的连接,好像是进程和进程直接连在一起了,所以我们说是一种虚连接。

    第二个特点呢是就是每一条TCP连接只能有两个端点,也就是说每一个TCP连接只能是点对点,一对一的。所以TCP协议呢是没办法用于广播以及多播的这种通信方式。

    那第三点呢就是TCP它可以提供可靠交付的服务,可以使得报文段无差错、不丢失、不重复、按顺序地到达。总结下来呢就是可靠有序,不丢不重。

    第四个特点呢就是TCP是可以提供全双工通信的。那全双工指的就是发送方和接收方它们俩这个角色是不定的,啊两个人可以同时发送数据也可以同时接收数据。啊这就是全双工通信的一个特点。

    那由于这种全双工通信的特点呢,这个TCP协议的两端都会设置有发送缓存以及接收缓存。啊发送缓存大家就可以想象成是一个啊准备发送的一个队列,接收缓存呢就是一个准备接收的队列。那发送缓存它当中包含什么呢?主要是这两类的数据。一类是准备发送的数据,也就是应用层已经准备好有待发送没有放到链路上的数据。第二类呢就是已经发送但是还没有收到

    这节课我们来学习一下TCP的连接管理。

    那我们在之前学过,这个TCP它是要面向连接的一种协议。面向连接,也就是一种可靠的协议。那通过面向连接呢,就建立了一点和一点之间的这种点对点、一对一的通信。那在通信的时候呢是可以采用全双工的通信方式,也就是这个两台主机呢它们既可以做数据的发送方,也可以同时作为这个数据的接收方。那我们说过,TCP面向连接的这种方式呢,就特别像你在打电话。那我拿起电话,啊拨通了这个电话号之后呢就可以开始跟你聊天了。聊完天之后,我把这个电话再挂断。那我们刚刚建立的通话连接呢也就暂时关闭了。那其实TCP连接也是这样一个过程。

    它需要经过三个阶段,第一个呢就是连接的建立。第二个阶段就是数据的传输。第三个阶段呢就是连接的释放过程。那对于TCP连接的两个端点,或者说两个主机的两台进程,啊它们采用的是客户和服务器的方式。那这个客户服务器呢其实就是在说,通信的两个端点两个主机,它们两个的角色是不一样的。主动发起连接建立的应用进程呢就叫做客户,而被动等待连接建立的应用进程呢就叫做服务器。虽然它们的角色不同,但是它们都可以接收数据并且发送数据。

    那我们接下来先看一下TCP连接建立的一个过程。其实呢就是同学们非常熟知的三次握手,在这里面我们举一个例子。假如说这儿有一个男生,他想跟另一个女生说话。啊他就说有件事不知当讲不当讲,那这个女生就回复说当讲,你说吧。那这个男生就会回复,好的!就相当于对这个女生确认回复的一个确认回复。然后呢这个男生就可以开始滔滔不绝地讲自己想说的东西,也就是进入到了第二阶段,数据传送阶段。那可以看到,如果这个男生和女生分别是客户端以及服务器端的话,那其实就代表了TCP连接建立的三次握手过程。

    那接下来我们来具体看一下。假设运行在一台主机也就是客户端上的一个进程想要和另一台主机也就是服务器端上的进程建立一条连接进行通信。客户应用进程呢就会首先通知客户TCP,其实也就是告诉传输层现在呢我想要跟另一台主机当中的一个进程通信了,那麻烦你使用TCP协议,帮我建立好连接,并且把我的数据传输过去。那客户当中的这个应用进程呢就会使用TCP协议,来通过以下的步骤与服务器当中的这样一个进程建立一条TCP的连接。

    那这个就是连接建立的一个图示。首先呢我们来看第一步。主机现在想要跟服务器通信,也就是想使用服务器的服务。首先它就会先发送一个报文段。那这个报文段呢就是由客户端发送的连接请求报文段,那这个报文段的特点它是没有应用层数据的,也就是这个报文段它没有数据部分,只是一个连接请求的作用。那考试的重点呢是考查我们对于这几种报文段,也就是三次握手过程当中所产生报文段当中啊首部的一些非常重要的字段。

    首先我们来看,在这个第一个,也就是这个连接请求报文段当中,有两个字段非常重要。第一个呢就是这个SYN,也就是我们上节课讲的6位控制位当中的同步位。那这个同步位如果置为1呢就代表这是一个连接请求,或者说是连接请求的接受报文。那因此对于连接请求报文段,要将SYN这一位置为1,同时呢对于这个seq,啊这个seq其实就是上节课所讲的这个序号。序号位呢它是占32位,也就是占了4个字节。那这个序号位是随机产生的,是由这个主机内部随机产生一个序号,可以从一开始,也可以从任意一个随机数开始。那至于确认号呢,在这里面是没有效的。因为首先,客户端没有收到服务器端发过来的报文段,因此客户端就不知道自己接下来应该期待什么,不知道应该期待啊服务器端发来哪个序号的报文段,所以这个时候呢,确认序号它是没有意义的。那当然,在6个控制位当中的大写ACK,也就是确认这一位,它是0,现在是0。

    那接下来我们再来看第二个阶段。

    这节课我们来学习一下TCP的可靠传输。

    那在之前呢我们学习过网络层,这一个层次呢它提供的是一个尽最大努力交付的,不可靠的一种传输方式。因此呢,它的上层就要担负起可靠传输的职能。那上一层呢就是传输层,而传输层有两个非常重要的协议,UDP和TCP。那UDP我们之前讲过它是一个不可靠传输的协议,但是这里面TCP呢是一个可靠传输的协议。因此呢,网络层如果不能可靠传输的话,传输层就可以通过TCP,来实现可靠传输。那如果使用的是UDP协议呢,就要靠上层的应用层来实现这个可靠传输了。

    那我们一直在讲的这个可靠传输,可靠指的是什么呢?啊指的就是保证接收方进程从缓存当中读出的字节流与发送方发出的字节流是完全一样的,也就是我发送的是1、2、3、4、5,那你收到的应该也就是这种按序的而且不丢失的1、2、3、4、5。那这节课我们要讲的TCP可靠传输总共有四种实现办法,或者说有四种可靠传输的机制,分别是校验、序号、确认以及重传。

    那这个校验呢,在这里面就简单地提一句,因为它和上节课我们讲的UDP协议的校验方式是完全一样的,都是通过在发送方和接收方增加一个伪首部,然后通过使用二进制反码求和的计算方法来判断有没有发生错误,那这个就是校验的方式。那接下来序号、确认和重传机制呢,其实我们在之前的一些例子当中也有提及过,这里面我们再来看一下。

    首先就是这个序号的机制。我们之前讲过,TCP协议呢它是面向字节流的,那因此我们这个TCP在传输的时候就是按照这样一个字节为单位,所以我们就会把一个字节编上一个序号,第一个字节就是序号1,第二个字节序号2,啊依次类推。那当然对于一个文件或者要发送的数据,它的第一个字节,这个序号是多少,是可以随机的。那当然在实际发送的时候呢,我们是以报文段为单位,啊虽然我们说TCP是面向字节流,但是在发送的时候它如果把一些字节放在一起,组成一个报文段,然后再把这个报文段发送出去。

    那这个报文段的大小呢,也是不定的。啊可以是三个字节、三个字节、两个字节、两个字节,这只是比较少的情况。那也可以多个字节,几十个字节、几百个字节形成一个报文段都可以。那这个报文段的大小划分呢就要取决于链路层它的MTU,也就是最大传输单元来决定。所以根据刚才所讲的呢,我们就知道一个字节它是占用的一个序号的。同时有关于序号呢,我们在TCP报文段格式的时候也学习过了一个序号字段。那这个序号字段指的就是一个报文段它的第一个字节的序号。那比如说这样第一个报文,1、2、3这三个字节组成的报文段。啊这个报文段它首部当中的序号字段呢应该就是1,填写的就是第一个发送的这个字节的序号。那有了这个序号呢,就可以保证数据能够有序地提交给应用层。而基于这个序号机制呢,我们就产生了接下来的确认以及重传机制。

    我们先结合一个例子来理解一下这个确认的过程。假如说这个是发送方,发送方的TCP缓存当中呢,现在有这些个报文段。那这个就是接收方。

    首先发送方要给接收方发送第一个报文段,也就是1、2、3字节所构成的这样一个报文段。那发过去之后呢,接收方就收到了,并且存储在自己这个TCP缓存当中,然后呢再找一个合适的时间,把这个缓存当中的数据或者说把缓存当中的报文段上传上去,提交给应用层。那可以看到,现在这个发送方TCP缓存当中,还是有1、2、3字节组成的报文段。啊这是为什么呢?因为我们知道,如果这个网络太过于复杂的话,啊或者说网络上面出现了一些问题,有可能就导致这个TCP报文段发生了丢失现象。也就是这个第一个报文段1、2、3字节,它们在传输的过程当中丢失了,那因此呢接收方就收不到这样一个报文段。啊所以接收方它可能就会让这个发送方再重新传一次,因为接收方它为了要保证可靠传输,就应该使得发送方发送的所有数据它都能够按序地、完整地接收到。所以这个发送方就要一直保持着这样一个报文段,直到呢接收方告诉它我确定收到了,然后发送方才可以把这个报文段拆除掉或者是从缓存当中删去。那这个发送方如何知道接收方正确地而且是完整地接收到了这个报文段呢,就是靠我们这个确认机制。

    接收方收到了这个报文段之后呢,就会返回

    这节课我们来学习一下TCP的流量控制。那在之前几个章节呢我们都学习过流量控制,对于它的定义呢大家应该都很熟悉了。

    流量控制指的就是让发送方发慢一点,这样呢才会使得接收方可以来得及接收。那这个也是我们经常看到的一个图。为什么需要流量控制呢?主要是因为,在平时发送数据的时候我们通常都会希望这个发送数据的速率可以更快一些。但是如果发送速率过快,就会使得接收方可能来不及接收,那这样呢就会导致非常严重的丢包现象,所以呢才需要有流量控制,来控制发送方的一个发送速率。

    那在TCP这一块呢,我们使用的是滑动窗口的机制来实现流量的控制。那对于滑动窗口,我们在链路层的时候已经详细地讲解过。那TCP呢在使用滑动窗口机制时,和链路层所讲的滑动窗口机制,是非常类似的。

    那TCP进行流量控制的一个具体过程呢,就是在通信过程当中,接收方会根据自己接收缓存的大小,来动态调整发送方的发送窗口大小,也就是有一个接收窗口rwnd。那

    这节课我们来学习一下TCP的拥塞控制。

    首先呢我们要了解这样一个问题,什么叫做拥塞。拥塞呢简单来说就是堵了,那在网络当中呢也就是网络状况不好,网络发生了堵塞,导致我们接收数据以及发送数据,整个这个速度全部都降下来了。那这就是拥塞所产生的一种情况。

    那产生拥塞的条件呢,就是在于对于资源需求的总和大于了可用的资源。那这里面的资源指的是什么呢?主要指的是网络当中的一些链路容量,比如说带宽。那也就是说这样这一条链路它想说是50M的带宽,很多人都往这个链路上面发送数据,就导致这个链路上的带宽不够大家来使用了,所以就导致这个网络出现了拥塞。那同样呢还有交换结点当中的缓存,以及交换结点当中的处理机。比如说路由器当中的处理机等等,这都属于资源。那如果在某段时间对于网络当中某一个资源的需求,总和超过了这个资源它可以提供的可用部分,那网络的性能呢自然就会变坏,因此呢就会有许多资源同时呈现一个供应不足的情况。啊就会使得网络的吞吐量将随着输入的负荷增大而下降。也就是越多人在使用这个网络的话,那这个网络就越来越瘫痪,性能就越来越差。那这个拥塞控制呢是一个比较复杂的问题,但是拥塞控制的目的呢却又是非常简单的,就是防止过多的数据注入到网络当中。这是一个全局性的问题。为什么这么说呢?我们可以想一下,这个网络当中出现了拥塞,或者说网络堵了,是一个主机造成的,还是很多个主机造成的呢?当然是很多个主机同时使用这个网络上的资源所以才导致整个网络出现了拥塞的情况。因此呢,这个拥塞控制,其实就是要协调使用这个网络资源的所有主机,通过主机之间的协调就可以防止有过多的数据注入到这个网络当中。因此呢就可以减轻网络的堵塞情况或者说拥塞情况。那讲到这里呢相信同学们对于拥塞控制和流量控制有一些混淆,因为拥塞控制现在听起来也是让这个发送数据的一方它减慢它自己的发送速率,那流量控制呢也是让这个发送方把这个发送速率再放慢一些。

    那它们俩的区别在于什么呢?拥塞控制和流量控制我们画这样两个图,那首先可以看到第一个图,啊假如说这一边是一个接收方,那这几个地方呢都是发送方。这些发送方呢都要给这样一个接收方发送数据,那如果它们同时使用这个网络上的资源,或者说同时使用这个结点,这个交换结点这个路由器的话,就会使得这个网络非常的繁忙,甚至呢出现一个拥塞的情况。那么这个接收方呢就会察觉到这样一种拥塞情况,但是它却并不知道这种拥塞情况究竟是具体哪一台主机或者是哪几台主机发送速率过快或者说发送数据过多所造成的。而这个流量控制呢它是一种点对点之间的通信量的控制,是一个端到端的问题。如果这个接收方它收来了这个数据来不及接收了,那它知道应该找谁,找的就是这个发送方。所以说流量控制它是一个点到点之间的一个问题。而拥塞控制呢它是一个全局性的问题。再有一点呢就是拥塞控制主要是因为这个网络发生了堵塞,导致很多发送方发送来的数据呢迟迟到不了接收方。而这个流量控制呢,就是这个发送方的速率过快导致这个接收方它接收缓存不够或者说它的接收窗口不够,也就是来不及接收。那这就是拥塞和流量控制的一个区别。

    那接下来我们就来学习一下拥塞控制的几种算法,分别是慢开始、拥塞避免、快重传以及快恢复。那同一个颜色呢我们就是组合使用的,也就是慢开始和拥塞避免呢我们是放在一起来学习和使用。而快重传和快恢复呢它们也是放在一种情形下来使用的。

    那我们在研究这四种算法之前呢,首先要有几个假定。第一个假定呢就是数据它是假定单方向传送的,而另一个方向呢只是传送确认也就是一方发送数据,另一方呢只是发送一个确认的报文段,而并不是传送有效数据进行一个捎带确认。那这个只是为了我们讨论问题方便,但是实际上呢这个捎带确认也是比较常用的。

    那第二假定就是接收方总是会有足够大的缓存空间,因而发送窗口的大小呢只取决于拥塞程度。好,我们上节课学过这样一个规定,发送窗口呢它应该取接收窗口以及拥塞窗口两者之间的最小值。那我们在讨论拥塞控制的时候呢,暂且就先假设这个接收窗口对于发送窗口是没有限制的。因此这个发送窗口大小呢只受拥塞窗口的大小。那拥塞窗口大小是多少,也就是发送窗口大小就是多少。那在这里面再强调一下接收窗口和拥塞窗口两者的区别。接收窗口呢指的是接收方会根据接收缓存设置的值,告知给发送方,啊这个接收窗口呢反映的是接收方的一个接收容量或者说接收方的一个接收能力问题。而这个拥塞窗口呢是发送方根据自己估算的网络拥塞程度,而设置的一个窗口值,反映的呢是网络当前的一个容量。可以看到接收窗口和拥塞窗口区别有两个,第一个呢接收窗口是接收方它设置的,拥塞窗口呢是发送方它来设置的。第二点呢就是接收窗口它反映的是接收方的一个接收能力或者是接收方的容量。而拥塞窗口呢反映的是一个全局性的一个网络的当前容量问题。那在理解了两个假定以及这两种窗口之后呢,我们就来学习一下拥塞控制的四种算法。

    首先呢我们来学习第一组,慢开始和拥塞避免算法。那对于拥塞控制的四种算法呢,在考研当中啊作为选择题的出镜率还是比较高的。所以我们要非常清楚这四种算法的一个应用过程,但是对于这四种算法的具体细节呢是不做考察的。所以在这里面我们就结合这样一个图示来学习一下慢开始和拥塞避免。首先呢我们来搞清楚这两个横纵坐标,对于这个纵坐标呢它指的是拥塞窗口的大小,那可以看到这是0、4、8、12、16等等,一直往上。

    那这个拥塞窗口最开始的初始值呢,是默认设置为1的,也就是cwnd=1。那这个1呢代表的并不是一个字节,我们为了讨论方便,在这里面1指的就是一个报文段。而这一个报文段呢它的长度是一个最大报文段的长度MSS。所以说对于上面的4、8、12,啊4指的呢就是有4个MSS,那8呢就是有8个MSS,也就是说啊随着这个传输轮次的增加,我们的拥塞窗口它也会发生变化,那至于变到几就说明我们现在的发送窗口是几,也就是我们现在可以发送多少个报文段,也就是说我们现在可以发送多少个最大报文段的长度MSS。

    那接下来我们看横坐标,横坐标说的是传输轮次。那什么叫传输轮次呢,一个传输轮次也就是一个单位,它指的就是发送一批报文段并收到它们的确认的时间,啊如何理解。假如说现在有一个主机A,和一个主机B,现在呢主机A给主机B发送了一个报文段,那B呢就会返回一个对于这个报文段M1的确认。那这就算是一个传输轮次。那接下来A看到这个网络情况还是挺好的,它就可以继续往下多发几个。那它现在就发送两个报文段M2和M3。啊那B收到这两个报文段呢,啊依次返回两个确认,啊对于M2和M3的确认。那到这个时间为止,到M3的这个确认为止,这样一段就是第二个传输轮次。那接下来A觉得这个网络还是可以的,那我再多往这个网络当中注入一些报文段。因此呢,它就把报文段的数量再次增加,或者说它根据这个拥塞程度把拥塞窗口调大,因此呢它的这个发送窗口自然也就调大了。因为我们现在假定是接收窗口它是很大的,那现在发送窗口呢就会变到4个,所以A呢,它就会连续发送4个报文段。那因此B收到这4个之后呢也会返回确认报文。假如说它现在返回了4个确认报文,那到最后一个报文为止啊这样一段时间或者说这样一个阶段,就叫做另一个传输轮次,就是第三个传输轮次。所以这就是传输轮次的一个意思,表示发送一批报文段并收到它们确认的时间。

    那在考试当中呢,我们这个传输轮次,也指的是一个往返时延RTT。啊一个单位呢就指的是一个RTT,两个单位呢就是两个RTT。那当然这个传输轮次呢还可以表示的是开始发送一批拥塞窗口内的报文段到开始发送下一批拥塞窗口内报文段的时间。如何理解呢?A给B发了一个报文,那B发了一个确认,那接下来A开始给B第二批报文,啊这里面它发送的是两个。所以就是从这儿到这儿的时间,也是一个传输轮次的时间。

    好,那在理解了这个传输轮次以及拥塞窗口之后呢,我们就来看一下这个图当中所体现的两个算法。首先慢开始,慢开始说的是前面这样一个部分。那前面这个部分同学们可以仔细观察一下它是一个指数规律增长,一个爆炸式增长的过程。但是为什么说它是慢呢?因为我们最开始注入的是一个报文段,起始的默认值是一个报文段。那这个相对于我们一下子在开始的时候注入很多个报文段来说肯定是要慢一些,就是要先对这个网络进行探查。看一下这个网络的拥塞情况,如果还比较好,我就继续增加我的拥塞窗口,发送方增加发送窗口也就是变相增加拥塞窗口,那再多发送几个报文段。那我们可以看到现在经历了一个传输轮次之后呢,这个拥塞窗口呢就由1变成了2,虽然是指数增长,所以说我们每经过一个传输轮次它的这个拥塞窗口都变为了原来的2倍,也就是由1变成了2。那接下来再经过一个传输轮次之后,它感觉到这个网络的拥塞程度还是很OK的,所以就再往这个网络当中多注入一些报文段。那注入多少呢?就注入刚才的2倍,也就是2*2也就是4个,注入了4个报文段。接下来再经过一个传输轮次,到了这个3,这个位置就注入8个报文段。那再往下,到了这个4,啊到第4个传输轮次这儿呢它就注入了16个报文段,就是2*8也就是16个报文段。那到16为止,我们可以看到它所对应的纵坐标说的是ssthresh的初始值,这个单词是什么意思呢?它指的是一个慢开始门限。什么叫慢开始门限,也就是到了这个纵坐标这个位置的时候,到了这个初始值,我现在速度就要稍微减一点了,就是由慢开始进入到拥塞避免。因为我们现在注入的报文段有点多,所以担心之后很快会发生拥塞情况。那我们现在就把这个速度稍微降一降,降成什么样呢?每一次只在之前的拥塞窗口基础上增加一个拥塞窗口,也就是说现在我们的拥塞窗口值是16,也就是到了这个慢开始门限值。那接下来呢,就进入拥塞避免算法过程。这个过程是加法增大,它是一个线性增长的过程。那接下来再经过一个传输轮次,我们就只加1,也就变到17。那再经过一个传输轮次,18、19、20、21、22、23、24。好,那到了这个24的时候呢,发生了网络拥塞。也就是发送方它检测出这个网络出现了拥塞,出现了丢包现象。所以现在呢,要执行的一个操作就是由24再直接降到为这个拥塞窗口为1,也就是瞬间把拥塞窗口从很大的一个24个报文段缩小到只有一个报文段,也就是缩小到最开始的这样一个慢开始状态,继续执行慢开始算法。那这里面要注意,这个慢开始算法呢,接下来的过程都是一样的,1、2、4、8。啊都乘以2,但是到这样一点呢,就不一样了。啊这一点我们可以看到它是一个新的门限值,那这个新的门限值是什么时候确定的呢?就是在网络拥塞的情况下马上确定的。只要发生了网络拥塞,立刻把当时的拥塞窗口除以2定义为新的门限值也就是24/2定义为新的门限值12。所以说之后如果再撞到这个12了,我们马上就要采取这个拥塞避免的加法增大过程。也就是到了8之后呢再经过一个传输轮次,到不了16了先到12,先到门限值。然后呢到了门限值之后我们就开始啊加法增大。每经过一个传输轮次就增加1,也就是12、13、14、15、16、17,依此类推。如果再次发生网络拥塞,那要进行的步骤呢第一个就是立即把这个拥塞窗口降为1,啊降为初始值,同时呢再把这个门限值重新设置一下,设置为当时发生网络拥塞时这个拥塞窗口的一半,除以2。接下来呢再重新执行慢开始以及拥塞避免的算法。那这就是慢开始和拥塞避免的一个算法过程,还是简单的,那这一块儿呢同学们要多结合一些习题来练习一下。那还要补充的一点是,至于这个拥塞窗口它什么时候翻倍,也就是在慢开始的时候它由4变成8,由2变成4,由1变成2的呢,这个是只要收到了之前所发送的报文的确认,啊一收到确认马上就会把这个拥塞窗口翻倍,然后呢再去发送这个报文段。

    接下来我们就来学习一下第二组这个拥塞控制的方法,也就是快重传和快恢复。那这个快重传和快恢复呢,和刚才也比较类似,至于这个快重传我们在上节课已经讲过,什么叫做快重传?就是只要收到三个重复的确认,三个冗余的确认之后就会执行快重传算法。假如说现在主机A和主机B进行通信,A呢给B发送了报文段M1,啊又给它发送了第二个报文段M2,又给它发送了一个M3,又发送了一个M4,又发送了一个M5。那首先呢这个M1发过去B就会发过来一个确认。那M2呢发过去很不幸的是这个,这个在路上丢失了,B就收不到。那接下来A又发送M3,那B收到M3之后它会返回一个确认,不过这个确认呢它是对于M1的确认,也就是期待收到M2。啊这里面的Ack值应该指的就是M2的第一个字节的值。那接下来它又发送M4,那当然B它这个痴心不改,它一直等着这个M2,所以这个返回的确认号和刚才的是一样的。那发了M5之后,B没有收到M2,还是要返回一个对于M1的确认,就是告诉它告诉A我现在想要收到一个M2的报文段,请你赶快给我发过来。那可以看到,在这样一个过程当中呢,B给A发送了4个对于M1的确认报文段,而这4个当中呢,后面3个我们之前讲过,它们叫做冗余Ack,就是多余的、重复的这样一个确认报文。那只要发送方收到这样三个冗余Ack之后呢,就会马上执行快重传算法,也就是赶快重传,那这样呢就可以在超时计时器到期之前,啊快速地执行这样一个重传的过程,省下了很多等待的时间。那这个就是快重传算法,其实就是对于上节课的一个复习。那接下来我们看,快重传算法之后我们进行的操作就是快恢复。

    那这和刚才的区别呢主要在于,啊刚才是只要发生了拥塞就会马上降为初始值,从拥塞窗口为1开始啊执行这个慢开始的算法。但是这里面呢是只要收到了3个重复的确认,也就说明可能发送的报文段出现了丢失之后,我们就马上执行一个快恢复。那这里面的快恢复呢,啊不用降到拥塞窗口为1,降到多少呢,降到新的门限值,那这个新的门限值如何确定呢?就只需要把出现的这个重复确认,三个重复确认的时候,把这个拥塞窗口除以2,也就从24降到12,那从12这个地方呢进行快恢复。那接下来呢就执行这个拥塞避免,也就是线性的加法增大。加1,加1,从12变到13、14,依此类推往上加。这就是快重传以及快恢复的过程。那为什么叫快恢复,就是说不用降到1,直接降到新的门限值这儿,然后呢使用拥塞避免的算法。那可以看到这个图当中啊有两个版本,这个版本呢是废弃不用的,我们就不需要做了解了。那这个版本呢是我们考试当中会考的,也就需要大家来记忆的一个版本。那因此,这四种拥塞控制方法呢我们都讲完了,同学们一定要区分开这俩种拥塞控制的方法,并且呢在计算上一直要注意自己的这个准确率。而且不要把数字看错。这一部分的题呢没有难度,只要大家细心呢,就一定能做对。那从传输层的内容呢我们就讲到这里,下节课开始我们将学习最后一章应用层。

  • 相关阅读:
    CMU15-445 Project #2
    CMU15-445 Project #1 Buffer Pool
    挂分原因
    「杂谈」关于斜率优化维护凸包
    「题解」GYM 101620J Justified Jungle
    「题解」AGC 052 B Tree Edges XOR
    C++ MT19937 随机数 限制范围
    「题解」Codeforces 348C Subset Sums
    「学习笔记」联赛数论再学习
    「题解」洛谷 P4597 序列sequence
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/11450796.html
Copyright © 2011-2022 走看看