当接收方没有读取数据时,TCP报头中的PSH标志是做什么的?
PSH标志导致发送方的堆栈立即发送下一个数据段,而不收集更多数据。接收方的堆栈也不会等待更多的数据,而是立即将段的数据传递给应用程序(*1)。如果接收应用程序很慢,或者根本不读取数据,那么它就会被卡住。PSH标志不能神奇地唤醒一个死进程。
如果没有PSH,当发送方(或接收方)堆栈等待更多数据来填充一个段(或缓冲区)时,发送小数据块可能会被延迟。这可以大大减少处理和协议开销时,数据只产生小块。
If the PUSH flag is set, the data must be transmitted promptly to the receiver, and the PUSH bit will be set in the last TCP segment created from the buffer. If the PUSH flag is not set, the data may be combined with data from subsequent SENDs for transmission efficiency.
RFC 793
请注意与URG的相似之处仍然不同,因为它向接收方堆栈发出信号,按下应用程序应该处理的无序的URGent数据。
PUSH的一个典型示例是控制台应用程序(telnet),它分别发送每个键,如果没有PUSH,则会遇到严重滞后。在这样的应用程序中,可以使用URG发出中断/停止/重置的信号:停止运行输出,而不是输出所有内容,然后等待/处理下一个用户输入。
*1虽然PSH标志对于套接字的同步/阻塞读取并没有真正的区别,但是它适用于异步处理,其中堆栈可能中断接收应用程序。然而,API和主机/OS实现在这里不再讨论。