Tor funziona come una catena di proxy, in cui ogni proxy conosce solo l'hop successivo e l'hop precedente.
Semplificando molto, quando il tuo computer invia i dati usando Tor, il tuo client tor crittograferà il carico utile e lo inoltrerà a un altro nodo. Il nodo successivo fa lo stesso, e dopo alcune iterazioni il pacchetto raggiunge il nodo di uscita, viene completamente decrittografato e inviato al server web di destinazione.
Il server web invia il pacchetto al nodo di uscita, poiché il nodo di uscita era il computer che si collegava al server web. Il nodo di uscita utilizza una tabella (sembra la tabella NAT, ma con maggiori informazioni) per decidere dove inviare la risposta. Quindi crittograferà nuovamente il pacchetto e lo invierà al nodo successivo, che farà lo stesso, fino a quando il pacchetto raggiungerà il tuo computer, verrà decrittografato localmente e inviato all'applicazione.
I nodi intermedi non devono attendere tutti i dati prima di inviarli all'hop successivo, oppure scaricare file di dimensioni diverse da MB sarebbe una seccatura. Invece, hanno uno spazio buffer limitato, e ogni volta che il buffer si riempie (o si verifica un timeout), lo crittografano e lo inviano in anticipo.
La tua applicazione penserà che il server remoto sia il tuo client tor, quindi deve solo riconoscere il trasferimento del pacchetto fino al primo nodo. Il server Web di destinazione ritiene che il nodo di uscita sia il client e tutti i nodi intermedi riconosceranno i pacchetti tra di loro, poiché tra di essi esiste una connessione point-to-point.