【发布时间】:2020-06-21 12:14:11
【问题描述】:
一些背景知识:我正在使用遗留代码,并尝试通过 HTTP 表单(POST 请求)将二进制文件(~2MB)上传到嵌入式 microhttpd Web 服务器。最近我注意到 Windows 10 机器的上传速度比非 Windows 10 机器慢得多:上传将一次发送少量字节(大约 6-7 个块,每个块约 1500 个字节),然后暂停,有时 30-60 秒,然后再发送少量字节。此问题导致的速度下降导致整个上传过程无法使用。
我在嵌入式服务器上进行了一些调试,发现它确实在等待更多数据进入为 POST 请求创建的套接字上,并且由于某种原因,客户端计算机没有发送这些数据。在 Wireshark 中对 Win10 与非 Win10 流量进行一些分析后,我看到的消息似乎与 Microsoft 在此处描述的问题相符:https://support.microsoft.com/en-gb/help/823764/slow-performance-occurs-when-you-copy-data-to-a-tcp-server-by-using-a。
具体来说,我看到在 Windows 10 的情况下,发送到嵌入式 Web 服务器的第一个 TCP 数据包确实是“单个发送调用 [that] 填充整个底层套接字发送缓冲区”,根据 Microsoft 文章。非 Windows 10 机器似乎并非如此。因此,我需要能够设置我的套接字,这样 Web 客户端就不会发送太多数据,以至于在一个数据包中填满接收缓冲区。
不幸的是,对网络服务器本身的重大修改(除了小的配置调整)是不可能的,因为我正在使用的遗留代码是众所周知的耦合和不稳定的。因此,如果可能的话,我正在寻找一种通过 JavaScript 指定套接字设置的方法。我目前正在使用在 XMLHttpRequests 之上运行的 JQuery Form 插件。由于我可以完全控制 JavaScript 页面和嵌入式 Web 后端,因此我可以在这两种情况下对套接字缓冲区大小进行适当的硬编码。
有没有办法通过 JavaScript 调整像这样的低级套接字设置?如果没有,这个问题是否还有其他解决方法?
【问题讨论】:
标签: javascript sockets http