|
@@ -13,9 +13,7 @@ streams to circuits. Other implementations MAY take other approaches, but
|
|
|
implementors should be aware of the anonymity and load-balancing implications
|
|
|
of their choices.
|
|
|
|
|
|
- THIS SPEC ISN'T DONE OR CORRECT.
|
|
|
-I'm just copying in relevant info so far. The starred points are things we
|
|
|
-should cover, but not an exhaustive list. -NM
|
|
|
+ THIS SPEC ISN'T DONE OR CORRECT YET.
|
|
|
|
|
|
1. General operation
|
|
|
|
|
@@ -28,8 +26,8 @@ should cover, but not an exhaustive list. -NM
|
|
|
|
|
|
When a client application creates a new stream (by opening a SOCKS
|
|
|
connection or launching a resolve request), we attach it to an appropriate
|
|
|
- open circuit if one exists, or wait if one is in-progress. We launch
|
|
|
- a new circuit only
|
|
|
+ open circuit if one exists, or wait if an appropriate circuit is
|
|
|
+ in-progress. We launch a new circuit only
|
|
|
if no current circuit can handle the request. We rotate circuits over
|
|
|
time to avoid some profiling attacks.
|
|
|
|
|
@@ -42,28 +40,26 @@ should cover, but not an exhaustive list. -NM
|
|
|
|
|
|
This document describes Tor's automatic path selection logic only; path
|
|
|
selection can be overridden by a controller (with the EXTENDCIRCUIT and
|
|
|
- ATTACHSTREAM commands). Paths constructed through these means will
|
|
|
+ ATTACHSTREAM commands). Paths constructed through these means may
|
|
|
violate some constraints given below.
|
|
|
|
|
|
-1b. Types of circuits.
|
|
|
-
|
|
|
-* Stable / Ordinary
|
|
|
-* Internal / Exit
|
|
|
-
|
|
|
- XXXX
|
|
|
-
|
|
|
-1c. Terminology
|
|
|
+1b. Terminology
|
|
|
|
|
|
A "path" is an ordered sequence of nodes, not yet built as a circuit.
|
|
|
|
|
|
A "clean" circuit is one that has not yet been used for any traffic.
|
|
|
|
|
|
- A "fast" or "stable" node is one that we believe to have the 'Fast' or
|
|
|
- 'Stable' flag set on the basis of our current directory information. A
|
|
|
- "fast" or "stable" circuit is one consisting only of "fast" or "stable"
|
|
|
- nodes.
|
|
|
+ A "fast" or "stable" node is one that has the 'Fast' or 'Stable' flag
|
|
|
+ set respectively, based on our current directory information. A "fast"
|
|
|
+ or "stable" circuit is one consisting only of "fast" or "stable" nodes.
|
|
|
+
|
|
|
+ In an "exit" circuit, the final node is chosen based on waiting stream
|
|
|
+ requests if any, and in any case it avoids nodes with exit policy of
|
|
|
+ "reject *:*". An "internal" circuit, on the other hand, is one where
|
|
|
+ the final node is chosen just like a middle node (ignoring its exit
|
|
|
+ policy).
|
|
|
|
|
|
- A "request" is a client-side connection or DNS resolve that needs to be
|
|
|
+ A "request" is a client-side stream or DNS resolve that needs to be
|
|
|
served by a circuit.
|
|
|
|
|
|
A "pending" circuit is one that we have started to build, but which has
|
|
@@ -79,32 +75,44 @@ should cover, but not an exhaustive list. -NM
|
|
|
|
|
|
2.1. When we build.
|
|
|
|
|
|
-2.1.1. When clients build circuits
|
|
|
-
|
|
|
- When running as a client, Tor tries to maintain at least 3 clean circuits,
|
|
|
- so that new streams can be handled quickly. To increase the likelihood of
|
|
|
- success, Tor tries to predict what exit nodes will be useful by choosing
|
|
|
- from among nodes that support the ports we have used in the recent past.
|
|
|
- (see 2.4). [XXXX describe in detail how predicted ports work.]
|
|
|
+2.1.1. Clients build circuits preemptively
|
|
|
+
|
|
|
+ When running as a client, Tor tries to maintain at least a certain
|
|
|
+ number of clean circuits, so that new streams can be handled
|
|
|
+ quickly. To increase the likelihood of success, Tor tries to
|
|
|
+ predict what circuits will be useful by choosing from among nodes
|
|
|
+ that support the ports we have used in the recent past (by default
|
|
|
+ one hour). Specifically, on startup Tor tries to maintain one clean
|
|
|
+ fast exit circuit that allows connections to port 80, and at least
|
|
|
+ two internal circuits in case we get a resolve request or hidden
|
|
|
+ service request (at least three internal circuits if we _run_ a
|
|
|
+ hidden service).
|
|
|
+
|
|
|
+ After that, Tor will adapt the circuits that it preemptively builds
|
|
|
+ based on the requests it sees from the user: it tries to have a clean
|
|
|
+ fast exit circuit available for every port seen recently (one circuit
|
|
|
+ is adequate for several ports or even all of them), and it tries to
|
|
|
+ have the above internal circuits available if we've seen resolves
|
|
|
+ or hidden service activity recently. Lastly, note that if there are
|
|
|
+ no requests from the user for an hour, Tor will predict no use and
|
|
|
+ build no preemptive circuits.
|
|
|
+
|
|
|
+ The Tor client SHOULD NOT store its list of predicted requests to a
|
|
|
+ persistent medium.
|
|
|
+
|
|
|
+2.1.2. Clients build circuits on demand
|
|
|
|
|
|
Additionally, when a client request exists that no circuit (built or
|
|
|
- pending) might support, we cannibalize an existing circuit (2.1.4) or
|
|
|
- create a new circuit to support the request. We do so by picking a
|
|
|
- request arbitrarily, building or cannibalizing a circuit to support it, and
|
|
|
- repeating until every unattached request might be supported by a pending
|
|
|
- or built circuit.
|
|
|
-
|
|
|
- XXXX when long idle, we build nothing.
|
|
|
+ pending) might support, we cannibalize an existing circuit (2.1.4)
|
|
|
+ or create a new circuit to support the request. We do so by picking
|
|
|
+ a request arbitrarily, building or cannibalizing a circuit to support
|
|
|
+ it, and repeating until every unattached request might be supported
|
|
|
+ by a pending or built circuit.
|
|
|
|
|
|
-2.1.2. When servers build circuits
|
|
|
+2.1.3. Servers build circuits for testing reachability
|
|
|
|
|
|
- At start and whenever the IP address changes, for testing reachability
|
|
|
- of their ORPort.
|
|
|
- XXXX
|
|
|
-
|
|
|
-2.1.3. When directory authorities build circuits
|
|
|
-
|
|
|
- There are no authority-specific circuits, I think.
|
|
|
+ Tor servers test reachability of their ORPort on start and whenever
|
|
|
+ their IP address changes.
|
|
|
XXXX
|
|
|
|
|
|
2.1.4. Hidden-service circuits
|
|
@@ -130,6 +138,9 @@ should cover, but not an exhaustive list. -NM
|
|
|
have elapsed.
|
|
|
XXX
|
|
|
|
|
|
+2.1.7. When to tear down circuits
|
|
|
+
|
|
|
+
|
|
|
2.2. Path selection and constraints
|
|
|
|
|
|
We choose the path for each new circuit before we build it. We choose the
|
|
@@ -221,21 +232,6 @@ should cover, but not an exhaustive list. -NM
|
|
|
|
|
|
XXXX
|
|
|
|
|
|
-2.4. Tracking "predicted" ports
|
|
|
-
|
|
|
- A Tor client tracks how much time has passed since it last received a
|
|
|
- request for a connection on each port. (For the purposes of this section,
|
|
|
- requests for hostname resolves are considered requests to a separate
|
|
|
- "special" port). Tor forgets about ports that haven't been used for
|
|
|
- an hour [PREDICTED_CIRCS_RELEVANCE_TIME].
|
|
|
-
|
|
|
- The ports that have been used in the last hour are considered "predicted",
|
|
|
- and Tor will try to maintain a clean circuit to them as described in 2.1.
|
|
|
-
|
|
|
- For bootstrapping purposes, port 80 is treated as used at startup time.
|
|
|
-
|
|
|
- Tor clients SHOULD NOT store predicted ports to a persistent medium.
|
|
|
-
|
|
|
3. Attaching streams to circuits
|
|
|
|
|
|
When a circuit that might support a request is built, Tor tries to attach
|