代码之家  ›  专栏  ›  技术社区  ›  CookieOfFortune

套接字限制,因为客户端没有足够快地读取数据?

  •  1
  • CookieOfFortune  · 技术社区  · 15 年前

    我通过TCP套接字建立了一个客户机/服务器连接,服务器尽可能快地向客户机写入数据。

    查看我的网络活动,生产客户机以大约2.5 MB/s的速度接收数据。

    我编写的一个新的轻量级客户机只是为了读取和测试速率,它的速率大约为5.0MB/s(这可能是服务器可以传输的最大速率)。

    我想知道是什么控制了这里的速率,因为客户机没有向服务器发送任何关于速率限制的数据。

    3 回复  |  直到 15 年前
        1
  •  6
  •   Xeor    15 年前

    在TCP中,它是客户端。如果服务器的TCP窗口已满,则需要等待客户端发出更多的ACK。它隐藏在TCP堆栈中,但TCP引入了保证传递,这也意味着服务器发送数据的速度不能超过客户端处理数据的速度。

        2
  •  3
  •   Remus Rusanu    15 年前

    TCP有流量控制,它自动发生。请阅读 http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Flow_control

    当管道由于流控制而充满时,在释放流控制之前,服务器I/O套接字写入操作不会完成。

        3
  •  0
  •   ata    15 年前

    服务器正在以5.0MB/s的速度写入数据,但是如果您的客户机是这里的瓶颈,那么服务器必须等待“已发送缓冲区”中的数据完全发送到客户机,或者释放足够的空间以放入更多的数据。

    正如您所说,轻量客户端能够以5.0Mb/s的速度接收,那么您必须检查客户端中的接收后操作。如果您正在接收数据,然后在读取更多数据之前对其进行处理,那么这可能是瓶颈。

    最好是异步接收数据,一旦一个接收完成,就要求客户端套接字重新开始接收数据,同时在单独的线程池线程中处理接收的数据。这样,您的客户机总是可以接收输入的数据,服务器可以全速发送。