| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | 
							- Filename: 151-path-selection-improvements.txt
 
- Title: Improving Tor Path Selection
 
- Author: Fallon Chen, Mike Perry
 
- Created: 5-Jul-2008
 
- Status: Implemented
 
- Overview
 
-   The performance of paths selected can be improved by adjusting the
 
-   CircuitBuildTimeout and avoiding failing guard nodes. This proposal
 
-   describes a method of tracking buildtime statistics at the client, and
 
-   using those statistics to adjust the CircuitBuildTimeout.
 
- Motivation
 
-   Tor's performance can be improved by excluding those circuits that
 
-   have long buildtimes (and by extension, high latency). For those Tor
 
-   users who require better performance and have lower requirements for
 
-   anonymity, this would be a very useful option to have.
 
- Implementation
 
-   Gathering Build Times
 
-     Circuit build times are stored in the circular array
 
-     'circuit_build_times' consisting of uint32_t elements as milliseconds.
 
-     The total size of this array is based on the number of circuits
 
-     it takes to converge on a good fit of the long term distribution of
 
-     the circuit builds for a fixed link. We do not want this value to be
 
-     too large, because it will make it difficult for clients to adapt to
 
-     moving between different links.
 
-     From our observations, the minimum value for a reasonable fit appears
 
-     to be on the order of 500 (MIN_CIRCUITS_TO_OBSERVE). However, to keep
 
-     a good fit over the long term, we store 5000 most recent circuits in
 
-     the array (NCIRCUITS_TO_OBSERVE).
 
-     The Tor client will build test circuits at a rate of one per
 
-     minute (BUILD_TIMES_TEST_FREQUENCY) up to the point of
 
-     MIN_CIRCUITS_TO_OBSERVE. This allows a fresh Tor to have
 
-     a CircuitBuildTimeout estimated within 8 hours after install,
 
-     upgrade, or network change (see below).
 
-   Long Term Storage
 
-     The long-term storage representation is implemented by storing a
 
-     histogram with BUILDTIME_BIN_WIDTH millisecond buckets (default 50) when
 
-     writing out the statistics to disk. The format this takes in the
 
-     state file is 'CircuitBuildTime <bin-ms> <count>', with the total
 
-     specified as 'TotalBuildTimes <total>'
 
-     Example:
 
-     TotalBuildTimes 100
 
-     CircuitBuildTimeBin 25 50
 
-     CircuitBuildTimeBin 75 25
 
-     CircuitBuildTimeBin 125 13
 
-     ...
 
-     Reading the histogram in will entail inserting <count> values
 
-     into the circuit_build_times array each with the value of
 
-     <bin-ms> milliseconds. In order to evenly distribute the values
 
-     in the circular array, the Fisher-Yates shuffle will be performed
 
-     after reading values from the bins.
 
-   Learning the CircuitBuildTimeout
 
-     Based on studies of build times, we found that the distribution of
 
-     circuit buildtimes appears to be a Frechet distribution. However,
 
-     estimators and quantile functions of the Frechet distribution are
 
-     difficult to work with and slow to converge. So instead, since we
 
-     are only interested in the accuracy of the tail, we approximate
 
-     the tail of the distribution with a Pareto curve starting at
 
-     the mode of the circuit build time sample set.
 
-     We will calculate the parameters for a Pareto distribution
 
-     fitting the data using the estimators at
 
-     http://en.wikipedia.org/wiki/Pareto_distribution#Parameter_estimation.
 
-     The timeout itself is calculated by using the Quartile function (the
 
-     inverted CDF) to give us the value on the CDF such that
 
-     BUILDTIME_PERCENT_CUTOFF (80%) of the mass of the distribution is
 
-     below the timeout value.
 
-     Thus, we expect that the Tor client will accept the fastest 80% of
 
-     the total number of paths on the network.
 
-   Detecting Changing Network Conditions
 
-     We attempt to detect both network connectivity loss and drastic
 
-     changes in the timeout characteristics.
 
-     We assume that we've had network connectivity loss if 3 circuits
 
-     timeout and we've received no cells or TLS handshakes since those
 
-     circuits began. We then set the timeout to 60 seconds and stop
 
-     counting timeouts.
 
-     If 3 more circuits timeout and the network still has not been
 
-     live within this new 60 second timeout window, we then discard
 
-     the previous timeouts during this period from our history.
 
-     To detect changing network conditions, we keep a history of
 
-     the timeout or non-timeout status of the past RECENT_CIRCUITS (20)
 
-     that successfully completed at least one hop. If more than 75%
 
-     of these circuits timeout, we discard all buildtimes history,
 
-     reset the timeout to 60, and then begin recomputing the timeout.
 
-   Testing
 
-     After circuit build times, storage, and learning are implemented,
 
-     the resulting histogram should be checked for consistency by
 
-     verifying it persists across successive Tor invocations where
 
-     no circuits are built. In addition, we can also use the existing
 
-     buildtime scripts to record build times, and verify that the histogram
 
-     the python produces matches that which is output to the state file in Tor,
 
-     and verify that the Pareto parameters and cutoff points also match.
 
-     We will also verify that there are no unexpected large deviations from
 
-     node selection, such as nodes from distant geographical locations being
 
-     completely excluded.
 
-   Dealing with Timeouts
 
-     Timeouts should be counted as the expectation of the region of
 
-     of the Pareto distribution beyond the cutoff. This is done by
 
-     generating a random sample for each timeout at points on the
 
-     curve beyond the current timeout cutoff.
 
-   Future Work
 
-     At some point, it may be desirable to change the cutoff from a
 
-     single hard cutoff that destroys the circuit to a soft cutoff and
 
-     a hard cutoff, where the soft cutoff merely triggers the building
 
-     of a new circuit, and the hard cutoff triggers destruction of the
 
-     circuit.
 
-     It may also be beneficial to learn separate timeouts for each
 
-     guard node, as they will have slightly different distributions.
 
-     This will take longer to generate initial values though.
 
- Issues
 
-   Impact on anonymity
 
-     Since this follows a Pareto distribution, large reductions on the
 
-     timeout can be achieved without cutting off a great number of the
 
-     total paths. This will eliminate a great deal of the performance
 
-     variation of Tor usage.
 
 
  |