我有一个通过 TCP 套接字的客户端/服务器连接,服务器尽可能快地写入客户端。
查看我的网络活动,生产客户端以大约 2.5 Mb/s 的速度接收数据。
我编写的一个新的轻量级客户端只是读取和基准速率,其速率约为 5.0Mb/s(这可能是服务器可以传输的最大速度左右)。
我想知道这里的费率是由什么决定的,因为客户端没有向服务器发送数据来告诉它任何速率限制。
我有一个通过 TCP 套接字的客户端/服务器连接,服务器尽可能快地写入客户端。
查看我的网络活动,生产客户端以大约 2.5 Mb/s 的速度接收数据。
我编写的一个新的轻量级客户端只是读取和基准速率,其速率约为 5.0Mb/s(这可能是服务器可以传输的最大速度左右)。
我想知道这里的费率是由什么决定的,因为客户端没有向服务器发送数据来告诉它任何速率限制。
在 TCP 中,它是客户端。如果服务器的 TCP 窗口已满 - 它需要等到来自客户端的更多 ACK 到来。它在 TCP 堆栈中对您隐藏,但 TCP 引入了保证交付,这也意味着服务器发送数据的速度不能超过客户端处理它们的速度。
TCP 有流量控制,它会自动发生。在http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Flow_control阅读它
当管道由于流控制而填满时,服务器 I/O 套接字写入操作将不会完成,直到流控制被释放。
服务器正在以 5.0Mb/s 的速度写入数据,但如果您的客户端是这里的瓶颈,那么服务器必须等待“Sent Buffer”中的数据完全发送到客户端,或者释放足够的空间来放入更多数据。
正如您所说的轻量级客户端能够以 5.0Mb/s 的速度接收,那么您必须检查客户端中的接收后操作。如果您正在接收数据然后在读取更多数据之前对其进行处理,那么这可能是瓶颈。
最好异步接收数据,一旦接收完成,就要求客户端套接字重新开始接收数据,同时在单独的线程池线程中处理接收到的数据。这样,您的客户端始终可以接收传入数据,而服务器可以全速发送。