繁体   English   中英

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

[英]Possible to emulate flow control in HTTP protocol ? (raw HTTP protocol)

我在客户处有数百个硬件设备,它们需要通过telnet接口发送HTTP数据。
目标是带有PHP脚本Apache 2 Web服务器,等待数据。

这已经在起作用,但是我们发现所涉及的硬件无法处理硬件流控制,这意味着一旦数据被填充(大约250个字节),缓冲区就会溢出,从而导致数据损坏。
修复HW流程不是一种选择,“调制解调器”固件已关闭,并且由于厂商的硬件已相当旧而无法再进行修改。

通常,我们将使用以下代码:

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个字节后,缓冲区将被覆盖,并且某些字节会丢失。
现在使它工作的唯一当前方法是在发送到“调制解调器”时使用延迟,以便它可以及时清空其缓冲区。 但是,由于不稳定的Internet连接和不可预测的时间,因此在现场无法使用。

我不是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功能,或者可以“滥用”这种功能。 保持活跃只是一个猜测。

如果当前的HTTP协议没有这样的功能,那么我想解决问题的唯一方法就是在PHP端实现流控制。
我希望有一个更好的方法。

更新:同时,我发现了两个有趣的参数:期望:100连续传输编码:分块

我需要的是两者兼而有之。 分块传输编码,每个分块后面期望有100个连续!

这是一个非常有趣的问题,它与HTTP无关,而与TCP无关。

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

您可以做的另一件事是将其完全保留在应用程序层中,并使此中间代理缓冲来自响应的所有数据。 对于大多数普通的HTTP响应,这是可以的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM