gpt4 book ai didi

http请求消息边界

转载 作者:可可西里 更新时间:2023-11-01 02:55:03 29 4
gpt4 key购买 nike

我正在编写一个客户端,通过常规的 http multipart/form-data 将文件上传到 megaupload。现在,重点不是 megaupload 本身,而是他们的网络服务器的行为。

Curl 可以毫无问题地上传,而我的客户端不能,即使发送完全相同的请求(用 wireshark 嗅探)——但它一直在等待响应,最终在 30 分钟后超时。

在使用原始套接字和 strace 一段时间后,发现两者之间的唯一区别是 curl 仅通过一次调用 sendto(2) 来发送 header block ,然后通过其他调用 sendto( 2).另一方面,我的客户使用 write(2) 分别发送每个 header 。

现在,如果 send 没有指定任何标志,那么 sendto 和 write 应该是等价的,而它确实没有。事实上,我让它与 write 一起工作,但只是通过在一次调用中发送 header block 。每隔一个写入调用序列都会导致请求卡在等待中。

所以问题是:这怎么可能? Tcp 不保留消息边界,它是一种流协议(protocol)。

我唯一能想到的是,每个写入/发送系统调用都会导致发送一个数据包,并且远程服务器正在嗅探原始数据包并谎称是 apache。

想法?还是我是个白痴,这是兼容 http 服务器的正常行为?它肯定是第一个对我有这种行为的网络服务器。

最佳答案

http 协议(protocol)包含使客户端/服务器可以确定消息边界的机制。对于上传的数据(POST、PUT),需要内容长度请求 header 或分 block 编码。内容长度让服务器确切知道从套接字接收多少字节。一旦收到这些字节,它就会向另一个方向发送。这实际上是这里的消息边界。 Chunked-encoding 也告诉服务器有多少字节;只是分成几部分。

对于响应,内容长度(或分 block 编码)可选。这也告诉客户端需要多少字节;这是持久连接工作所必需的。如果不能确定内容长度,服务器简单地关闭套接字,然后客户端知道它有完整的响应:)

关于http请求消息边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5197656/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com