在传输层中TCP协议如果要确保可靠性传输,在不做任何优化,最容易想到的算法就是“停止等待协议”(当然实际上TCP所用不是这种简单的“停止等待协议”,而是经过改良的更复杂一点的,为了帮助理解,建议还是得学习)。
什么是停止等待协议??
TCP协议其实是全双工的。为了让我们很好的理解,我们只考虑发送端A,发送数据给接收端B.
这里要说明一下,大家都知道TCP协议是面向流的,而UDP是面向数据包的。那么面向数据包很好理解,就是传输层以报文为单位,一次发一个报文。面向流呢??其实面向流也有单位的,只不过每次发送的大小单位是动态变化的(具体表现在应用层发送端和接收端的在一次收发中大小不对,A发送10个字节数据,B可以先收下3字节或其他)。我们经常提的“面向流就是爱发多少发多少”,个人觉得这里理解还是有些笼统。所以我还是重新给出自己的理解,面向流就是一个应用层上收发端在一次发送和接收会话中数据的单位大小是随意的,由传输层根据自己各方面的算法决定。
下面继续讲停止等待协议:
A发送一个数据包后就只等待,B接受一个数据后对数据包进行处理后发送一个“确认包”,这时候A才可以再发下一个数据包,如果在A等到超过了A所能接收的时间,那么A就重新发一个包。
这里我们可以得出2个结论,
- 第一,在发送端A,只管发送数据,发多少次都无所谓,只要在不超时的情况下收到“确认数据”。
- 第二,在接收端B,只管接收数据,收多少次都可以(接收不一定会放入缓存,对于损坏的数据和重复的数据会被丢弃),但是只处理1个数据并且只会响应一个确认数据给发送端A。
整个停止等待协议已经讲完了。
优点就是简单有效。
缺点:信道利用率低,发送端很多时间都花在等待上,接收端需要忙于对每个发送做确认。