通过套接字发送 10 MB 的缓冲区 - 块还是整个 10MB?

Sending a buffer of 10 MB through socket - Chunks or Whole 10MB?

我正在将必须从我的 C++ 函数发送到 Java 的详细信息转换为字符串和将通过套接字发送的 char*。

我的缓冲区大小是 10 MB。我可以一次发送 10MB 还是应该拆分并作为更小的内存块发送?

这两种方法有什么区别?如果我应该发送较小的内存,块大小应该是多少?

Can I send the 10MB in one shot

是的。

or should I split and send as chunks of smaller memory?

没有

What is the difference between those two approaches?

不同之处在于,在情况 1 中,您让 TCP 做出它擅长的所有决定,并利用它拥有的所有您没有的额外知识,关于路径 MTU、RTT、接收 window 在对等方,... 而在情况 2 中,您正在尝试为它完成 TCP 的工作。养狗自己叫。

If I should send as smaller memory what should be the chunk size?

尽可能大。

当您调用write() 函数时,您需要提供一个缓冲区和您要写入的字节数。但是,不能保证 OS 将 send/write 您愿意一次写入的所有字节。 (在阻塞套接字的情况下,write() 调用将阻塞,直到它将整个块复制到 TCP 缓冲区。但是在非阻塞的情况下,write() 将 return 而不会阻塞并将只写入它能够写入的字节)。

TCP/IP 堆栈 OS 中的 运行 和每个 OS 都有自己的堆栈实现。该堆栈将确定缓冲区大小,而且 TCP/IP 本身会处理所有低级统计信息,例如 MSS、可用接收器 window 大小,这将使 TCP 运行 流control,拥塞控制相关算法。

因此最好让 TCP 决定它希望如何发送您的数据。让 TCP 堆栈为您完成,而不是将数据分成块。

请注意始终检查 write() 调用 return 实际发送的字节数。