【问题标题】:TCP receive windows size always fullTCP 接收窗口大小总是满的
【发布时间】:2012-04-19 13:43:02
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java tcp


    【解决方案1】:

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

    如果您有多个内核,则可以通过重构 Java 应用程序以使用一个线程从套接字读取数据并使用另一个线程(或多个线程)进行处理来获得更好的思想。

    另一种解决方案可能只是分析 Java 应用程序,看看是否有调整优化的空间。

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

    【讨论】:

    • 问题是我在收到一个数据包后绘制了一个图形,并且由于绘制过程可能窗口没有足够的时间来释放缓冲区。现在,我跳过了绘图功能并且工作正常。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2016-09-05
    • 1970-01-01
    相关资源
    最近更新 更多