在上篇笔记中我们综合了诸多技术搭建了一个可靠的数据传输协议——位交替协议。然而,作为停等协议,位交替协议的效率实在太低。
举个例子,假设主机 A 和主机 B 之间的往返时延为 30 ms
,二者之间连接的信道的传输率 R
为 1 Gbps
,一个 packet 的大小 L
为 1000 bytes
,那么一个 packet 从主机传输到信道上所花的时间为
$$d_{trans}=\frac{L}{R}=\frac {1000 \times 8 \: bit}{1 \times 10^{9}\, bps}=8 \times 10^{-6}s$$
然而,当 A 给 B 发送了一个packet之后,要等上 30ms + 0.008ms = 30.008 ms
才收到 ACK,然后 A 才能发送下一个 packet。发送方的实际利用率为:
$$U_{sender}=\frac{\frac{L}{R}}{RTT +\frac{L}{R}}=\frac{0.008\, ms}{30\, ms + 0.008\, ms}\approx 0.00027=0.027\%$$
也就是说在 30.008ms
里实际上只传输了 1000
个字节,实际吞吐量为 276kbps
,大大的浪费啊~
这个性能问题的解决思路很简单:允许在之前发送地 packet 没有收到确认的情况下继续发送新的 packet。就像是水流源源不断地流经管道,因此这种模式又被称为管道化 (Pipeling)。