HTTP数据块在多个数据包上?

时间:2010-05-06 23:13:04

标签: http packet chunked-encoding

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>

所有客户关闭我的连接,文件被缩短。

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

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

鉴于此 - 如果可以,请使用套接字;你不应该在数据包中思考。你的网络堆栈可能有一个包装器。如果没有,请写一个不会使你的表现太糟糕的一个。

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

答案 2 :(得分:2)

首先,您想要的标题是

Transfer-Encoding: chunked

不是Content-Transfer-Encoding

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

答案 3 :(得分:2)

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

由于Content-Range标题需要一个完整文件长度的概念,而且这里似乎未知(否则完全没有理由选择chunked编码),你会丢失的到标准的HTTP规范。您可以选择其他协议,也可以自行生成自己的规范,或者寻找其他方法来预先找到内容长度。


尽管如此,三个Content-Type标题毫无意义。选一个。 Content-Transfer-Encoding也是错误的,应该是Transfer-Encoding

答案 4 :(得分:0)