【问题标题】:Possible to emulate flow control in HTTP protocol ? (raw HTTP protocol)可以在 HTTP 协议中模拟流量控制吗? (原始 HTTP 协议)
【发布时间】:2015-04-16 12:07:05
【问题描述】:

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

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

通常我们会使用这个:

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”用于以这种方式运行的东西。 keep-alive 只是一个猜测。

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

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

我需要的是两者的结合。 一个分块传输编码,在每个块之后期望 100-continue!

【问题讨论】:

    标签: apache http post


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨,这是个好主意,但我认为它行不通。原因是在硬件方面我无法访问 TCP/IP 堆栈,我有一个调制解调器,它允许通过串行接口打开 telnet 会话。无论 MTU 或窗口大小如何,调制解调器后面的硬件都看不到它。因此,代理需要是高级别的(实现 START/STOP 逻辑的自己的协议)。我现在使用 100-CONTINUE 期望值(就像标题的流控制),然后在每发送 200 个字节后延迟 500 毫秒,并使用校验和来验证内容。我也希望在块中继续,看起来很糟糕
    • @John 在任何情况下,代理都可以通过 TCP 窗口大小进行限制。这在 Node.js 中很容易通过简单地暂停流来实现。那么就不需要协议破解了。
    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 2012-09-01
    • 2020-05-08
    • 2013-01-20
    • 2016-08-09
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多