当内部缓冲区填满时,TCP中会发生什么

时间:2018-04-04 09:53:46

标签: sockets tcp buffer buffer-overflow

假设我们有以下TCP套接字设置,其中客户端将任意数据发送到服务器。将以下内容视为伪代码。

def client():
    while True:
        data = source.get_data()
        client_socket.send(data)

服务器读取数据并使用它来做某事......

def server():
    while True:
        data += socket.recv(4096)
        parsed_data = parse_data(data)  
        cpu_intensive_task(parsed_data)

假设客户端发送数据的速度比服务器可以处理的速度快得多。 内部网络缓冲区可以填满吗?我认为答案是肯定的......

如果是这样,那么TCP协议是否指定了这种情况下会发生什么?这些丢弃的数据包是否被视为在传输过程中丢失,只是像其他任何丢失的包一样重新传输?

或者这些数据包是否真的丢失了,这是我在TCP上设置自己的通信协议时必须考虑的问题?

操作系统的答案是否有所不同?

对于记录,上面的系统应该有某种拥塞控制机制,服务器可以使用该机制告诉客户它负载很重或者它再次空闲。但是,我很想知道默认情况下TCP在这种情况下的表现如何。

1 个答案:

答案 0 :(得分:2)

  

内部网络缓冲区可以填满吗?

两个内部缓冲区:发送缓冲区和接收缓冲区。两者都可以填满。

  

我认为答案是肯定的......

  

如果是,那么TCP协议是否指定了在这种情况下会发生什么?

  

这些丢弃的数据包

没有丢弃的数据包。在这种情况下,TCP不会丢弃数据包。发送缓冲区填满时会发生什么取决于您是处于阻塞模式还是非阻塞模式,或者您是否使用异步API:

  • 阻止模式:发件人阻止
  • 非阻止模式:发件人收到错误EAGAIN / EWOULDBLOCK
  • 异步:操作继续延迟。
  如果他们在运输过程中丢失并像其他任何丢失的包裹那样重新传送,那么

会被视为对象?

没有。见上文。

  

或者这些数据包真的丢失了

没有。见上文。

  

这是我在TCP上设置自己的通信协议时必须考虑的事情吗?

没有。往上看。但是,在协议的实现中,您必须考虑各种条件。

  

操作系统的答案是否有所不同?

没有

  

对于记录,上面的系统应该有某种拥塞控制机制

TCP已经拥有拥塞控制机制。

  

哪个服务器可以用来告诉客户端它负载很重

如何?如果客户端没有读取,服务器如何告诉它什么?

  

或者它再次免费。但是,我很想知道默认情况下TCP在这种情况下的表现如何。

见上文。