欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算机网络自顶向下阅读笔记:滑动窗口、选择重传、TCP

程序员文章站 2022-03-11 08:26:28
...

滑动窗口

	滑动窗口的出现是伴随着对停等协议的改善而出现的流水线协议而出现的,也叫GBN协议
(Go-Back-N Protocol)。下面的文章对GBN和滑动窗口混用,其实是一个概念。
	停等协议一次只能发送一个分组,接受到该分组的ack之后才能发送下一个分组,大大
影响了传输效率。 
	流水线协议则一次能发送N个分组。这个N就是滑动窗口的大小!
	其实滑动窗口也就是通信双方之间的链路一次最多发送分组的数量。与停等协议中只能
发送的那一个分组对应。因为发送分组和接受对应的ack是一个过程,所以会出现有的分组已
被发送而没有确认,有的分组还没来得及发送的情况。伴随着一些已经发送的分组被确认,
窗口也会慢慢向前滑动,也就是可以发送新的下一个分组了。= =滑动窗口这个名字挺唬人
的,其实了解后也就是简单的概念。(为什么要起这么晦涩拗口的名字啊!!)
	滑动窗口只会一个分组一个分组地按顺序交付给上级协议,所以会丢失所有失序分组。
(为什么不缓存正常提前到达的失序分组呢。因为如果接收方等待0分组,而接受到1分组并
缓存,并不会把1分组交付给上级协议,因为失序了。也就不会发送1分组的ACK,发送方也
自然收不到1分组的ack。超时定时器触发后,发送房会重传0和1分组,接收方缓存的1分组并
没有起到作用,所以干脆不缓存)
	GBN的缺陷:因为接收方不会缓存提前到来的分组,而是直接丢失,等待正常序列的分组
的到来。从而可能会出现这样一种情况:发送方发送0 1 2 3 4分组,0分组在发送中丢失,
1 2 3 4正常到达接收方。而接收方预期的下一个分组是0,会把1 2 3 4直接丢失,不会
发送任何ack。从而发送方会重传0 1 2 3 4分组,造成发送正常的1 2 3 4分组也被重传。

选择重传(Selective Repeat Protocol)

	因为滑动窗口可能会因为1个丢失的分组而造成大量正常分组重传,所以考虑只重传那
些丢失的分组,从而引出选择重传。
	选择重传是基于滑动窗口的改动,与滑动窗口的区别是:滑动窗口是一个分组一个分组
按顺序交付给上级协议,而选择重传是按一组分组一组分组按顺序交付给上级协议。一组
分组最少一个分组,最多N个分组(N为滑动窗口大小)。
	详细说来。如果接收方正在等到0 1 2 3 4分组,而发送过程中丢失了0分组,接收方
只接受到了1 2 3 4分组,那么会发送1 2 3 4的ack,发送方就会知道只丢失了0分组,
从而只重传0分组。滑动窗口接收到1 2 3 4分组后不会发送ack,而且直接丢失,这是根
本区别。发送方重传0分组并且接收方收到后,会把刚接受到的0分组和缓存的1 2 3 4分
组按顺序交付给上级协议,并同时发送0分组的ack。发送方收到0分组的ack后,就会向前
滑动窗口。
	选择重传的缺陷:因为接收方发送的ack可能会丢失,会造成接收方和发送方之间的窗
口并不匹配(见后面的标号1)。这种不同步有时会造成严重的后果。比如有4个分组0 1 2 3
 0 1 2要发送,双方窗口大小为3。第一次发送0 1 2双方都成功,所以发送方窗口滑动到
 3 0 1并发送这些分组,假设3分组丢失而0分组到达,这时接收方无法分辨此时的0分组是
 第一次发送的重传还是第二次发送的新的数据。所以必须要对窗口大小有所限制,必须小
 于或等于序号空间的一半。
 	1:具体说来,假如窗口大小为3,发送方发送0 1 2分组,接收方收到0 1 2分组并发
 送对应的ack,那么接收方的窗口就会向前滑动到3 4 5。而如果0分组的ack丢失,造成发
 送方只接受到了1 2分组的ack没有接收到0分组的ack,造成窗口无法向前滑动。所以两者
 之间的窗口不会匹配。再多说一点,,这种情况下,发送方会重传0分组,接收方会再次接
 受当前窗口之前的0分组,并且还要发送ack,才不会造成发送方的窗口无法向前滑动。
 (也就是说,接收方收到窗口之前的分组,也不能忽略,而必须要发送ack!)

TCP协议(Transmission Control Protocol)

	那么,TCP是GBN协议还是SR协议呢。比较好的理解是,TCP是两者的混合。一方面TCP
与GBN不同,如果在发送一组分组中一个分组被丢失或延迟,那么TCP会只重传丢失/延迟分
组甚至不重传延迟分组(详见标号2),而GBN是会重传所有丢失分组之后的分组的。与SR的
区别是,SR收到一个提前到来的分组,是会缓存并发送对应的ACK的,但大多TCP会缓存但
并不会发送对应的ACK,而会发送预期分组的ACK。(这种机制会导致冗余ACK,冗余ACK是
实现快重传的一个基础,见标号2)
	2:具体说来。如果发送方发送0 1 2 3分组,而0分组被丢失,接收方会缓存1 2 3分组并
发送三次分组0的ACK,而接收方收到3次0分组的重复ACK之后,会知道0分组被丢失,从而
快速重传0分组,这是快重传。非快重传的情况是,0分组被丢失,而发送方在超时时间内没
有收到3次0分组的ACK,从而因超时而重传。另一种不会引起重传的情况是,发送方发送0 
1 2 3分组,接收方接收到0 1 2 3分组发送0 1 2 3分组的ACK,而0分组的ACK被丢失。这时
发送方在超时时间内收到了分组3的ACK,说明3分组及其之前的分组都被接收方顺利接受,
从而不会重传0分组