增加数据包大小时RTT减少

时间:2017-04-21 16:24:15

标签: java sockets udp datagram

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

1 个答案:

答案 0 :(得分:0)

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

我怀疑发生的是,当你在客户端增加数据包大小时,你实际上压倒了客户端UDP堆栈(在内核中)。操作系统正在丢弃大部分数据包(静默),它可以比接受它们传输更快。

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

可能影响此问题的另一个问题是,对于单个IP数据包而言太大的UDP消息将被拆分为多个数据包,然后重新组合。数据包丢失导致重组失败,导致ICMP&#34; Time Exceeded&#34;邮件被发送给发件人。这可能会导致它做出意想不到的事情......