mirror of
https://github.com/torproject/torspec.git
synced 2024-11-24 02:09:50 +00:00
begin to revise path-spec
svn:r8511
This commit is contained in:
parent
f9572a6204
commit
dc2329ca10
@ -22,13 +22,14 @@ should cover, but not an exhaustive list. -NM
|
||||
Tor begins building circuits as soon as it has enough directory
|
||||
information to do so (see section 5.1 of dir-spec.txt). Some circuits are
|
||||
built preemptively because we expect to need them later (for user
|
||||
traffic), and some are build because of immediate need (for user traffic
|
||||
traffic), and some are built because of immediate need (for user traffic
|
||||
that no current circuit can handle, for testing the network or our
|
||||
availability, and so on).
|
||||
reachability, and so on).
|
||||
|
||||
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 (or in-progress) circuit if one exists, and launch a new circuit only
|
||||
open circuit if one exists, or wait if one 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.
|
||||
|
||||
@ -57,10 +58,6 @@ should cover, but not an exhaustive list. -NM
|
||||
|
||||
A "clean" circuit is one that has not yet been used for any traffic.
|
||||
|
||||
A "stable" node is one that we believe to have the 'Stable' flag set on
|
||||
the basis of our current directory information. A "stable" circuit is one
|
||||
that consists entirely of "stable" nodes.
|
||||
|
||||
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"
|
||||
@ -93,7 +90,7 @@ should cover, but not an exhaustive list. -NM
|
||||
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 at random, building or cannibalizing a circuit to support it, and
|
||||
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.
|
||||
|
||||
@ -101,17 +98,20 @@ should cover, but not an exhaustive list. -NM
|
||||
|
||||
2.1.2. When servers build circuits
|
||||
|
||||
At start and whenever the IP address changes, for testing reachability
|
||||
of their ORPort.
|
||||
XXXX
|
||||
|
||||
2.1.3. When authorities build circuits
|
||||
2.1.3. When directory authorities build circuits
|
||||
|
||||
There are no authority-specific circuits, I think.
|
||||
XXXX
|
||||
|
||||
2.1.4. Hidden-service circuits
|
||||
|
||||
See section 4 below.
|
||||
|
||||
2.1.4. Cannibalizing circuits
|
||||
2.1.5. Cannibalizing circuits
|
||||
|
||||
When Tor has a request (either an unattached stream or unattached resolve
|
||||
request) that no current circuit can support, it looks for an existing
|
||||
@ -123,7 +123,12 @@ should cover, but not an exhaustive list. -NM
|
||||
might support a stream, we begin building a new circuit that might support
|
||||
the stream.
|
||||
|
||||
[XXXX always? really?]
|
||||
2.1.6. Rate limiting of failed circuits
|
||||
|
||||
If we fail to build a circuit N times in a X second period (see Section
|
||||
2.3 for how this works), we stop building circuits until the X seconds
|
||||
have elapsed.
|
||||
XXX
|
||||
|
||||
2.2. Path selection and constraints
|
||||
|
||||
@ -132,16 +137,19 @@ should cover, but not an exhaustive list. -NM
|
||||
we generate obey the following constraints:
|
||||
- We do not choose the same router twice for the same path.
|
||||
- We do not choose any router in the same family as another in the same
|
||||
circuit.
|
||||
path.
|
||||
- We do not choose any router in the same /16 subnet as another in the
|
||||
same circuit.
|
||||
same path.
|
||||
- We don't choose any non-running or non-valid router unless we have
|
||||
been configured to do so.
|
||||
been configured to do so. By default, we are configured to allow
|
||||
non-valid routers in "middle" and "rendezvous" positions.
|
||||
- If we're using Guard nodes, the first node must be a Guard (see 5
|
||||
below)
|
||||
- XXXX Choosing the length
|
||||
|
||||
When choosing among multiple candidates for a path element, we choose
|
||||
For circuits that are not "fast", when choosing among multiple
|
||||
candidates for a path element, we choose randomly. For "fast" circuits,
|
||||
we choose
|
||||
a given router with probability proportional to its advertised bandwidth
|
||||
[the smaller of the 'rate' and 'observed' arguments to the "bandwidth"
|
||||
element in its descriptor]. If a router's advertised bandwidth is greater
|
||||
@ -157,12 +165,12 @@ should cover, but not an exhaustive list. -NM
|
||||
- All connection requests for connections that we think will need to
|
||||
stay open a long time require Stable circuits. Currently, Tor decides
|
||||
this by examining the request's target port, and comparing it to a
|
||||
list of "long-lived" ports. (Default: 21, 22, 706, 1863, 5050, 5190,
|
||||
5222, 5223, 6667, 8300, 8888.)
|
||||
list of "long-lived" ports. (Default: 21, 22, 706, 1863, 5050,
|
||||
5190, 5222, 5223, 6667, 6697, 8300.)
|
||||
- DNS resolves require an exit node whose exit policy is not equivalent
|
||||
to "reject *:*".
|
||||
- Reverse DNS resolves require a version of Tor with advertised eventdns
|
||||
support, running 0.1.2.1-alpha-dev or later.
|
||||
support (available in Tor 0.1.2.1-alpha-dev and later).
|
||||
- All connection requests require an exit node whose exit policy
|
||||
supports their target address and port (if known), or which "might
|
||||
support it" (if the address isn't known). See 2.2.1.
|
||||
@ -170,8 +178,9 @@ should cover, but not an exhaustive list. -NM
|
||||
|
||||
2.2.1. Choosing an exit
|
||||
|
||||
If we know what IP we want to resolve, we can trivially tell whether a
|
||||
given router will support it by simulating its declared exit policy.
|
||||
If we know what IP address we want to resolve, we can trivially tell
|
||||
whether a given router will support it by simulating its declared
|
||||
exit policy.
|
||||
|
||||
Because we often connect to addresses of the form hostname:port, we do not
|
||||
always know the target IP address when we select an exit node. In these
|
||||
@ -190,7 +199,7 @@ should cover, but not an exhaustive list. -NM
|
||||
and StrictExitNodes is false, then Tor treats that request as if
|
||||
ExitNodes were not provided.)
|
||||
|
||||
- "EntryNodes" and "StrictEntryNodes" behave analagously.
|
||||
- "EntryNodes" and "StrictEntryNodes" behave analogously.
|
||||
|
||||
- If a user tries to connect to or resolve a hostname of the form
|
||||
<target>.<servername>.exit, the request is rewritten to a request for
|
||||
@ -205,9 +214,10 @@ should cover, but not an exhaustive list. -NM
|
||||
supported by the pending circuit thus become unsupported, and a new
|
||||
circuit needs to be constructed.
|
||||
|
||||
If we fail to being a circuit with an EXITPOLICY error, we decide that the
|
||||
exit node's exit policy is not correctly advertised, so we treat the exit
|
||||
node as if it were a non-exit until we retrieve a fresh descriptor for it.
|
||||
If a stream "begin" attempt fails with an EXITPOLICY error, we
|
||||
decide that the exit node's exit policy is not correctly advertised,
|
||||
so we treat the exit node as if it were a non-exit until we retrieve
|
||||
a fresh descriptor for it.
|
||||
|
||||
XXXX
|
||||
|
||||
@ -216,11 +226,11 @@ should cover, but not an exhaustive list. -NM
|
||||
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
|
||||
port). Tor forgets about ports that haven't been used for an hour
|
||||
[PREDICTED_CIRCS_RELEVANCE_TIME].
|
||||
"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 circuits to them as described in 2.1.
|
||||
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.
|
||||
|
||||
@ -234,14 +244,14 @@ should cover, but not an exhaustive list. -NM
|
||||
considers the reason given in the CLOSE relay cell. [XXX yes, and?]
|
||||
|
||||
|
||||
After a request has remained unattached for [XXXX retries? interval?], Tor
|
||||
After a request has remained unattached for [XXXX interval?], Tor
|
||||
abandons the attempt and signals an error to the client as appropriate
|
||||
(e.g., by closing the SOCKS connection).
|
||||
|
||||
XXX Timeouts and when Tor auto-retries.
|
||||
* What stream-end-reasons are appropriate for retrying.
|
||||
|
||||
XXX What if no reply to BEGIN/RESOLVE?
|
||||
If no reply to BEGIN/RESOLVE, then the stream will timeout and fail.
|
||||
|
||||
4. Hidden-service related circuits
|
||||
|
||||
@ -258,24 +268,6 @@ should cover, but not an exhaustive list. -NM
|
||||
|
||||
(From some emails by arma)
|
||||
|
||||
Hi folks,
|
||||
|
||||
I've gotten the codebase to the point that I'm going to start trying
|
||||
to make helper nodes work well. With luck they will be on by default in
|
||||
the final 0.1.1.x release.
|
||||
|
||||
For background on helper nodes, read
|
||||
http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ#RestrictedEntry
|
||||
|
||||
First order of business: the phrase "helper node" sucks. We always have
|
||||
to define it after we say it to somebody. Nick likes the phrase "contact
|
||||
node", because they are your point-of-contact into the network. That is
|
||||
better than phrases like "bridge node". The phrase "fixed entry node"
|
||||
doesn't seem to work with non-math people, because they wonder what was
|
||||
broken about it. I'm sort of partial to the phrase "entry node" or maybe
|
||||
"restricted entry node". In any case, if you have ideas on names, please
|
||||
mail me off-list and I'll collate them.
|
||||
|
||||
Right now the code exists to pick helper nodes, store our choices to
|
||||
disk, and use them for our entry nodes. But there are three topics
|
||||
to tackle before I'm comfortable turning them on by default. First,
|
||||
|
Loading…
Reference in New Issue
Block a user