2017-04-21 7 views
0

UDPクライアントとサーバーの間のRTT(Round Trip Time)を計算しようとすると、非常に直感的な結果が発生します。 20バイトのパケットサイズを使用する場合、RTTは4.0ミリ秒ですが、パケットサイズを15000バイトに増やすと、RTTは2.8ミリ秒になります。なぜこうなった?パケットサイズが増加するにつれてRTTが増加してはいけませんか?パケットサイズを増やすとRTTが減少する

ここにUDPサーバーのコードを示します。私はこれを実行するjava RTTServer 8080です。

public class RTTServer { 
    final static int BUFSIZE = 1024, COUNT=100000; 

    public static void main(String args[]) { 
     long start=Integer.MAX_VALUE; 
     byte[] bufferRecieve = new byte[BUFSIZE];   
     DatagramPacket recievePacket = new DatagramPacket(bufferRecieve, BUFSIZE); 

     for (;;) 
     try (DatagramSocket aSocket = new DatagramSocket(Integer.parseInt(args[0]));) { 
      aSocket.receive(recievePacket); 
      DatagramPacket sendPacket = new DatagramPacket(recievePacket.getData(), recievePacket.getLength(), recievePacket.getAddress(), recievePacket.getPort()); 
      aSocket.send(sendPacket); 
     } catch (Exception e) {    
      System.out.println("Socket: " + e.getMessage());    
     } 
    } 
} 

ここでは、UDPクライアントのコードを示します。私はこれをjava RTTClient 192.168.1.20 8080 15000として実行します。

public class RTTClient { 
    final static int BUFSIZE = 1024; 
    final static int COUNT = 1000; 

    public static void main(String args[]) throws UnknownHostException { 
     InetAddress aHost = InetAddress.getByName(args[0]);    
     byte[] dataArray = args[2].getBytes(); 
     byte[] bufferReceive = new byte[BUFSIZE]; 
     DatagramPacket requestPacket = new DatagramPacket(
       dataArray, dataArray.length, aHost, Integer.parseInt(args[1])); 

     DatagramPacket responsePacket = new DatagramPacket(bufferReceive,BUFSIZE); 

     long rtts = 0; 

     for (int i =0 ; i < COUNT; i++){ 
      try (DatagramSocket aSocket = new DatagramSocket();) { 

      long start = System.currentTimeMillis();  
      aSocket.send(requestPacket); 
      aSocket.receive(responsePacket); 
      System.out.println(i); 
      rtts += System.currentTimeMillis() - start; 
      } catch (Exception e) { 
       System.out.println("Socket: " + e.getMessage()); 
      } 
     } 
     System.out.println("RTT = "+(double)rtts/(double)COUNT);  
    } 
} 

答えて

0

あなたが測定しているのは、クライアント側のOSにUDPパケットの送信をどの程度速く要求できるかです。あなたはサーバーがそれを受け取る速さを測定していません...まったくそれを受け取っている場合は実際に測定していません。

私が考えているのは、クライアント側でパケットサイズを増やすと、(カーネル内の)クライアント側のUDPスタックを圧倒しているということです。 OSは、パケットの大部分を(サイレントに)ドロップしています。送信するよりも速く処理できます。

受信しているパケットの数を測定することによって、この理論をサポートする(またはしない)証拠を得ることができます。

これに影響する可能性のあるその他の問題は、単一のIPパケットに対して大きすぎるUDPメッセージが複数のパケットに分割されて再構成されることです。パケットの損失により再アセンブリが失敗し、ICMP "Time Exceeded"メッセージが送信者に送信されます。これにより予期しないことが発生する可能性があります...

関連する問題