回答:
TCPは、「パイプを一杯に保つ」ときに最適に機能します。送信側アプリが、送信側TCPスタックに常にデータを供給できるように十分な速さでバッファを送信し続けるため、アプリは、受信側TCPウィンドウがいっぱいにならないように、受信側TCPスタックからの読み取りを高速で続けます(繰り返しますが、送信側TCPスタックは常にネットワーク上で「飛行中」のデータを保持できます)。
1つのバッファーをTCPスタックに渡し、完全にAckedされたことを待機してから、別のバッファーを渡す、不十分な記述のシングルスレッド送信アプリを想像できます。つまり、最初のバッファの終わりがネットワーク上で「飛行中」になると、送信するTCPスタックは送信するデータが不足します。つまり、パイプが流出し、Ackが戻って送信アプリが戻るまで補充されません。新しいバッファを渡します。
また、受信TCPスタックから十分な速度で読み取りを行わず、TCPスタックのバッファーがいっぱいになる、つまりTCPウィンドウがいっぱいになり、送信TCPスタックがウィンドウが開くまで送信を停止します。受信者のTCPウィンドウサイズを大きくすることは少し役立つかもしれませんが、この目的での実際の解決策は、データをより速く読み取ることです。