滑动窗口协议
发送方和接收方都会维护一个数据帧的序列,这个序列称为窗口。发送方的窗口大小由接收方确定,目的在于控制发送速度,以免接收方的缓存不够大,而导致溢出,同时控制流量也可以避免网络拥塞。

如图所示,4,5,6号数据帧已经被发送出去了,但是没有收到相应的ACK,7,8,9帧是等待发送的。可以看出窗口的大小为6,这是由接收端设置的。此时,如果发送端收到4号ACK,则窗口的左边缘向右收缩,窗口的右边缘则向右扩展,此时窗口就滑动了,即数据帧10也可以被发送了。
停等协议
停等协议,此时接收方的窗口和发送方的窗口大小都是1,1个比特表示就够了,所以也叫1比特滑动窗口协议。发送方这时自然发送每次只能发送一个,并且必须等待这个数据包的ACK,才能发送下一个。虽然在效率上比较低,带宽利用率明显较低,不过,在网络环境较差,或是带宽本身就很低的情况下,还是适用的。

后退n协议
后退n协议:停等协议在恶劣环境下,效率太低,所以有了后退n协议,这里发送的窗口大小为n,接收方的大小为1,

如图,发送方一口气发送了10个数据帧,前面的两个数据帧正确返回了,数据帧2出现了错误,这时发送方重新发送了2-8这7个帧,接受方也必须丢弃之前接受的3-8的帧。
后退n协议的好处是提高了效率,但是一旦网络情况糟糕,则会导致大量数据重发,效率可能不如上面的停等协议。选择重传协议
后退n协议的另外一个问题,当有错误帧出现后,总是要重发所有的帧,在网络不好的情况下会进一步恶化网络,重传协议便是解决这个问题,接收端总会有缓存所有收到的帧,当某个帧出现错误时,只会要求重传这一个帧,只有当某个序号的所有帧都正确收到后,才会一起提交给高层应用。重传协议的缺点是接收端需要更多的缓存。
转自:http://gengning938.blog.163.com/blog/static/12822538120116207431746/