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

一次通过TCP/IP发送多少数据,tcp,client-server,boost-asio,packet,throughput,Tcp,Client Server,Boost Asio,Packet,Throughput,我用boost asio库编写了一个小程序,通过TCP将文件从服务器传输到一个或多个客户端 在测试过程中,我发现传输速度非常慢,大约为10KiB/s。Nagle的算法已被禁用。如果我通过FileZilla将同一个文件从同一台服务器传输到同一台客户机,我会得到大约280KiB/s的速度,所以显然有些地方出了问题 到目前为止,我的方法是将每个文件分割成1024字节的较小数据包,向客户端发送一个片段(每个片段=1个async_write-call),然后等待客户端的响应。我需要对数据进行分段,以便客户

我用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
结果不言而喻,但我不确定现在该怎么办


我不太熟悉数据传输实际上是如何在内部处理的,但如果我没有弄错的话,我的所有数据基本上都添加到流中了吗?如果是这样,我是否需要担心一次向该流写入多少数据?我是否使用带有小片段的多个写调用,而不是使用带有大片段的一个写调用,这有什么区别吗?对此有什么指导原则吗?

只需将数据流式传输到客户端,而无需人工打包。可重入唠叨,这不是需要禁用它的场景。禁用它会导致小的效率低下

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

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

如果是这样,我是否需要担心一次向该流写入多少数据


不需要。只需始终保持一个未完成的写呼叫。

取消确认,并将缓冲区大小至少提高到32k。