我有一台设备可以非常快速地向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会减慢通信速度。
我不明白为什么会变满,因为我总是读缓冲区?
答案 0 :(得分:0)
一种可能的解释是Java应用程序无法跟上。换句话说,它无法在设备发送数据时快速处理数据。如果这是问题,您必须提出一个解决方案,让应用程序更快地处理数据。
如果你有多个核心,你可以通过重构Java应用程序来使用一个线程从套接字读取数据,以及另一个线程(或多个线程)来进行处理,从而提高吞吐量。
另一个解决方案可能只是分析Java应用程序以查看是否存在调优优化的余地。
最后,您可以通过为BufferedReader
使用更大的缓冲区大小来提高吞吐量。