像所有套接字 API 一样,它表示它返回实际发送的字节数。什么情况下返回的数字与输入的大小不匹配?
我幼稚的假设是它会发送完整的段,直到窗口已满,一旦它等待 ACK,它就会返回(我从 W10 发送到 Ubuntu,我假设默认情况下两者都使用 Nagle 的算法)。
但是,即使我传递一个 >100MB 的缓冲区来发送,它也总是返回输入缓冲区的大小。标准库会自动“在内部多次调用发送”,还是我的 ubuntu 发送 ACK 太快?还是我对 API 和/或 Nagle 算法的解释有误?
像所有套接字 API 一样,它表示它返回实际发送的字节数。什么情况下返回的数字与输入的大小不匹配?
我幼稚的假设是它会发送完整的段,直到窗口已满,一旦它等待 ACK,它就会返回(我从 W10 发送到 Ubuntu,我假设默认情况下两者都使用 Nagle 的算法)。
但是,即使我传递一个 >100MB 的缓冲区来发送,它也总是返回输入缓冲区的大小。标准库会自动“在内部多次调用发送”,还是我的 ubuntu 发送 ACK 太快?还是我对 API 和/或 Nagle 算法的解释有误?
看起来这取决于操作系统的行为。Dotnetcore 没有做任何特别的事情,比如多次调用 send。您的参数通过以下方式逐字传递给系统调用:Socket.Send -> SocketPal.Send -> SystemNative_SendMessage