gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:42:35 25 4
gpt4 key购买 nike

我用 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?

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

关于tcp - 一次通过 TCP/IP 发送多少数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31906619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com