dotnet 的 tcp 套接字的发送方法到底什么时候不发送所有字节?

When exactly does dotnet's tcp socket's send method not send all bytes?

像所有套接字一样 APIs,it says that it returns the number of bytes actually sent。在什么情况下 returned 数字与输入的大小不匹配?

我天真的假设它会发送 full segments until the window is full,一旦它等待 ACK,它就会 return(我从 W10 发送到 Ubuntu,我假设两者都默认使用 Nagle 算法)。

然而,即使我传递一个 >100MB 的缓冲区来发送,它总是 return 是输入缓冲区的大小。标准库会自动 "call send multiple times internally",还是我的 ubuntu 发送 ACK 太快?还是我对 API and/or Nagle 算法的解释有误?

看起来这取决于 OS 行为。 Dotnetcore 没有做任何特别的事情,比如多次调用发送。您的参数通过以下方式几乎逐字传递给系统调用:Socket.Send -> SocketPal.Send -> SystemNative_SendMessage