Uploaded image for project: 'MINA'
  1. MINA
  2. DIRMINA-561

Socket.setReceiveBufferSize() called after bind preventing correct TCP receive window scaling

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.1.0, 1.0.4, 1.1.1, 1.0.5, 1.1.2, 1.0.6, 1.1.3, 1.0.7, 1.1.4, 1.0.8, 1.1.5, 1.0.9, 1.1.6, 2.0.0-M1
    • Fix Version/s: 1.0.10, 1.1.7, 2.0.0-M2
    • Component/s: Transport
    • Labels:
      None
    • Environment:
      Head of the 1.1 branch

      Description

      Socket.setReceiveBufferSize() must be called before bind() on a ServerSocket in order to allow TCP receive window scaling up to the configured buffer size (http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#setReceiveBufferSize(int)). Currently, socket options are set after bind() is called. This results in the correct Java receive buffer size, but does not allow the TCP stack to scale receive windows above 64k. Severe performance degradation can occur on high-latency high-bandwidth connections.

      The following patch is a possible solution to this issue, though there may be a cleaner way to implement a fix within the framework.

      Best regards,
      Greg

      Index: core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
      ===================================================================
      — core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java (revision 642333)
      +++ core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java (working copy)
      @@ -163,6 +163,16 @@
      try {
      ch = SocketChannel.open();
      ch.socket().setReuseAddress(true);
      +
      + // Receive buffer size must be set BEFORE the socket is connected
      + // in order for the TCP window to be sized accordingly
      + if (config instanceof SocketConnectorConfig)

      { + SocketSessionConfig sessionConfig = + ((SocketConnectorConfig) config).getSessionConfig(); + ch.socket().setReceiveBufferSize( + sessionConfig.getReceiveBufferSize()); + }

      +
      if (localAddress != null)

      { ch.socket().bind(localAddress); }

        Attachments

          Activity

            People

            • Assignee:
              trustin Trustin Lee
              Reporter:
              gdhuse Greg Dhuse
            • Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: