在尝试计算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);
}
}
答案 0 :(得分:0)
您测量的是您可以请求客户端操作系统发送UDP数据包的速度。您没有测量服务器接收它们的速度......或者实际上,如果它正在接收它们。
我怀疑发生的是,当你在客户端增加数据包大小时,你实际上压倒了客户端UDP堆栈(在内核中)。操作系统正在丢弃大部分数据包(静默),它可以比接受它们传输更快。
您可以通过测量接收的数据包来获得一些支持(或不支持)此理论的证据。
可能影响此问题的另一个问题是,对于单个IP数据包而言太大的UDP消息将被拆分为多个数据包,然后重新组合。数据包丢失导致重组失败,导致ICMP&#34; Time Exceeded&#34;邮件被发送给发件人。这可能会导致它做出意想不到的事情......