当发送应用程序保持足够快地发送缓冲区以保持发送方 TCP 堆栈不断提供数据,以便它始终可以在网络上“传输”数据时,“保持管道充满”\xe2\x80\x94 时,TCP 工作效果最佳,并且当接收方应用程序以足够快的速度从接收方 TCP 堆栈读取数据时,接收方 TCP 窗口永远不会填满(再次强调,因此发送 TCP 堆栈始终可以保持数据在网络上“传输”)。
\n\n我可以想象一个写得不好的单线程发送器应用程序,它将一个缓冲区传递到 TCP 堆栈,等待听到它已完全确认,然后传递另一个缓冲区。这意味着一旦第一个缓冲区的末尾在网络上“飞行”,发送 TCP 堆栈就会缺乏要发送的数据,这意味着管道会耗尽,并且直到 Ack 返回并且发送方之后才会重新填充。应用程序向其传递一个新的缓冲区。
\n\n我还可以想象一个写得不好的单线程接收器应用程序,它不能足够快地从接收 TCP 堆栈中读取数据,从而让 TCP 堆栈的缓冲区填满,这意味着 TCP 窗口填满,从而导致发送 TCP 堆栈停止发送,直到窗口打开一些。增加接收方的 TCP 窗口大小可能会有所帮助,但真正的解决方案是更快地读取数据。
\n