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

Tuk*_*keV 7 sockets buffer tcp buffer-overflow

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

def client():
    while True:
        data = source.get_data()
        client_socket.send(data)
Run Code Online (Sandbox Code Playgroud)

服务器读取数据并使用它来做一些事情......

def server():
    while True:
        data += socket.recv(4096)
        parsed_data = parse_data(data)  
        cpu_intensive_task(parsed_data)
Run Code Online (Sandbox Code Playgroud)

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

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

还是这些数据包真的丢失了,这是我在 TCP 之上设计自己的通信协议时必须考虑的事情?

答案是否因操作系统而异?

作为记录,上面的系统应该有某种拥塞控制机制,服务器可以使用它来告诉客户端它的负载很重,或者它又空闲了。但是,我很想知道默认情况下 TCP 在这种情况下的行为方式。

use*_*421 11

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

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

我想答案是肯定的...

是的。

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

是的。

这些是丢弃的数据包吗

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

  • 阻塞模式:发送方阻塞
  • 非阻塞模式:发送方收到错误 EAGAIN/EWOULDBLOCK
  • 异步:操作继续被推迟。

就好像它们在运输过程中丢失并像任何其他丢失的包裹一样重新传输?

不,见上文。

还是这些数据包真的丢失了

不,见上文。

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

不,见上文。但是各种条件肯定是您在实施协议时必须考虑的事情。

答案是否因操作系统而异?

不。

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

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

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

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

或者它又免费了。但是,我很想知道默认情况下 TCP 在这种情况下的行为方式。

看上面。

  • 但是,如果服务器由于发送缓冲区已满而无法向客户端发送,则服务器无法向客户端发送,因为其发送缓冲区已满。解决这个问题的唯一方法是客户端读取超时。 (2认同)