配置套接字以在Java中使用小包

时间:2009-03-16 10:01:31

标签: java sockets packet latency

我正在处理通过非常慢的网络连接路由到我的时间关键消息。我使用Java TCP / IP套接字连接到原始服务器(我无法控制)。数据长度不一样,但通常大约为5000字节,因此最终会分成大约1400字节的多个数据包。

我的Java客户端代码中是否有任何方法可以控制用于向我发送数据的数据包的大小?我想尝试明确地使用较小的数据包大小,例如500字节数据包,这将减少我以增加报头开销(可能)成本接收消息的第一个字节所花费的时间。

4 个答案:

答案 0 :(得分:2)

如果您无法控制或更改服务器,我认为您无法从客户端控制此操作。我怀疑服务器正在将数据打包到一个1500字节的以太网帧中(有关详细信息,请参阅here)并尝试优化其向您提供的数据。

这1500字节称为MTU。你可能可能会在操作系统层玩这个,但我怀疑它会给你带来的只是悲伤。

答案 1 :(得分:1)

您可以在较少的字节数后尝试flushing SocketOutputStreams应该创建更小的数据包 - 因为它依赖于系统 - 它将无法保证。

答案 2 :(得分:1)

我们发现解决初始读取延迟的一种方法是在客户端请求中的TCP / IP头中设置PUSH或URG标志。据我所知,标准的Java套接字库不允许你这样做,但是有一个库:

http://www.savarese.org/software/vserv-tcpip/

显然是这样。

免责声明:这是方式回来的时候(我认为是Java 1.1.8),我们只在Windows上使用它,我怀疑它也是一种黑客攻击所以它可能不再起作用。而且我还没有使用Savarese库,所以无法保证它。

答案 3 :(得分:0)

如果要减少接收第一个数据的时间,请尝试设置Socket.setTcpNoDelay(true); setTcpNoDelay