Networking TCP PSH是如何工作的?

Networking TCP PSH是如何工作的?,networking,tcp,tcp-ip,Networking,Tcp,Tcp Ip,PSH是通过TCP发送数据的一种方式。除此之外,我几乎找不到关于如何正确实现它的信息 我感兴趣的是: 比如说,服务器窗口是8000字节,我发送了两个请求,分别是150字节和600字节。我是否得到某种形式的确认,即数据已收到?我能不能触发一次确认 我见过一些ACK数据包,它不包含PSH,但确实包含某种负载数据(Wireshark将其标记为“TCP段数据”)。这些数据是否传递给用户,如果是,为什么我们需要PSH标志 TCP PSH通常根本不“工作”。Berkely派生的TCP实现完全忽略了它 资料来

PSH是通过TCP发送数据的一种方式。除此之外,我几乎找不到关于如何正确实现它的信息

我感兴趣的是:

  • 比如说,服务器窗口是8000字节,我发送了两个请求,分别是150字节和600字节。我是否得到某种形式的确认,即数据已收到?我能不能触发一次确认

  • 我见过一些ACK数据包,它不包含PSH,但确实包含某种负载数据(Wireshark将其标记为“TCP段数据”)。这些数据是否传递给用户,如果是,为什么我们需要PSH标志


  • TCP PSH通常根本不“工作”。Berkely派生的TCP实现完全忽略了它


    资料来源:W.R.史蒂文斯,《TCP/IP图解》,第一卷:20.5推送标志。

    @Arsen:回答你问题的第二部分“为什么我们需要PSH标志?” TCP报头中的PSH标志通知接收主机应立即将数据推送到接收应用程序。
    我们使用PSH标志在两台服务器之间交换时间戳值。

    我假设,如果我们设置push标志,数据包不会在接收缓冲区中等待,它将直接发送到接收器。

    数据无论如何都不会在接收缓冲区中等待。
    TCP应用程序必须不遗余力地让TCP层聚集一些数据包并提供完整的数据缓冲区。

    事实上,看到应用程序分配64KB的缓冲区来接收数据,并看到它们收到大量1480/1472字节的消息,有些令人沮丧

    这是否意味着所有有效载荷数据都应该交付给最终用户,包括不带PSH标志发送的数据?@ArsenZahray是的。不管PSH标志如何,所有数据都会直接进入套接字接收缓冲区。“然而,今天,大多数API都没有提供一种方法让应用程序告诉其TCP设置推标志。事实上,许多实现者认为推标志的需要已经过时,一个好的TCP实现可以自行决定何时设置该标志。”,我不认为作者的意思是忽略PSH标志,只是客户端没有提供低级API来手动设置,但他们会自动设置。@Loochen1990,然后呢?数据进入接收器的套接字接收缓冲区,然后his read或his
    select()
    立即解除阻止,所有这些都不涉及PSH标志。这是多余的。它是为一个从未见过光明的中断API而设计的。如何?应用程序需要发出read,在这种情况下,无论如何都会发生传输。PSH标志对这一点没有任何影响。在许多TCP实现中,读取不会立即返回,直到0.5秒过去,或者接收到带有PSH标志的段,以便有效组合多个段。