2017-04-21 46 views
0

尝试计算UDP客户端和服务器之间的RTT(往返时间)时,我遇到了一个非常不直观的结果。当我使用20字节的数据包大小时,RTT是4.0 ms,但是当我将数据包大小增加到15000字节时,RTT为2.8 ms。这是为什么发生?随着数据包大小的增加,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

你测量的是你可以以多快的速度请求客户端操作系统发送UDP数据包。你没有测量服务器接收它们的速度......或者确实如果它正在接收它们。

我怀疑会发生的是,当你在客户端调整数据包的大小时,实际上压倒了客户端UDP堆栈(在内核中)。操作系统正在丢弃很大一部分数据包(无声地),它可以做得比接收它们更快。

您可以通过测量正在接收的数据包得到一些证据来支持(或不支持)该理论。

可能会影响到这一点的另一个问题是,对于单个IP数据包来说太大的UDP消息将被拆分为多个数据包,然后重新组合。数据包丢失导致重组失败,导致ICMP“超时”消息被发送给发件人。这可能会导致它做一些意想不到的事情...