可以在HTTP协议中模拟流控制吗? (原始HTTP协议)

时间:2015-04-16 12:07:05

标签: apache http post

我有数百个客户需要通过telnet接口发送HTTP数据的硬件设备 目标是 Apache 2 Web服务器,其中包含PHP脚本,等待数据。

这已经有效但我们发现所涉及的硬件无法处理hw-flow-control,这意味着一旦数据被填满(大约250字节),缓冲区就会溢出,导致数据损坏。
修复HW-flow不是一个选项,“调制解调器”固件已关闭,不再由供应商修改,因为它是相当旧的硬件。

通常我们会使用这个:

POST / HTTP/1.1
Host: api.server
User-Agent: P8
Content-Type:  application/x-www-form-urlencoded
Accept: */*
Content-Length: 767

VARIABLE=URLENCODED_DATA(total length 767 bytes)

这对于流控制来说非常好,但在我的情况下,767字节太多了 大约200字节后,缓冲区将被覆盖,一些字节丢失 现在让它工作的唯一方法是在发送到“调制解调器”时使用延迟,这样它就可以及时清空它的缓冲区。然而,在现场,由于不可预测的定时的不稳定的互联网连接,这将不起作用。

我不是HTTP的专家,我只是希望可以分割一个包 我想过使用"Connection: keep-alive"或类似的东西。

我的主要问题:
有没有办法以一种方式将POST数据($ VARIABLE)以较小的块发送到Apache 2服务器,使HTTP服务器在内部将它们组合到一个流中?

伪代码:

POST / HTTP/1.1
Host: api.server
User-Agent: P8
Content-Type:  application/x-www-form-urlencoded
Accept: */*
Content-Length: 400
Connection: keep-alive

VARIABLE=URLENCODED_DATA(200 bytes)
END\n\n

服务器在收到"OK"后以TCP流响应 发送下一个块:

VARIABLE=URLENCODED_DATA(200 bytes)

连接已关闭 当已达到400字节时,该过程已准备就绪,Apache将VARIABLE转发到PHP脚本POST输入。

就像开放TCP连接中的HTTP流控制一样 也许有一个为此目的而构建的HTTP功能,或者可以“ab”用于以这种方式运行的东西。保持活力只是猜测。

如果当前的HTTP协议没有这样的功能,我可以考虑解决我的问题的唯一方法是在PHP端实现流量控制。
我希望有一种比这更好的方式。

更新: 同时我发现了两个有趣的参数: 期待:100-继续 Transfer-Encoding:chunked

我需要的是两者兼而有之。 一个分块传输编码,预计在每个块之后会继续100次!

1 个答案:

答案 0 :(得分:1)

这是一个非常有趣的问题,它实际上与HTTP无关,但与TCP无关。

解决此问题的方法是使用中间代理来处理您的设备。理想情况下,此设备将能够将TCP数据包ACK上的窗口大小设置为设备缓冲区的大小。当设备无法再处理时,该窗口大小将接近零。如果这样做,您将使用TCP的内置流量控制并以简单的方式解决问题。

您可以做的另一件事是将其完全保留在应用程序层中,并让此中间代理缓冲响应中的所有数据。对于大多数正常的HTTP响应,这没关系。