【发布时间】:2016-04-15 21:43:24
【问题描述】:
我正在开发使用 Microsoft RPC(通过 TCP)作为通信方法的客户端-服务器软件。我们有时将文件从客户端传输到服务器。这在本地网络中运行良好。不幸的是,当我们有高延迟时,即使是非常宽的带宽也无法提供不错的传输速度。
基于 WireShark 日志,RPC 层发送一堆片段,然后在发送更多片段之前等待来自服务器的 ACK,这导致延迟主导传输时间。我正在寻找一种方法来告诉 RPC 在暂停之前发送更多数据包。
这个问题似乎与 TCP 窗口太小基本相同,但这里可能有一个 RPC 特定的片段窗口在起作用,因为 Wireshark 没有显示 TCP 级别的窗口已满。带有小窗口的 iPerf 连接测试确实会给出这些警告,并且速度类似于 RPC 传输。对于较大的窗口大小,iPerf 传输速度比 RPC 快三倍,即使有合理的 (40 毫秒) 延迟。
我确实在 microsoft 的站点 (https://msdn.microsoft.com/en-us/library/gg604601.aspx) 和 RPC 文档 (http://pubs.opengroup.org/onlinepubs/9629399/chap12.htm 搜索 window_size) 中发现了一些关于 RPC 片段窗口的提及,但这些似乎只涉及无连接 (UDP) RPC。此外,他们提到了一个 RPC “fack” 消息,而我在日志中只观察到常规 TCP 级别的 ACK:s。
我的结论是,要么 RPC 层使用了一个愚蠢的低 TCP 窗口,要么它通过某些内部逻辑限制了它一次发送的片段包的数量。无论哪种方式,我都需要让它在 ACK 之间发送更多。有没有办法做到这一点?
我当然可以通过多个同时连接传输文件,但这似乎更像是一种变通方法而不是解决方案。
附言。我知道 RPC 并不是真正为文件传输而设计的,但这是一个遗留应用程序,并且 RPC 管道处理身份验证等,因此至少现在保持文件传输是最好的。
PPS。我想如果这个问题的答案是一个配置选项,这将更适合 SuperUser,但 API 设置将是理想的,这就是我在此处发布此内容的原因。
【问题讨论】: