在应用程序级别,比如说使用 java,我有多少需要担心实际的 TCP 数据包大小?因此,例如,我正在尝试编写一个应该通过 TCP 套接字的输出流发送数据的应用程序,我是否必须始终考虑写入流的数据的大小?由于 java 套接字是流式套接字,我实际上没有考虑数据单元的大小,但是 TSO(TCP 分段卸载)为 OS/NIC “打开”,然后我可以将 64KB 数据片或 MSS 写入输出流和因此尽量节省宝贵的 CPU 时间,将数据切片到小于 1500 字节 (< MTU)。就能够动态处理这一点而言,我的编程有多有效?我知道我们可以让 NetworkInterface.getMTU() 来确定 OS/NIC MTU 大小,但不确定它如何帮助。所以,
2 回答
我有多少需要担心实际的 TCP 数据包大小?
几乎从不。你可以 setNoTcpDelay(true); 但这很少有所作为。
因此,例如,我正在尝试编写一个应该通过 TCP 套接字的输出流发送数据的应用程序,我是否必须始终考虑写入流的数据的大小?
我对此表示怀疑。如果您的连接速度为 1 Gb 或更慢,您将无法编写一个效率低下无法使用此带宽的程序。
由于 java 套接字是流式套接字,我实际上没有考虑数据单元的大小,但是 TSO(TCP 分段卸载)为 OS/NIC “打开”,然后我可以将 64KB 数据片或 MSS 写入输出流和因此尽量节省宝贵的 CPU 时间,将数据切片到小于 1500 字节 (< MTU)。
我不明白如何让最体面的网络适配器支持 TCP 卸载。
就能够动态处理这一点而言,我的编程有多有效?
Java 无论如何都不支持它。
我知道我们可以让 NetworkInterface.getMTU() 来确定 OS/NIC MTU 大小,但不确定它如何帮助。
我也不。
所以,我可以说,总的来说,我对如何最大化我的字节写入输出流的吞吐量有点困惑。
您可以在 Java 中做出的最重要的更改是使用 NIO。我建议阻止 NIO,因为这是 NIO 最简单的变化。如果您使用直接 ByteBuffers,这可以将冗余内存副本从 Java 保存到本机内存。
您知道您在使用网络的最大带宽时遇到问题吗?如果你没有测量这是你的问题的原因,那只是一个猜测。
TCP 缓冲区、步调、在幕后为您决定段大小等。除了尽可能快地写入以及在发送方使用大型套接字发送缓冲区和在接收方使用大型套接字接收缓冲区之外,您无能为力。