|
@@ -0,0 +1,93 @@
|
|
|
+## The waiting time for a node (assuming no overloaded nodes)
|
|
|
+## x: 1/bandwidth
|
|
|
+## q: selection probability
|
|
|
+## L: network load
|
|
|
+wait <- function(x,q,L) {
|
|
|
+ a <- q*L*x*x
|
|
|
+ b <- 2*(1-q*x*L)
|
|
|
+ return (x + a/b)
|
|
|
+}
|
|
|
+
|
|
|
+## The weighted wait time
|
|
|
+wwait <- function(x,q,L) {
|
|
|
+ return (q*wait(x,q,L))
|
|
|
+}
|
|
|
+
|
|
|
+## Average latency, returning NA for infinite
|
|
|
+netLatency <- function(x, q, L) {
|
|
|
+ if (any(x*q*L <0 | x*q*L >1)) {
|
|
|
+ return (NA)
|
|
|
+ } else {
|
|
|
+ return (sum(wwait(x, q, L)))
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+## Load in data files
|
|
|
+t1 <- read.table("opt_1e-6.pickle.dat", header=TRUE)
|
|
|
+t2 <- read.table("opt_1e-3.pickle.dat", header=TRUE)
|
|
|
+t3 <- read.table("opt_1e-1.pickle.dat", header=TRUE)
|
|
|
+t4 <- read.table("opt_0.75.pickle.dat", header=TRUE)
|
|
|
+t5 <- read.table("opt_0.5.pickle.dat", header=TRUE)
|
|
|
+t6 <- read.table("opt_0.25.pickle.dat", header=TRUE)
|
|
|
+t7 <- read.table("opt_0.1.pickle.dat", header=TRUE)
|
|
|
+tt <- read.table("opt_tor.pickle.dat", header=TRUE)
|
|
|
+
|
|
|
+## Node bandwidth and reciprocal
|
|
|
+bw <- t1$bw
|
|
|
+x <- 1/bw
|
|
|
+
|
|
|
+## Calculate network capcity
|
|
|
+capacity <- sum(bw)
|
|
|
+
|
|
|
+## Calculate selection probabilties that Tor uses
|
|
|
+torProb <- bw/sum(bw)
|
|
|
+
|
|
|
+## Load values to try
|
|
|
+varyLoad <- seq(0.01,0.93,0.01)
|
|
|
+latencyTor <- c()
|
|
|
+latency3 <- c()
|
|
|
+latency4 <- c()
|
|
|
+latency5 <- c()
|
|
|
+for (L in varyLoad) {
|
|
|
+ latencyTor <- append(latencyTor,
|
|
|
+ netLatency(x, torProb, capacity*L))
|
|
|
+ latency3 <- append(latency3,
|
|
|
+ netLatency(x, t3$prob, capacity*L))
|
|
|
+ latency4 <- append(latency4,
|
|
|
+ netLatency(x, t4$prob, capacity*L))
|
|
|
+ latency5 <- append(latency5,
|
|
|
+ netLatency(x, t5$prob, capacity*L))
|
|
|
+}
|
|
|
+
|
|
|
+## Output graph
|
|
|
+pdf("vary-network-load.pdf")
|
|
|
+
|
|
|
+## Set up axes
|
|
|
+yFac <- 1000
|
|
|
+xFac <- 100
|
|
|
+
|
|
|
+ylim <- range(na.omit(c(latencyTor, latency3, latency4, latency5)))
|
|
|
+ylim <- c(0,0.015) * yFac
|
|
|
+xlim <- c(0,1) * xFac
|
|
|
+plot(NA, NA,
|
|
|
+ xlim=xlim, ylim=ylim,
|
|
|
+ frame.plot=FALSE,
|
|
|
+ xlab = "Network load (%)",
|
|
|
+ ylab = "Average queuing delay (ms)",
|
|
|
+ main = "Latency for varying network loads")
|
|
|
+
|
|
|
+## Plot data
|
|
|
+col <- rainbow(8)
|
|
|
+lines(varyLoad*xFac, latency3*yFac, col=col[3])
|
|
|
+lines(varyLoad*xFac, latency4*yFac, col=col[4])
|
|
|
+lines(varyLoad*xFac, latency5*yFac, col=col[5])
|
|
|
+lines(varyLoad*xFac, latencyTor*yFac)
|
|
|
+
|
|
|
+## Plot points at which selection probabilities are optimal
|
|
|
+par(xpd=TRUE)
|
|
|
+points(c(0.9, 0.75, 0.5, 1)*xFac, rep(par("usr")[3], 4),
|
|
|
+ col=c(col[3:5], "black"), pch=20,
|
|
|
+ cex=2)
|
|
|
+
|
|
|
+## Close output device
|
|
|
+dev.off()
|