我正在读TCP/IP 指南中的 TCP PUSH 部分,并对这一段有疑问:
重要的是要意识到推送功能仅有的强制立即传送数据。这并没有改变 TCP 在数据元素之间没有边界的事实。它可能似乎应用程序可以发送一条数据记录,然后将其“推送”给接收方;然后发送第二条记录并“推送”该记录,依此类推。但是,应用程序不能假设,因为它为提供给 TCP 的每条数据设置了 PSH 位,所以每条数据都将位于单个段中。第一次“推送”可能包含之前提供给 TCP 的尚未传输的数据,并且以这种方式“推送”的两个记录也可能最终出现在同一个段中。
我的问题是关于最后一句斜体字,为什么数据可以更早地提供给 TCP,并且设置了 PSH 标志,但却没有被传输?设置 PSH 标志不是会立即刷新缓冲区吗?
答案1
重要的是要理解 TCP 是一种流式协议,分成多个段只是一个实现细节,而这只是因为一些较低级别协议是基于数据包的。
设置 PSH 标志只是向接收端发出指示,告知它应将其缓冲区刷新到应用程序。由于 TCP/IP 堆栈的异步特性,当应用程序收到有待处理数据的通知时,可能已经收到了其他几个较新的数据包,并且所有内容将一起发送给应用程序。TCP 是一个流。
此外,请注意,在网络上,也无法保证 TCP 段的分离也能保留下来。通常它被保留了下来,但是有代理、深度检查防火墙等,它们实际上可以将几个小段粘合成一个更大的段,等等。
答案2
在某些情况下,TCP 不允许发送任何新数据,而要先等待 ACK。
通常,PUSH 标志会强制接收方的 TCP 将其缓冲区内容传送给应用程序。它不会强制发送方的 TCP 发送任何内容。