Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个数据包上的HTTP数据块?_Http_Packet_Chunked Encoding - Fatal编程技术网

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

多个数据包上的HTTP数据块?,http,packet,chunked-encoding,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;

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>
HTTP/1.1200正常
内容类型:应用程序/强制下载
内容类型:应用程序/下载
内容类型:应用程序/八位字节流
内容描述:文件传输
内容处置:附件;filename=test.dat
内容传输编码:分块
400
400
400
现在我需要制作一个新包,如果我只发送:

400
<next 1024 bytes here>
400
所有的客户都关闭了我的连接,文件也被切断了


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

您应该真正参考rfc:


具体来说:

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


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

首先,需要的头是

Transfer-Encoding: chunked
内容传输编码


另外,为什么您要发送三个不同的
内容类型
标题?

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

考虑到这一点——如果可以的话,就使用套接字;你不必考虑数据包。你的网络堆栈可能有一个包装器。如果没有,就编写一个不会严重影响性能的包装器


如果你不能,不管出于什么原因,你很可能把第一个数据包的大小弄大了。你的MTU可能是1500或1492(或更小),你的第一个数据包中列出了+5+1024+5+1024+5+1024字节。“您的网络堆栈可能会非常糟糕,以至于它没有给您错误代码,或者您的代码可能没有检查它们——或者它可能在做其他同样无用的事情。

通常,您会使用服务器端的和头通知客户机服务器接受恢复。然后,客户端将发送头返回以请求部分下载

由于
内容范围
头需要一个完整文件长度的概念,而这在这里似乎是未知的(否则就完全没有理由选择
分块
编码),因此对于标准HTTP规范来说,您就迷失了方向。您可以选择另一个协议,或者自行开发自己的规范,或者寻找其他方法提前确定内容长度



也就是说,三个
内容类型
标题毫无意义。选择一个。另外,
内容传输编码
是错误的,它应该是
传输编码

您是否试图实现或伪造Web服务器?那么,您所说的数据包是什么意思?IP包?TCP段?啊,显然,你是说块。。。令人困惑块实际上与数据包无关。您的“数据包”之间是否存在明显的时间延迟?TCP不是这样工作的:我遵循这一点,当所有内容都在一个数据包中时,它确实工作,但出于某种原因,我必须在多个数据包中遗漏一些要做的事情。我想是否有示例捕获了多数据包块传输的任何地方?他正在指定所需的块头?1024KB是十六进制400。但是,
内容传输编码
应该是
传输编码
。您是正确的。问题出在TCP层,而不是HTTP信息流。谢谢。谢谢,问题确实出在TCP层的网络堆栈中。出于某种原因,在确认数据包后,它会自行终止TCP连接。我从另一家供应商那里安装了一个新的tcp协议栈,一切正常。这就是为什么,如果你能把Linux塞进一些东西,你真的应该这样做。Buggy embedded stuff是我存在的祸根。wierd embedded客户端说他们需要这些头才能存储文件。。。谁知道为什么。简历将是一个很好的功能,以支持,所以我将明确研究范围。