(1)之前介绍的计算机网络体系结构中的物理层、数据链路层以及网络层,它们共同解决了将主机通过异构网络互联起来所面临的问题,实现了主机到主机的通信。
(2)如下图所示,局域网1上的主机与局域网2上的主机通过互连的广域网进行通信。网络层的作用范围是主机到主机,但实际上在计算机网络中进行通信的真正实体是位于通信两端主机中的进程。例如,AP1和AP2是局域网1上一台主机中的与网络通信相关的两个应用进程,AP3和AP4是局域网2上一台主机中的与网络通信相关的两个应用进程。
(3)运输层的作用范围是应用进程到应用进程,也称为端到端。
(4)运输层协议又称为端到端协议。根据应用需求的不同,因特网的运输层为应用层提供了两种不同的运输协议,即面向连接的TCP和无连接的UDP。
(1)如何为运行在不同主机上的应用进程提供直接的通信服务是运输层的任务。
(2)从计算机网络体系结构的角度来看运输层,AP1和AP2、AP3和AP4是通信双方应用层中的应用进程。假设AP1与AP4之间进行基于网络的通信,AP2与AP3之间进行基于网络的通信,在运输层使用不同的端口(非物理端口,而是指用来区分不同应用进程的标识符)来对应不同的应用进程,然后通过网络层及其下层来传输应用层报文,接收方的运输层通过不同的端口将收到的应用层报文交付给应用层中相应的应用进程。
(3)运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议),
它使应用进程看见的就好像是在两个运输层实体之间有一条端到端的逻辑通信信道。
(1)运行在计算机上的进程使用进程标识符PID来标志,但是因特网上的计算机并不是使用统一的操作系统,不同的操作系统(Windows,Linux,Mac OS)又使用不同格式的进程标识符,为了使运行不同操作系统的计算机的应用进程之间能够进行网络通信,就必须使用统一的方法对TCP/IP体系的应用进程进行标识。
(2)TCP/IP体系的运输层使用端口号来区分应用层的不同应用进程。
①端口号使用16比特表示,取值范围0~65535。
[1]熟知端口号:0~1023,IANA把这些端口号指派给了TCP/IP体系中最重要的一些应用协议,例如FTP使用21/20,HTTP使用80,DNS使用53。
[2]登记端口号:1024~49151,为没有熟知端口号的应用程序使用,使用这类端口号必须在IANA按照规定的手续登记,以防止重复。
[3]短暂端口号:49152~65535,留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号,通信结束后,这个端口号可供其他客户进程以后使用。
②端口号只具有本地意义,即端口号只是为了标识本计算机应用层中的各进程,在因特网中,不同计算机中的相同端口号是没有联系的。
(1)发送方的某些应用进程所发送的不同应用报文,在运输层使用UDP协议进行封装,这称为UDP复用;而另一些应用进程所发送的不同应用报文,在运输层使用TCP协议进行封装,这称为TCP复用。
(2)不管是使用运输层的UDP协议封装成的UDP用户数据报,还是使用TCP协议封装成的TCP报文段,在网络层都需要使用IP协议封装成IP数据报,这称为IP复用。
(3)IP数据报首部中协议字段的值用来表明IP数据报的数据载荷部分封装的是何种协议数据单元:
①取值为6,表示封装的是TCP报文段。
②取值为17,表示封装的是UDP用户数据报。
(4)接收方的网络层收到IP数据报后进行IP分用:
①若IP数据报首部中协议字段的值为17,则把IP数据报的数据载荷部分所封装的UDP用户数据报上交运输层的UDP。
②若IP数据报首部中协议字段的值为6,则把IP数据报的数据载荷部分所封装的TCP用户数据报上交运输层的TCP。
(5)运输层对UDP用户数据报进行UDP分用,对TCP报文段进行TCP分用。也就是根据端口号,将它们交付给上层相应的应用进程。
(1)如下图所示,用户PC、DNS服务器、Web服务器通过交换机进行互联,它们处于同一个以太网中,假设Web服务器的域名为“www.porttest.com”,DNS服务器中记录有该域名所对应的IP地址。
(2)在用户PC中使用网页浏览器来访间Web服务器的内容,需要在网页浏览器的地址栏中输入Web服务器的域名。用户PC中的DNS客户端进程会发送一个DNS查询请求报文,其内容为“域名www.porttest.com所对应的IP地址是什么”。DNS查询请求报文需要使用运输层的UDP协议封装成UDP用户数据报,其首部中的源端口字段的值在短暂端口号49152~65535中挑选一个未被占用的,用来表示DNS客户端进程(例如49152),目的端口字段的值设置为53,这是DNS服务器端进程所使用的熟知端口号。
(3)之后,将UDP用户数据报封装在IP数据报中,通过以大网发送给DNS服务器。DNS服务器收到该数据报后,从中解封出UDP用户数据报。UDP首部中的目的端口号为53,表明应将该UDP用户数据报的数据载荷部分(也就是DNS查询请求报文)交付给本服务器中的DNS服务器端进程。DNS服务器端进程解析DNS查询请求报文的内容,然后按其要求查找对应的IP地址。
(4)之后,DNS服务器会给用户PC发送DNS响应报文,其内容为“域名www.porttest.com所对应的IP地址是192.168.0.3”。DNS响应报文需要使用运输层的UDP协议封装成UDP用户数据报,其首部中的源端口字段的值设置为熟知端口号53,表明这是DNS服务器端进程所发送的UDP用户数据报,目的端口字段的值设置为49152,这是之前用户PC中发送DNS查询请求报文的DNS客户端进程所使用的短暂端口号。
(5)之后,将UDP用户数据报封装在IP数据报中,通过以大网发送给用户PC。用户PC收到该数据报后,从中解封出UDP用户数据报。UDP首部中的目的端口号为49152,表明应将该UDP用户数据报的数据载荷部分(也就是DNS响应报文)交付给用户PC中的客户端进程。DNS客户端进程解析DNS响应报文的内容,就可知道自己之前所请求的Web服务器的域名所对应的IP地址为192.168.0.3。
(6)现在,用户PC中的HTTP客户端进程可以WeB服务器发送HTTP请求报文了,其内容为“首页内容是什么?”。HTTP请求报文需要使用运输层的TCP协议封装成TCP报文段,其首部中的源端口字段的值在短暂端口号49151~65535中挑选一个未被占用的,用来表示HTTP客户端进程,例如仍然使用之前用过的49152,目的端口字段的值设置为80,这是HTTP服务器端进程所使用的熟知端口号。
(7)之后,将TCP报文段封装在IP数据报中,通过以太网发送给Web服务器。Web服务器收到该数据报后,从中解封出TCP报文段。TCP首部中的目的端口号为80,表明应将该TCP报文段的数据载荷部分(也就是HTTP请求报文)交付给本服务器中的HTTP服务器端进程。HTTP服务器端进程解析HTTP请求报文的内容,然后按其要求查找首页内容。
(8)之后,Web服务器会给用户PC发送HTTP响应报文,其内容是HTTP客户端所请求的首页内容。HTTP响应报文需要使用运输层的TCP协议封装成TCP报文段,其首部中的源端口字段的值设置为熟知端口号80,表明这是HTTP服务器端进程所发送的TCP报文段,目的端口字段的值设置为49152,这是之前用户PC中发送HTTP请求报文的HTTP客户端进程所使用的短暂端口号。
(9)之后,将TCP报文段封装在IP数据报中,通过以太网发送给用户PC。用户PC收到该数据报后,从中解封出TCP报文段。TCP首部中的目的端口号为49152,表明应将该TCP报文段的数据载荷部分(也就是HTTP响应报文)交付给用户PC中的HTTP客户端进程。HTTP客户端进程解析HTTP响应报文的内容,并在网页浏览器中进行显示,这样,就可以在网页浏览器中看到Web服务器所提供的首页内容了。
(1)UDP和TCP是TCP/IP体系结构运输层中的两个重要协议,在使用TCP/IP体系结构的网络通信中,这两个协议的使用频率仅次于网际层的IP协议。
(2)TCP/IP体系结构应用层中的某些协议需要使用运输层的TCP提供的服务,而另一些协议需要使用运输层的UDP提供的服务。
(3)UDP是用户数据报协议(User Datagram Protocol)的英文缩写词,TCP是传输控制协议(Transmission Control Protocol)的英文缩写词。
下图所示是因特网上的两台主机,纵坐标为时间。
(1)如果它们在运输层使用UDP协议进行通信,使用UDP协议的通信双方可以随时发送数据。
(2)如果它们在运输层使用TCP协议进行通信,使用TCP协议的通信双方在进行数据传输之前必须使用“三报文握手”来建立TCP连接,TCP连接建立成功后才能进行数据传输,数据传输结束后必须使用“四报文挥手”来释放TCP连接。(这里所谓的“连接”指的是逻辑连接关系)
(3)综上所述,UDP是无连接的,TCP是面向连接的。
(1)下左图所示是某个局域网上的、使用UDP协议进行通信的四台主机,其中任何一台主机都可向其它三台主机发送广播数据,也可以向某个多播组发送多播数据,还可以向某台主机发送单播数据,也就是说,UDP支持单播、多播以及广播(即UDP支持一对一、一对多以及一对全的通信)。
(2)下右图所示是某个局域网上的、使用TCP协议进行通信的四台主机,使用TCP协议的通信双方在进行数据传输之前必须使用“三报文握手”来建立TCP连接,TCP连接建立成功后,通信双方之间就好像有一条可靠的通信信道,通信双方使用这条基于TCP连接的可靠信道进行通信。很显然,TCP仅支持单播(即TCP仅支持一对一的通信)。
(1)UDP对应用报文的处理:
①发送方的应用进程将应用层报文交付给运输层的UDP,UDP直接给应用层报文添加一个UDP首部,使之成为UDP用户数据报,然后进行发送。
②接收方的UDP收到该UDP用户数据报后,去掉UDP首部,将应用层报文交付给应用进程。
③综上所述,UDP对应用进程交下来的报文既不合并也不拆分,而是保留这些报文的边界,换句话说,UDP是面向应用报文的。
(2)TCP对应用报文的处理:
①发送方的TCP把应用进程交付下来的数据块仅仅看作是一连串的、无结构的字节流,TCP并不知道这些待传送的字节流的含义,仅将它们编号并存储在自己的发送缓存中。
②TCP根据发送策略从发送缓存中提取一定数量的字节构建TCP报文段并发送。
③接收方的TCP一方面从所接收到的TCP报文段中取出数据载荷部分并存储在接收缓存中,一方面将接收缓存中的一些字节交付给应用进程。
④TCP不保证接收方应用进程所收到的数据块与发送方应用进程所发出的数据块具有对应大小的关系,例如发送方应用进程交给发送方的TCP共10个数据块,但接收方的TCP可能只用了4个数据块就把收到的字节流交付给了上层的应用进程。
⑤接收方应用进程收到的字节流必须和发送方应用进程发出的字节流完全一样,当然,接收方的应用进程必须有能力识别收到的字节流,把它还原成有意义的应用层数据,也就是说,TCP是面向字节流的,这正是TCP实现可靠传输、流量控制、以及拥塞控制的基础。
(1)TCP/IP体系结构的网际层向其上层提供的是无连接不可靠的传输服务,当运输层使用UDP协议时,向其上层提供的也是无连接不可靠的传输服务。
①发送方给接收方发送UDP用户数据报,若传输过程中用户数据报受到干扰而产生误码,接收方UDP可以通过该数据报首部中的校验和字段的值检查出产生误码的情况,但只是丢弃该数据报,不会有其它措施。
②发送方给接收方发送UDP用户数据报,如果该数据报被因特网中的某个路由器丢弃了,发送方UDP不做任何处理。
(2)TCP/IP体系结构的网际层向其上层提供的是无连接不可靠的传输服务,也就是说,IP数据报可能在传输过程中出现丢失或误码,不过当运输层使用TCP协议时,向其上层提供的是面向连接可靠的传输服务。可以想象成使用TCP协议的收发双方基于TCP连接的可靠信道进行数据传输,不会出现误码、丢失、乱序以及重复等传输差错。
(1)一个UDP用户数据报由首部和数据载荷两部分构成,其首部格式如图所示,仅有4个字段,每个字段长度为2个字节。由于UDP不提供可靠传输服务,它仅仅在网际层的基础上添加了用于区分应用进程的端口,因此它的首部非常简单,仅有8个字节。
(2)一个TCP报文段由首部和数据载荷两部分构成,其首部格式如图所示,这比UDP用户数据报的首部复杂得多,其最小长度为20字节,最大长度为60字节,这是因为TCP要实现可靠传输、流量控制、拥塞控制等服务。
(1)一般来说,我们总是希望数据传输得更快一些,但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。
(2)所谓流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。
(3)利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
①TCP接收方利用自己的接收窗口的大小来限制发送方发送窗口的大小。
②TCP发送方收到接收方的零窗口通知后,应启动持续计时器,持续计时器超时后,向接收方发送零窗口探测报文。
(1)如下图所示,假设主机A和B是因特网上的两台主机,它们之间已经建立了TCP连接,A给B发送数据,B对A进行流量控制。假设主机A发送的每个TCP数据报文段可携带100字节数据,图中每个小格子表示100个字节数据的序号。
(2)在主机A和B建立TCP连接时,B告诉A“我的接收窗口为400”,因此主机A将自己的发送窗口也设置为400,这意味着主机A在未收到主机B发来的确认时,可将序号落入发送窗口中的全部数据发送出去。
(3)主机A将发送窗口内序号1~100的数据封装成一个TCP报文段发送出去,此时发送窗口内还有300字节可以发送。
①下图中的seq是TCP报文段首部中的序号字段,取值1表示TCP报文段数据载荷的第一个字节的序号是1。
②下图中的DATA表示这是TCP数据报文段。
(4)主机A将发送窗口内序号101~200的数据封装成一个TCP报文段发送出去,此时发送窗口内还有200字节可以发送。主机A将发送窗口内序号201~300的数据封装成一个TCP报文段发送出去,但该报文段在传输过程中丢失了,此时发送窗口内还有100字节可以发送。
(5)主机B对主机A所发送的201号以前的数据进行累计确认,并在该累计确认中将窗口字段的值调整为300,也就是对主机A进行流量控制。
①下图中的ACK是TCP报文段首部中的标志位,取值1表示这是一个TCP确认报文段。
②下图中的ack是TCP报文段首部中的确认号字段,取值201表示序号201之前的数据已全部正确接收,现在希望收到序号201及其后续数据。
③下图中的rwnd是TCP报文段首部中的窗口字段,取值300表示自己的接收窗口大小为300。
(6)主机A收到该累计确认后将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移出发送窗口。由于主机B在该累计确认中将自己的接收窗口调整为了300,因此主机A相应地将自己的发送窗口调整为300。
(7)目前,主机A发送窗口内的序号为201~500,也就是主机A还可以发送这300字节,其中201~300号字节是已发送的数据,若重传计时器超时,它们会被重传;301~400号字节以及401~500号字节还未被发送,它们可被分别封装在一个TCP报文段中发送。主机A现在可将发送缓存中序号1~200的字节数据全部删除了,因为已经收到了主机B对它们的累计确认。
(8)主机A将发送窗口内序号301~400的数据封装成一个TCP报文段发送出去,此时发送窗口内还有100字节可以发送。主机A将发送窗口内序号401~500的数据封装成一个TCP报文段发送出去,至此,序号落在发送窗口内的数据已经全部发送出去了,不能再发送新数据了。
(9)现在,发送窗口内序号201~300这100个字节数据的重传计时器超时了,主机A将它们重新封装成一个TCP报文段发送出去,暂时不能发送其它数据。
(10)主机B收到该重传的TCP报文段后,对主机A所发送的501号以前的数据进行累计确认,并在该累计确认中将窗口字段的值调整为100,这是主机B对主机A进行的第二次流量控制。
(11)主机A收到该累计确认后将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移出发送窗口。由于主机B在该累计确认中将自己的接收窗口调整为了100,因此主机A相应地将自己的发送窗口调整为100。
(12)目前,主机A发送窗口内的序号为501~600,也就是主机A还可以发送这100字节。主机A现在可将发送缓存中序号201~500的字节数据全部删除了,因为已经收到了主机B对它们的累计确认。
(13)主机A将发送窗口内序号501~600的数据封装成一个TCP报文段发送出去,至此,序号落在发送窗口内的数据已经全部发送出去了,不能再发送新数据了。
(14)主机B对主机A所发送的601号以前的数据进行累计确认,并在该累计确认中将窗口字段的值调整为0,这是主机B对主机A进行的第三次流量控制。
(15)主机A收到该累计确认后将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移出发送窗口。由于主机B在该累计确认中将自己的接收窗口调整为了0,因此主机A相应地将自己的发送窗口调整为0,目前,主机A不能再发送一般的TCP报文段了。
(16)主机A现在可将发送缓存中序号501~600的字节数据全部删除了,因为已经收到了主机B对它们的累计确认。
(17)假设主机B向主机A发送了零窗口的报文段后不久,主机B的接收缓存又有了一些存储空间,于是主机B向主机A发送了接收窗口等于300的报文段,然而这个报文段在传输过程中丢失了。主机A一直等待主机B发送的非零窗口的通知,而主机B也一直等待主机A发送的数据,如果不采取措施,这种互相等待而形成的死锁局面将一直持续下去。
(18)为了避免死锁局面的产生,TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器超时,就发送一个零窗口探测报文,仅携带一字节的数据,而对方在确认这个探测报文段时给出自己现在的接收窗口值。
①如果接收窗口仍然是0,那么收到这个报文段的一方就重新启动持续计时器。
②如果接收窗口不是0,那么死锁的局面就可以被打破了。
(19)对于本例,主机A收到零窗口通知时就启动一个持续计时器,当持续计时器超时,主机A立刻发送一个仅携带一字节的数据的零窗口探测报文段,假设主机B此时的接收窗口又为0了,主机B就在确认这个零窗口探测报文段时给出自己现在的接收窗口值为0,主机A再次收到零窗口通知,就再次启动一个持续计时器。
(20)当持续计时器超时,主机A立刻发送一个仅携带一字节的数据的零窗口探测报文段,假设主机B的接收缓存又有了一些存储空间,主机B就在确认这个零窗口探测报文段时给出自己现在的接收窗口值为300,这样就打破了死锁的局面。
(21)TCP规定,即使接收窗口为0,接收方也必须接收零窗口探测报文段、确认报文段以及携带有紧急数据的报文段,所以不必担心接收方的缓存不足而无法接收零窗口探测报文段。另外针对零窗口探测报文段也有重传计时器,当重传计时器超时后,零窗口探测报文段会被重传,所以不必担心零窗口探测报文段在传输过程中出现差错。
(1)在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫做拥塞(congestion)。在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。
(2)若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。
(3)拥塞控制的作用;
①如下图所示,横坐标是输入负载,代表单位时间内输入给网络的分组数量,纵坐标是吞吐量,代表单位时间内从网络输出的分组数量。
②具有理想拥塞控制的网络在吞吐量达到饱和之前,网络吞吐量应等于所输入的负载,故吞吐量曲线是45度的斜线。当输入负载超过某一限度时,由于网络资源受限,吞吐量不再增长而保持水平线,也就是吞吐量达到饱和,这就表明输入的负载中有一部分损失掉了,例如输入到网络中的某些分组被某个结点丢弃了,虽然如此,在这种理想的拥塞控制作用下,网络的吞吐量仍然维持在其所能达到的最大值。
③如果无拥塞控制,随着输入负载的增大,网络吞吐量的增长率逐渐减小,也就是在网络吞吐量还未达到饱和时,就已经有一部分的输入分组被丢弃了,当网络的吞吐量明显地小于理想的吞吐量时,网络就进入了轻度拥塞的状态。当输入负载到达某一数值时,网络的吞吐量反而随输入负载的增大而减小,这时网络就进入了拥塞状态。当输入负载继续增大到某一数值时,网络的吞吐量就减小为0,此时网络就无法工作了,这就是所谓的死锁。
(1)下图所示是TCP的发送方和接收方,发送方给接收方发送TCP数据报文段,接收方收到后给发送方发送TCP确认报文段。
①发送方要维护一个叫“拥塞窗口”(cwmd)的状态变量,其值取决于网络的拥塞程度,并且动态变化。
[1]拥塞窗口值是几,就能发送几个数据报文段。
[2]拥塞窗口的维护原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些;但只要网络出现拥塞,拥塞窗口就减小一些。
②判断出现网络拥塞的依据:没有按时收到应当到达的确认报文(即发生超时重传)。
③发送方将拥塞窗口作为发送窗口swnd,即swnd = cwnd。
④发送方还要维护一个慢开始门限ssthresh状态变量:当cwnd < ssthresh时,使用慢开始算法;当cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法;当cwnd = ssthresh时,既可使用慢开始算法,也可使用拥塞避免算法。
(2)两个算法的工作过程:
①下图所示的坐标图是拥塞窗口随传输轮次变化的关系图:
[1]横坐标为传输轮次。发送方给接收方发送数据报文段后,接收方给发送方发回相应的确认报文段,这是一个传输轮次,一个传输轮次所经历的时间其实就是往返时间。
[2]纵坐标为拥塞窗口,它会随网络拥塞程度以及所使用的拥塞控制算法动态变化。
②在TCP双方建立逻辑连接关系时(传输轮次0),拥塞窗口的值被设置为1,另外还需设置慢开始门限的初始值。
③TCP发送方一开始使用慢开始算法,让拥塞窗口值从1开始按指数规律增大。
④当拥塞窗口值增大到慢开始门限值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性加1的规律增大。
⑤当发生超时重传时,就判断网络很可能出现了拥塞,于是采取相应措施:
[1]将慢开始门限值更新为发生拥塞时拥塞窗口值的一半。
[2]将拥塞窗口值减小为1,并重新开始执行慢开始算法。
⑥拥塞窗口值又从1开始按指数规律增大,拥塞窗口值增大到新的慢开始门限值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性加1的规律增大。
(3)“慢开始”指的是一开始向网络注入的报文段少,并不是指拥塞窗口cwnd增长速度慢。“拥塞避免”并非指完全能够避免拥塞,而是指在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
(4)两个算法的工作过程举例:
①在TCP双方建立逻辑连接关系时(传输轮次0),拥塞窗口的值被设置为1,另外还需设置慢开始门限的初始值,本例采用16。在执行慢开始算法时,发送方每收到一个对新报文段的确认时,就把拥塞窗口值加1,然后开始下一轮的传输。当拥塞窗口值增长到慢开始门限值时,就改为执行拥塞避免算法。
②由于发送方当前的拥塞窗口值是1,而发送窗口值等于拥塞窗口值,因此发送方当前只能发送一个TCP数据报文段。发送方发送0号数据报文段,接收方收到后给发送方发回对0号报文段的确认报文段,发送方收到该确认报文段后将拥塞窗口值加1(这时拥塞窗口值为2)。
③拥塞窗口值为2,意味着发送方现在可以发送1~2号共两个数据报文段,接收方收到1~2号数据报文段后给发送方发回1~2号报文段的确认报文段,发送方收到后将拥塞窗口值加2(这时拥塞窗口值为4)。
④拥塞窗口值为4,意味着发送方现在可以发送3~6号共四个数据报文段,接收方收到3~6号数据报文段后给发送方发回3~6号报文段的确认报文段,发送方收到后将拥塞窗口值加4(这时拥塞窗口值为8)。
⑤拥塞窗口值为8,意味着发送方现在可以发送7~14号共八个数据报文段,接收方收到7~14号数据报文段后给发送方发回7~14号报文段的确认报文段,发送方收到后将拥塞窗口值加8(这时拥塞窗口值为16)。
⑥发送方当前的拥塞窗口值已经增大到了慢开始门限值,之后要改用拥塞避免算法。拥塞窗口值为16,意味着发送方现在可以发送15~30号共十六个数据报文段,接收方收到15~30号数据报文段后给发送方发回15~30号报文段的确认报文段,发送方收到后将拥塞窗口值加1(这时拥塞窗口值为17)。
⑦拥塞窗口值为17,意味着发送方现在可以发送31~47号共十七个数据报文段,接收方收到31~47号数据报文段后给发送方发回31~47号报文段的确认报文段,发送方收到后将拥塞窗口值加1(这时拥塞窗口值为18)。
⑧随着传输轮次的增加,拥塞窗口值每轮次都线性加1,如本例,当前拥塞窗口值增加到了24,意味着发送方现在可以发送171~194号共二十四个数据报文段。假设这24个数据报文段在传输过程中丢失了几个,这必然会造成发送方对这些丢失报文段的超时重传,发送方以此判断网络很可能出现了拥塞。
⑨发送方判断网络可能出现拥塞,会进行以下工作:
[1]网络发送拥塞时的拥塞窗口值是24,因此更新慢开始门限值为该值的一半,即12。
[2]将拥塞窗口值减小为1,并重新开始执行慢开始算法。
⑩当慢开始算法执行到拥塞窗口值增大到新的慢开始门限值时,停止使用慢开始算法,转而执行拥塞避免算法。
(1)慢开始和拥塞避免算法是1988年提出的RCP拥塞控制算法(TCP Tahoe版本)。有时,个别报文段会在网络中丢失,但实际上网络并未发生拥塞,但是采用旧算法时,会引发发送方的超时重传并误认为网络发生了拥塞,发送方把拥塞窗口cwnd又设置为最小值1,并错误地启动慢开始算法,因而降低了传输效率。
(2)1990年又增加了两个新的拥塞控制算法(为了改进TCP的性能),这就是快重传和快恢复(TCP Reno版本)。
(3)采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。所谓“快重传”,就是使发送方尽快进行重传,而不是等超时重传计时器超时再重传。
①要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认。
②即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。
③发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传。
④对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞(进而降低拥塞窗口cwnd为1)。使用快重传可以使整个网络的吞吐量提高约20%。
(4)快重传算法的工作过程举例:
①如下图所示,发送方发送1号数据报文段,接收方收到后给发送方发回对1号报文段的确认。在该确认报文段到达发送方之前,发送方还可以将发送窗口内的2号数据报文段发送出去,接收方收到后给发送方发回对2号报文段的确认。
②在2号报文段的确认报文段到达发送方之前,发送方还可以将发送窗口内的3号数据报文段发送出去,不过该报文段丢失了,接收方自然不会给发送方发回针对该报文段的确认。
③发送方还可以将发送窗口肉的4号数据报文段发送出去,接收方收到后发现这不是按序到达的报文段,因此给发送方发回针对2号报文段的重复确认,表明“我现在希望收到的是3号报文段,但是我并没有收到3号报文段,而是收到了未按序到达的报文段”。
④发送方还可以将发送窗口内的5号数据报文段发送出去,接收方收到后发现这不是按序到达的报文段,因此给发送方发回针对2号报文段的重复确认。发送方还可以将发送窗口内的6号数据报文段发送出去,接收方收到后发现这不是按序到达的报文段,因此给发送方发回针对2号报文段的重复确认。
⑤至此,发送方会收到3个连续的、对2号报文段的重复确认,于是发送方立即重传3号报文段,接收方收到后,给发送方发回针对6号报文段的确认,表明序号到6为止的报文段都正确接收了,这样就不会造成对3号报文段的超时重传,而是提早进行了重传。
(5)快恢复算法的工作过程:
①发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段,于是不启动慢开始算法,而执行快恢复算法。
②发送方将慢开始门限ssthresh值和拥塞窗口cwnd值调整为当前窗口的一半,并开始执行拥塞避免算法。
③有的快恢复实现是把快恢复开始时的拥塞窗口cwnd值再增大一些,即等于新的ssthresh + 3。既然发送方收到3个重复的确认,就表明有3个数据报文段已经离开了网络,这3个报文段不再消耗网络资源,而是停留在接收方的接收缓存中,可见现在网络中不是堆积了报文段,而是减少了3个报文段,因此可以适当把拥塞窗口扩大些。
(6)四种算法同时使用的举例:
①如下图所示,TCP发送方一开始使用慢开始算法,让拥塞窗口值从1开始接指数规律增大。
②当增大到慢开始门限初始值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性加1的规律增大。
③当发生超时重传时,就判断网络可能出现了拥塞,采取相应的措施,一方面将慢开始门限值更新为发生拥塞时拥塞窗口值的一半,另一方面将拥塞窗口值减少为1,并重新开始执行慢开始算法,拥塞窗口值又从1开始接指数规律增大。
④当增大到新的慢开始门限初始值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性加1的规律增大。
⑤当发送方收到3个重复确认时,就进行快重传和快恢复,也就是更新慢开始门限值为当前拥塞窗口值的一半,并将拥塞窗口值也取为新的慢开始门限值,转而执行拥塞避免算法,让拥塞窗口值按线性加1的规律增大。