一次通过 TCP/IP 发送多少数据

How much data to send via TCP/IP at once

我用 boost asio 库编写了一个小程序,通过 TCP 将文件从服务器传输到一个或多个客户端。

在测试过程中我发现传输非常慢,大约10KiB/s。 Nagle 的算法已被禁用。如果我通过 FileZilla 将同一个文件从同一个服务器传输到同一个客户端,我得到大约 280KiB/s,所以很明显有些地方出了问题。

到目前为止,我的方法是将每个文件分成 1024 字节的较小数据包,将一个片段(每个片段=1 async_write-call)发送给客户端并等待客户端的响应。我需要对数据进行分段,以便客户端可以跟踪下载进度和速度。现在回想起来,我认为这是相当幼稚的,因为服务器必须在每个片段之后等待客户端的响应。为了检查这是否是瓶颈,我将片段大小增加了两次,得到以下结果:

a) Fragment Size: 1024bytes
Transfer Speed: ~10KiB/s
b) Fragment Size: 8192bytes
Transfer Speed: ~80KiB/s
c) Fragment Size: 20000bytes
Transfer Speed: ~195KiB/s

结果不言而喻,但我不确定现在该做什么。

我不太熟悉数据传输在内部的实际处理方式,但如果我没记错的话,我所有的数据基本上都添加到流中了?如果是这样,我是否需要担心我一次向该流写入了多少数据?使用小片段的多次写调用与大片段的一次写调用是否完全不同?有这方面的指导方针吗?

无需人工打包,直接将数据流式传输到客户端。重新启用 nagling,这不是需要禁用它的场景。禁用它会导致效率低下。

典型的写入缓冲区大小为 4KB 及以上。

客户端可以一个接一个地向网络发出读取调用。每次成功阅读后,客户将对当前进度有一个新的估计,该估计非常准确。通常,对于接收到的每个网络数据包,都会有一个后续的读取调用。如果传入速率非常高,则多个数据包往往会合并为一次读取。这不是问题。

If that's the case, do I need to worry about how much data I write to that stream at once?

没有。始终保持写调用未完成。