当数据发送速度超过可处理速度时,套接字如何操作?

时间:2015-05-24 06:46:46

标签: sockets networking tcp network-programming flow-control

我不太清楚TCP和套接字的一些细节机制。

一个客户端通过TCP连接到服务器,并将数据发送到服务器。如果发送速度远远大于处理速度会怎样? 例如,如果客户端每秒发送1MiB,但服务器每秒只能处理1 KiB,是否会导致系统内存崩溃?

我知道套接字API中有接收缓冲区大小设置:

  1. 如果我设置缓冲区大小但数据泛滥怎么办?
  2. 如果我没有设置接收缓冲区大小怎么办?

3 个答案:

答案 0 :(得分:4)

简而言之,当服务器每秒只能处理1k时,客户端将无法每秒发送1M。这有两个原因:

  • TCP具有慢启动机制
  • TCP有一个窗口机制,TCP连接的每一面都在不断宣传自己接收到另一方的能力。

客户端发送的数据超过广告窗口大小是没有意义的,因为服务器将首先丢弃超出其窗口大小的任何段,因此客户端必须重新发送(如果是忽略窗口大小。

缓冲区位于不同的层中。您可以通过套接字选项设置的缓冲区是套接字级缓冲区,它们不能直接控制TCP窗口大小。如果您没有设置这些缓冲区,则会在套接字级别获得默认缓冲区大小。 TCP正在排队,具体取决于是否接收到窗口大小的乱序数据包。如果它接收到有序的数据,它会触发套接字级别,然后只将数据推送到套接字级别缓冲区,然后只有可用空间的数量。 如果TCP无法推送它在套接字缓冲区上收到的所有数据,那么这将对计算TCP窗口大小的算法产生影响。此计算机制基于TCP缓冲区中剩余的字节数。

没有人会崩溃,无论是服务器还是客户端。

在客户端,可以高速发送的那个,类似的事情发生是因为TCP将根据服务器的广告窗口大小看到它无法在线路上放置太多数据。所以客户端发送缓冲区将填满。如果它已满,则客户端套接字将阻塞发送(阻塞模式)或返回它将阻止的错误指示(非阻塞模式)。

所以这不只是说会发生什么,但我也试图解释为什么会发生这些事情以及如何实施。

答案 1 :(得分:2)

  

如果发送速度远远大于处理速度会怎样?例如,如果客户端每秒发送1 MiB,但服务器每秒只能处理1 KiB ......

如果发送方处于阻止模式,如果发送方远远超过接收方,它将阻止。

如果它处于非阻止模式,send()将返回-1 errno == EAGAIN/EWOULDBLOCK.

  

是否会导致系统内存崩溃?

没有

  

我知道套接字API中有接收缓冲区大小设置:

     
      
  1. 如果我设置缓冲区大小但数据泛滥怎么办?
  2.   

当接收缓冲区已满时,接收主机将告诉发送方停止发送。

  
      
  1. 如果我没有设置接收缓冲区大小怎么办?
  2.   

您将获得默认尺寸。

答案 2 :(得分:-1)

网络层中存在用于控制这些情况的拥塞控制算法: -

  1. 数据包排队和服务政策
  2. 数据包丢弃政策等
  3. 在传输层(TCP),使用某些策略来摆脱这种情况: -

    1. 转发政策
    2. 流量控制政策(在这里您将了解 TCP中的滑动窗口协议以控制数据流
    3. 超时确定等
    4. 基于以上几点,我希望你可能已经知道如果客户端试图淹没服务器会发生什么。

      如果出现以下因素,则会根据以上因素调整/滑动窗口(在传输层),抖动控制,减载(在网络层)等操作:

      (i)网络/路由器充满了请求,或者(ii)数据流在传输层(TCP)的两个进程之间是不规则和错误的。