| 
					
				 | 
			
			
				@@ -42,31 +42,25 @@ Status: Open 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   slices of 50 nodes each, grouped according to advertised node bandwidth. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   Two hop circuits are built using nodes from the same slice, and a large 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  file is downloaded via these circuits. For nodes in the first 15% of the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  network, a 500K file will be used. For nodes in the next 15%, a 250K file 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  will be used. For nodes in next 15%, a 100K file will be used. The  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  remainder of the nodes will fetch a 75K file.[1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  file is downloaded via these circuits. The file sizes are set based 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  on node percentile rank as follows: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     0-10: 2M 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     10-20: 1M 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     20-30: 512k 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     30-50: 256k 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     50-100: 128k 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  This process is repeated 250 times, and average stream capacities are  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  assigned to each node from these results.  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  In the future, a node generator type can be created to ensure that 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  each node is chosen to participate in an equal number of circuits, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  and the selection will continue until every live node is chosen 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  to participate in at least 7 circuits. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  These sizes are based on measurements performed during test scans. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-4. Ratio Calculation Options 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  This process is repeated until each node has been chosen to participate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  in at least 5 circuits. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  There are two options for deriving the ratios themselves. They can 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  be obtained by dividing each nodes' average stream capacity by 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  either the average for the slice, or the average for the network as a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  whole. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  Dividing by the network-wide average has the advantage that it will 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  account for issues related to unbalancing between higher vs lower 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  capacity, such as Steven Murdoch's queuing theory weighting result. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  For this reason, we will opt for network-wide averages. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+4. Ratio Calculation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  The ratios are calculated by dividing each measured value by the  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  network-wide average. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 5. Ratio Filtering 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -77,10 +71,8 @@ Status: Open 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   with capacity of one standard deviation below a node's average 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   are also removed. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  The final ratio result will be calculated as the maximum of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  these two resulting ratios if both are less than 1.0, the minimum 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if both are greater than 1.0, and the mean if one is greater 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  and one is less than 1.0. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  The final ratio result will be greater of the unfiltered ratio 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  and the filtered ratio. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 6. Pseudocode for Ratio Calculation Algorithm 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -95,11 +87,8 @@ Status: Open 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         BW_measured(N) = MEAN(b | b is bandwidth of a stream through N) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Bw_stddev(N) = STDDEV(b | b is bandwidth of a stream through N) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       Bw_avg(S) = MEAN(b | b = BW_measured(N) for all N in S)   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      Normal_Routers(S) = {N | Bw_measured(N)/Bw_avg(S) > 0.5 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       for N in S: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Normal_Streams(N) = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          {stream via N | all nodes in stream not in {Normal_Routers(S)-N} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                          and bandwidth > BW_measured(N)-Bw_stddev(N)}  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Normal_Streams(N) = {stream via N | bandwidth >= BW_measured(N)}  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         BW_Norm_measured(N) =  MEAN(b | b is a bandwidth of Normal_Streams(N)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     Bw_net_avg(Slices) = MEAN(BW_measured(N) for all N in Slices) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -107,14 +96,9 @@ Status: Open 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for N in all Slices: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       Bw_net_ratio(N) = Bw_measured(N)/Bw_net_avg(Slices) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      Bw_Norm_net_ratio(N) = Bw_measured2(N)/Bw_Norm_net_avg(Slices) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Bw_Norm_net_ratio(N) = BW_Norm_measured(N)/Bw_Norm_net_avg(Slices) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if Bw_net_ratio(N) < 1.0 and Bw_Norm_net_ratio(N) < 1.0: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ResultRatio(N) = MAX(Bw_net_ratio(N), Bw_Norm_net_ratio(N)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      else if Bw_net_ratio(N) > 1.0 and Bw_Norm_net_ratio(N) > 1.0: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ResultRatio(N) = MIN(Bw_net_ratio(N), Bw_Norm_net_ratio(N)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      else:  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ResultRatio(N) = MEAN(Bw_net_ratio(N), Bw_Norm_net_ratio(N)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      ResultRatio(N) = MAX(Bw_net_ratio(N), Bw_Norm_net_ratio(N)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 7. Security implications 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -126,14 +110,14 @@ Status: Open 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   This scheme will not address nodes that try to game the system by 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   providing better service to scanners. The scanners can be detected 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  at the entry by IP address, and at the exit by the destination fetch. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  at the entry by IP address, and at the exit by the destination fetch 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  IP. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   Measures can be taken to obfuscate and separate the scanners' source 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   IP address from the directory authority IP address. For instance, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   scans can happen offsite and the results can be rsynced into the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  authorities.  The destination fetch can also be obscured by using SSL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  and periodically changing the large document that is fetched. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  authorities. The destination server IP can also change. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   Neither of these methods are foolproof, but such nodes can already 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   lie about their bandwidth to attract more traffic, so this solution 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   does not set us back any in that regard. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -148,14 +132,14 @@ Status: Open 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   over a portion of the network, outputting files of the form: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    node_id=<idhex> SP strm_bw=<BW_measured(N)> SP  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            filt_bw=<BW_Norm_measured(N)> NL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         filt_bw=<BW_Norm_measured(N)> ns_bw=<CurrentConsensusBw(N)> NL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   The most recent file from each scanner will be periodically gathered  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   by another script that uses them to produce network-wide averages  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   and calculate ratios as per the algorithm in section 6. Because nodes  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   may shift in capacity, they may appear in more than one slice and/or  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  appear more than once in the file set. The line that yields a ratio  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  closest to 1.0 will be chosen in this case. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  appear more than once in the file set. The most recently measured 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  line will be chosen in this case. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 9. Integration with Proposal 160 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -166,10 +150,15 @@ Status: Open 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   scan, and taking the weighted average with the previous consensus 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   bandwidth: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     Bw_new = (Bw_current * Alpha + Bw_scan_avg*Bw_ratio)/(Alpha + 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     Bw_new = Round((Bw_current * Alpha + Bw_scan_avg*Bw_ratio)/(Alpha + 1)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   The Alpha parameter is a smoothing parameter intended to prevent 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  rapid oscillation between loaded and unloaded conditions.  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rapid oscillation between loaded and unloaded conditions. It is 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  currently fixed at 0.333. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  The Round() step consists of rounding to the 3 most significant figures 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  in base10, and then rounding that result to the nearest 1000, with  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  a minimum value of 1000. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   This will produce a new bandwidth value that will be output into a  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   file consisting of lines of the form: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -183,6 +172,3 @@ Status: Open 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   This file can be either copied or rsynced into a directory readable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   by the directory authority. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-1. Exact values for each segment are still being determined via  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-test scans. 
			 |