TCP PSH是如何工作的?

4

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

以下是我感兴趣的内容:

  1. 假设服务器窗口为8000字节,我发送了两个请求,分别为150和600字节。我会收到确认数据已经被接收的通知吗?我能否触发确认?

  2. 我看到了一些ACK数据包,它们不包含PSH但包含某种有效载荷数据(Wireshark将其标记为“TCP段数据”)。这些数据是否传递给用户,如果是的话,我们为什么需要PSH标志?

4个回答

9

TCP PSH一般来说根本不起作用。基于伯克利的TCP实现完全忽略它。

来源:W.R. Stevens,《TCP/IP Illustrated》卷I:20.5 PUSH标志。


这是否意味着所有有效载荷数据都应该传递给最终用户,包括未使用PSH标志发送的数据? - Arsen Zahray
@ArsenZahray 是的,它确实会。所有数据都会直接进入套接字接收缓冲区,无论PSH标志如何。 - user207421
1
然而,如今大多数API都没有提供一种方式让应用程序告诉其TCP设置PUSH标志。实际上,许多实现者认为PUSH标志的需求已经过时了,一个好的TCP实现可以自行确定何时设置该标志。我认为作者的意思并不是忽略PSH标志,只是客户端没有提供手动设置它的低级API,但它们会自动设置它。 - luochen1990
@luochen1990 然后呢?数据进入接收方的套接字缓冲区,然后他的读取或者select()立即解除阻塞,完全不需要参考PSH标志。它是多余的。它是为一种从未问世的中断API设计的。 - user207421
推送标志不是用于分离应用程序的不同消息或强制将组装的数据传输到应用程序,因为缓冲区大小不足吗? - slinkin
@slinkin 不,它不是这样的,也不可能用于那个目的。它不提供消息边界,也不强制任何事情,正如W.R. Stevens多年前所说的那样。 - undefined

2

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


应该如何推动?通过哪个API? - undefined

0

我假设,如果我们设置了推送标志,数据包就不会等待在接收缓冲区中,而是直接发送给接收者。


如何?应用程序需要发出读取操作,此时传输将会发生。PSH标记对此并没有任何影响。 - user207421
3
在许多 TCP 实现中,读取操作将不会立即返回结果,除非经过了 0.5 秒的时间,或者收到了带有 PSH 标志的数据包——为了有效地合并多个数据包。 - Simon
@Simon 真的吗?你对这个断言有什么依据? - undefined

-1
数据不会静静地等待在接收缓冲区中。
TCP 应用程序必须费尽心思,让 TCP 层批量传输几个数据包并交付完整的数据缓冲区。
事实上,看到应用程序分配 64KB 缓冲区来接收数据,却看到它们接收了无数个 1480/1472 字节的消息,这是有点令人沮丧的。

数据不会无论如何都静静地等在接收缓冲区里。真的吗?那它会发生什么呢?答案是:除非应用程序发出读取指令,否则什么也不会发生。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接