sockets - 当内部缓冲区填满时 TCP 会发生什么

标签 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 协议(protocol)是否指定了在这种情况下会发生什么?这些丢弃的数据包是否被视为在传输过程中丢失并像其他任何丢失的数据包一样重新传输?

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

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

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

最佳答案

Can the internal network buffer fill up?

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

I assume the answer is yes...

是的。

If so, then does the TCP protocol specify what will happen in this scenario?

是的。

Are these discarded packets

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

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

treated as if they were lost in transit and just re-transmitted like any other lost packages?

没有。见上文。

Or are these packets truly lost

没有。见上文。

and this something I have to consider when desiging my own communication protocol on top of the TCP?

没有。看上面。但在协议(protocol)的实现中,您肯定必须考虑各种条件。

Does the answer vary between operating systems?

没有。

For a record, the system above should have some kind of congestion control mechanism

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

which server could use to tell the client that it's under heavy load

如何?如果客户端没有读取,服务器如何告诉它任何信息?

or it's free again. However, I'm curious to know how the TCP by the default would behave in this scenario.

见上文。

关于sockets - 当内部缓冲区填满时 TCP 会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49648017/

相关文章:

tcp - Golang net.ListenTCP结构体

mongodb - 无法将 mongodb 容器连接到 docker 中的节点容器

iphone - 苹果的AurioTouch2示例代码中的 “Mute”按钮有什么作用?

python - 使用 python 后端的客户端授权

c++ - 无法读取客户端发送的所有消息

c - 手动完成 3 次握手?

go - 在 Go 中使用 bytes.Buffer 实现类斐波那契字符串连接的正确方法是什么?

c++ - 缓冲输入与标准输入

在 sockaddr 和 sockaddr_in6 之间转换

c++ - 我应该实现自己的 TCP/IP 套接字超时吗?