应用程序级别的TCP数据包大小以获得最大吞吐量

时间:2013-10-02 14:39:06

标签: java c++ sockets tcp

在应用程序级别,比如使用java,我有多担心实际的TCP数据包大小?因此,例如,我正在尝试编写一个应该通过TCP套接字输出流发送数据的应用程序,是否必须始终考虑写入流的数据大小?由于java套接字是流套接字,我实际上并没有考虑数据单元的大小,但是TSO(TCP分段卸载)为OS / NIC“打开”,然后我可以将64KB数据切片或MSS写入输出流,因此,尝试将切片数据的宝贵CPU时间节省到小于1500字节(

2 个答案:

答案 0 :(得分:2)

  

我需要担心实际的TCP数据包大小?

几乎没有。你可以setNoTcpDelay(true);但这很少有所作为。

  

因此,例如,我正在尝试编写一个应该通过TCP套接字输出流发送数据的应用程序,是否必须始终考虑写入流的数据大小?

我对此表示怀疑。如果你有一个1 Gb连接或更慢,你将无法编写一个程序,因此效率低下它无法使用这个带宽。

  

由于java套接字是流套接字,我实际上并没有考虑数据单元的大小,但TSO(TCP分段卸载)是为OS / NIC“打开”,然后我可以写一个64KB的数据切片或MSS到输出流因此尝试将切片数据的宝贵CPU时间节省到小于1500字节(

我不知道如何让最合适的网络适配器支持TCP卸载。

  

在能够动态处理这个问题方面,我的编程效果如何?

Java无论如何都不支持它。

  

我知道我们可以通过NetworkInterface.getMTU()来确定OS / NIC的MTU大小,但不确定它是如何帮助的。

我也不是。

  

所以,总的来说,我对如何最大化输出流的字节写入吞吐量感到困惑。

您可以在Java中进行的最重要的更改是使用NIO。我建议阻止NIO,因为这是NIO最简单的改变。如果使用直接ByteBuffers,这可以将冗余内存副本从Java保存到本机内存。

您是否知道使用网络的最大带宽时遇到问题?如果您没有测量到这是问题的原因,那只是猜测。

答案 1 :(得分:0)

TCP缓冲,步调,为您在幕后决定分段大小等。除了尽可能快地写入,并且在发送器处使用大型套接字发送缓冲区和在接收器处使用大型套接字接收缓冲区时,您无法做任何事情来帮助。