7

HTTP 服务器通过多个数据包发送数据的正确方法是什么?

例如我要传输一个文件,我发送的第一个数据包是:

HTTP/1.1 200 OK
Content-type: application/force-download
Content-Type: application/download
Content-Type: application/octet-stream
Content-Description: File Transfer
Content-disposition: attachment; filename=test.dat
Content-Transfer-Encoding: chunked

400
<first 1024 bytes here>

400
<next 1024 bytes here>

400
<next 1024 bytes here>

现在我需要制作一个新数据包,如果我只是发送:

400
<next 1024 bytes here>

所有客户端都关闭了我的连接,并且文件被缩短了。

我在第二个数据包中放入哪些标头以继续数据流?

4

5 回答 5

3

我缺乏代表似乎不允许我对这个问题发表评论,只是回答它,所以我假设类似“你正在尝试在具有数据包的嵌入式设备的 Web 服务器上实现 HTTP 1.1面向网络堆栈而不是面向流的堆栈”是正确的,否则您不会谈论数据包。(如果您在谈论块,请参阅其他答案。)

鉴于此——如果可以,请使用套接字;您不必考虑数据包。您的网络堆栈可能有一个包装器。如果没有,写一篇不会对你的表现造成太大影响的文章。

如果你不能,无论出于何种原因——你可能已经超出了第一个数据包的大小。您的 MTU 可能类似于 1500 或 1492(或更小),并且“在您的第一个数据包中”列出了 + 5 + 1024 + 5 + 1024 + 5 + 1024 字节。您的网络堆栈可能很糟糕,以至于它没有给您错误代码,或者您的代码可能没有检查它们——或者它可能正在做其他同样无用的事情。

于 2010-05-06T23:46:55.343 回答
3

HTTP 没有数据包的概念。您的 HTTP 流甚至可以分解为 1 个字节的数据包。

对于分块编码,您必须为 RFC 中给出的每个块(与数据包无关)指定所需的标头。

于 2010-05-06T23:35:03.910 回答
2

通常,您将使用服务器端的Accept-RangesContent-Range标头来通知客户端服务器接受简历。然后,客户端会将Range标头发回以请求部分下载。

由于Content-Range标头需要完整文件长度的概念,而这在这里似乎是未知的(否则完全没有理由选择chunked编码),因此您迷失了标准 HTTP 规范。您要么选择其他协议,要么自行开发自己的规范,或者寻找替代方法来事先找出内容长度。


也就是说,这三个Content-Type标题毫无意义。选一个。也是Content-Transfer-Encoding错误的,应该是Transfer-Encoding

于 2010-05-07T00:03:24.683 回答
2

首先,你想要的标题是

Transfer-Encoding: chunked

不是Content-Transfer-Encoding

另外,为什么要发送三个不同的Content-Type标头?

于 2010-05-06T23:45:53.177 回答
0

你真的应该参考 rfc:http ://www.w3.org/Protocols/rfc2616/rfc2616.html

具体来说:http ://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6.1

于 2010-05-06T23:16:11.297 回答