![为什么 POST 请求在第一个数据包中使用 PSH 标志?](https://linux22.com/image/1466136/%E4%B8%BA%E4%BB%80%E4%B9%88%20POST%20%E8%AF%B7%E6%B1%82%E5%9C%A8%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%95%B0%E6%8D%AE%E5%8C%85%E4%B8%AD%E4%BD%BF%E7%94%A8%20PSH%20%E6%A0%87%E5%BF%97%EF%BC%9F.png)
我正在尝试了解 POST HTTP 事务的行为。当存在具有长 URI 的 GET 请求且需要发送多个数据包时,最后一个数据包中会使用 PSH 标志来告知服务器必须立即将数据推送到接收应用程序。
但是,在 POST 请求中,例如将图片上传到 imgur,PSH 标志会一直存在于每个有效负载块中,直到完成为止。我认为,如果我错了,请纠正我,这种行为只是因为事务的每个块都很大,必须尽快发送到上层以避免巨大的缓冲区,并且这种行为用于实时和交互式应用程序。但是,这是标准吗?这种行为在每个 POST 请求中都会出现吗?
提前致谢
答案1
“我认为......这种行为只是因为交易的每一块都很大,必须尽快发送到上层,以避免巨大的缓冲区,并且这种行为用于实时和交互式应用程序”
您描述的行为由发送客户端(软件)决定。关于 TCP 和 UDP 实现的一个常见误解是,只有一种编码方式,但编码时需要做出选择……而且并非所有程序员都会做出相同的选择。RFC 是您的好朋友。
http://www.freesoft.org/CIE/RFC/1122/88.htm “当应用程序发出一系列 SEND 调用而未设置 PUSH 标志时,TCP 可能会在内部聚合数据而不发送数据。同样,当收到一系列没有 PSH 位的段时,TCP 可能会在内部对数据进行排队而不将其传递给接收应用程序。”
这可能这句话中的“是否设置 PSH 位”为(发送客户端的)程序员提供了选择。在您描述的情况下,程序员选择优先将有效负载发送到堆栈上层应用程序,而不是缓冲一系列有效负载以一次性发送到堆栈上层。
希望有所帮助。