|
Alan Kaminsky
|
|
•
|
|
Department of Computer Science
|
|
•
|
|
Rochester Institute of Technology
|
|
•
|
|
4486 +
2220 =
6706
|
|
Home Page
|
Simulation Simplified
17. A DOS Attack
Class WebServer02
import edu.rit.numeric.ExponentialPrng;
import edu.rit.numeric.ListSeries;
import edu.rit.numeric.ListXYSeries;
import edu.rit.numeric.Series;
import edu.rit.numeric.plot.Plot;
import edu.rit.sim.Event;
import edu.rit.sim.Simulation;
import edu.rit.util.Random;
import java.util.LinkedList;
public class WebServer02
{
private static double lambda_L;
private static double lambda_U;
private static double lambda_D;
private static double mu;
private static int Q;
private static int R;
private static long seed;
private static ListXYSeries meanWaitTimeVsLambda;
private static ListXYSeries dropFractionVsLambda;
private static Random prng;
private static ExponentialPrng requestPrng;
private static ExponentialPrng serverPrng;
private static LinkedList<Request> requestQueue;
private static int requestCount;
private static int dropCount;
private static ListSeries waitTime;
private static Simulation sim;
public static void main
(String[] args)
{
if (args.length != 7) usage();
lambda_L = Double.parseDouble (args[0]);
lambda_U = Double.parseDouble (args[1]);
lambda_D = Double.parseDouble (args[2]);
mu = Double.parseDouble (args[3]);
Q = Integer.parseInt (args[4]);
R = Integer.parseInt (args[5]);
seed = Long.parseLong (args[6]);
meanWaitTimeVsLambda = new ListXYSeries();
dropFractionVsLambda = new ListXYSeries();
prng = Random.getInstance (seed);
System.out.printf
("Mu = %.3f, Q = %d, R = %d, seed = %d%n",
mu, Q, R, seed);
System.out.printf (" --Wait time--- Drop%n");
System.out.printf ("Lambda Mean Stddev Fraction%n");
double lambda;
for (int r = 0;
(lambda = lambda_L + r*lambda_D) <= lambda_U;
++ r)
{
requestPrng = new ExponentialPrng (prng, lambda);
serverPrng = new ExponentialPrng (prng, mu);
requestQueue = new LinkedList<Request>();
requestCount = 0;
dropCount = 0;
waitTime = new ListSeries();
sim = new Simulation();
generateRequest();
sim.run();
Series.Stats wt = waitTime.stats();
double df = ((double) dropCount)/((double) R);
meanWaitTimeVsLambda.add (lambda, wt.mean);
dropFractionVsLambda.add (lambda, df);
System.out.printf ("%-8.3f%-8.3f%-8.3f%-8.3f%n",
lambda, wt.mean, wt.stddev, df);
}
new Plot()
.plotTitle
("WebServer02, \u03BC="+mu+", Q="+Q+", R="+R)
.xAxisTitle ("Mean arrival rate \u03BB")
.yAxisTitle ("Mean wait time")
.xySeries (meanWaitTimeVsLambda)
.getFrame()
.setVisible (true);
new Plot()
.plotTitle
("WebServer02, \u03BC="+mu+", Q="+Q+", R="+R)
.xAxisTitle ("Mean arrival rate \u03BB")
.yAxisTitle ("Drop fraction")
.xySeries (dropFractionVsLambda)
.getFrame()
.setVisible (true);
}
private static class Request
{
private double startTime;
public Request()
{
startTime = sim.time();
}
public double waitTime()
{
return sim.time() - startTime;
}
}
private static void generateRequest()
{
addToQueue (new Request());
if (++ requestCount < R)
{
sim.doAfter (requestPrng.next(), new Event()
{
public void perform() { generateRequest(); }
});
}
}
private static void addToQueue
(Request request)
{
if (requestQueue.size() < Q)
{
requestQueue.add (request);
if (requestQueue.size() == 1) startServing();
}
else
{
++ dropCount;
}
}
private static void startServing()
{
sim.doAfter (serverPrng.next(), new Event()
{
public void perform() { removeFromQueue(); }
});
}
private static void removeFromQueue()
{
waitTime.add (requestQueue.removeFirst().waitTime());
if (requestQueue.size() > 0) startServing();
}
private static void usage()
{
System.err.println
("Usage: java WebServer02 <lambda_L> <lambda_U> "+
"<lambda_D> <mu> <Q> <R> <seed>");
System.exit (1);
}
}
|
Alan Kaminsky
|
|
•
|
|
Department of Computer Science
|
|
•
|
|
Rochester Institute of Technology
|
|
•
|
|
4486 +
2220 =
6706
|
|
Home Page
|
Copyright © 2011 Alan Kaminsky.
All rights reserved.
Last updated 31-Aug-2011.
Please send comments to ark@cs.rit.edu.