TCP接收窗口大小始终为满

时间:2012-04-18 12:13:10

标签: java tcp

我有一台设备可以非常快速地向Windows XP操作系统发送1440byte有效载荷的TCP数据包。我将TcpAckFrequency设置为0,即在收到包后立即发送ACK。 我写了一个Java应用程序,它在一个线程中读取套接字:

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
in.read(charArray, 0, 720);

我的问题是,在收到一些(50-60)数据包之后,Windows缓冲区会变满,然后发送DUP ACK会减慢通信速度。

我不明白为什么会变满,因为我总是读缓冲区?

1 个答案:

答案 0 :(得分:0)

一种可能的解释是Java应用程序无法跟上。换句话说,它无法在设备发送数据时快速处理数据。如果这是问题,您必须提出一个解决方案,让应用程序更快地处理数据。

如果你有多个核心,你可以通过重构Java应用程序来使用一个线程从套接字读取数据,以及另一个线程(或多个线程)来进行处理,从而提高吞吐量。

另一个解决方案可能只是分析Java应用程序以查看是否存在调优优化的余地。

最后,您可以通过为BufferedReader使用更大的缓冲区大小来提高吞吐量。