【问题标题】:HTTP Data chunks over multiple packets?多个数据包上的 HTTP 数据块?
【发布时间】:2011-02-16 15:03:21
【问题描述】:

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>

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

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

【问题讨论】:

  • 您是在尝试实施还是伪造网络服务器?
  • 那么,数据包是什么意思?一个IP包? TCP 段?
  • 啊,显然,你的意思是块......令人困惑。块确实与数据包无关。
  • 您的“数据包”之间是否存在明显的时间延迟?
  • TCP 不能那样工作:stackoverflow.com/questions/756765/…

标签: http packet chunked-encoding


【解决方案1】:

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

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


也就是说,三个Content-Type 标头没有意义。选一个。 Content-Transfer-Encoding 也是错误的,应该是 Transfer-Encoding

【讨论】:

  • 奇怪的嵌入式客户端说他们需要这些头文件才能存储文件......谁知道为什么。简历将是一个很好的支持功能,所以我肯定会研究范围。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢,问题确实出在 TCP 层的网络堆栈上。出于某种原因,它在收到 ACK 数据包后自行结束 TCP 连接。我安装了来自不同供应商的新 tcp 堆栈,一切正常。
  • 这就是为什么,如果你能把 Linux 塞进一些东西,你真的应该这样做。错误的嵌入式东西是我存在的祸根。
【解决方案3】:

首先,你想要的标题是

Transfer-Encoding: chunked

不是Content-Transfer-Encoding

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 正在指定所需的块头? 1024KB 是十六进制 400。但是,Content-Transfer-Encoding 应该是 Transfer-Encoding
    • 你是对的。问题出在 TCP 层,而不是 HTTP 信息流。谢谢。
    【解决方案5】:

    【讨论】:

    • 我正在关注这一点,当所有东西都在一个数据包中时它确实有效,但由于某种原因,我必须错过与多个数据包有关的一些事情。我想是否有示例捕获多数据包块传输的任何地方?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2010-12-04
    • 2011-04-17
    • 2011-02-08
    • 1970-01-01
    • 2011-12-05
    相关资源
    最近更新 更多