从计算机网络--可靠数据传输原理(一)中已经可知如何设计一个可靠的传输机制来保证数据能够完整有序的到达目的地,但是该机制采用了“停等”协议(也就是每发送一个数据包都要等待接收方的反馈消息否则就超时重传),它的传输效率比较低,因此出现了流水线可靠数据传输协议(在计算机网络-自顶向下一书中已经从理论上详细的讨论了传输效率低下的原因,不过我还是从直觉上记住这个结论先,暂时不去看具体原因了)。

            它的基本思想是发送方可以连续发送一批数据包给接受方,而不用每发一个数据包就等待确认。但是这批数据包的数量还是有限制的,可以称之为缓冲区,如果发送的数据包占满了缓冲区还没有一个数据包被确认同样需要发送方进行等待!不过该方法仍然行之有效的原因是尽管网络会丢包、乱序达到、数据损坏,但是大部分情况下数据还是可以正常达到目的地,发送方大部分情况下都会收到接受方的正常反馈,由于发送方会有一个线程异步接受该反馈所以发送方可以继续发送新的数据包填满那些已经反馈的数据包的空间。这种机制在网络和双方机器都正常的情况下发送方会一直向接受方发送数据而感觉不到停顿,这就是称之为流水线传输的原因!

            先假设缓冲区的大小为N且恰能对2取模(这样对N取余时可以简化运算见 java位运算技巧--不定期更新),每个数据包都有一个序号,通过对N取余就可以求出数据包在缓冲区占用的位置。这里要特别强调发送方和接收方的缓冲区大小必须相同,接收方发送的反馈消息可能丢失导致发送方重新发送数据包,接收方可缓存已正确接收的数据包通过数据包的序号来判断是否为新数据包,这点在计算机网络--可靠数据传输原理(一)中也提过。         

            当接收方正确接收了一段连续且完整的数据包时,会将这段数据包的最后一个编号附加到反馈消息中表示<=该编号的数据包都正确接收(而不需要为每个数据包都发送反馈消息从而节约了流量,这又叫累积确认),如果出现了丢包、乱序、数据包损坏情况,就需要差错恢复机制,流水线传输的处理方式有两种:回退N步和选择重传。

            1、回退N步

                 发送方会对丢包、乱序、数据包损坏以及超时情况重新发送数据包,接收方会丢弃所有乱序到达的数据包,这样做看似非常自然且合理,但是丢弃已正常接收确乱序达到的包有点浪费流量,所以就有了选择重传。选择重传比该方法要复杂,将在下篇进行分析。

10-11 14:48