Tor源码文件分析 — Cpuworker

我们知道,对于Tor的服务器来说,有的时候因为其访问量巨大,不得不采取一些相应机制来保证服务的正常提供。在服务器编程里,我们经常可以用到的技术,例如线程池,多路复用等。Tor程序,在大多数情况下,都是单进程运行的,几乎没有哪里用到多线程的操作。正因为如此,Tor的主进程才绝对不允许出现阻塞式的操作。但是,唯独在一处,Tor为了提高自身效率,利用了线程池类似的机制。这个部分就是Cpuworker。本文就主要介绍该模块的作用和实现机制。   …

Tor源码文件分析 — Log

日志模块是Tor系统中一个非常重要的部件。它将Tor系统中的所有事件,分成不同的严重级别,分成不同的系统域,进行统一的日志处理。同时它还维护着一个日志记录链表。日志记录链表内存储的是所有日志需要输出的目标日志文件或目标日志输出位置。下文中我们会详细地对日志模块进行分析,并简要说明源文件中的各函数的简单作用。…

Tor源码文件分析 — Control

传统上我们所指的系统信号,就是系统传递给进程的控制信号。例如,SIGINT,SIGTERM等等。这些信号的传递,通常都是指示相关进程完成相应的操作,或暂停或终止,或其他一些操作。在Tor系统中,信号分为两种:传统信号,控制器信号。下面代码段是这些信号的简单罗列:…

Tor源码文件分析 — Hibernation

本篇会介绍Tor系统的休眠模块。休眠模块的代码处于源文件Hibernation.c之中。简单的说,其主要作用就是在适当的时机将系统进入休眠状态以保护系统资源被过度消耗;或者在适当的时机重新唤醒系统以达到重新为全局服务的目的。在默认的系统配置下,客户端的休眠模块是被关闭的,也就是说客户端永远不会进入休眠态。而Tor系统中的工作路由服务器则并非如此。他们很多时候需要设置一些为网络服务的策略和带宽,那么他们就需要对自己为Tor系统做出的贡献做一定的限制。单纯从流量角度来说,或许有一些OR服务器不愿意在一段时间内,允许流过自身的数据量超过一个非常大的范围。所以,OR服务器运行其自身的Tor程序时,进行了相关配置,要求其检查固定时间内流过的数据量。如果该数据量较小,则服务器可以忍受;若数据量非常大,则服务器会让其Tor程序进入休眠状态,提供少量服务,甚至最后不提供服务。   …

Tor源码分析八 — 客户端执行流程(second_elapsed_callback函数)

在之前的客户端源码分析中,我们讲述了整个客户端的事件集和相关调度规则。每一类事件的激活都有相应的条件,要么是socket可读写,要么是收到信号,要么是定时事件到达,还有手动的事件激活。总而言之,系统中添加的所有事件经过Libevent的调度,使得整个系统有条不紊的运行起来。同时,每个事件均有其对应的事件处理函数,在系统运行起来之后,一旦事件被激活,就会调用相应的回调函数进行处理。   …

Tor源码分析七 — 握手协议

本节主要讲述Tor系统中所用到的握手协议。握手协议分三层:TCP握手;TLS握手;Tor握手。其中Tor握手又分为三个层次:OR握手;链路建立;流建立。   TCP的三次握手我想应该学计算机方向的朋友无人不知了,所以此处就略去。而TLS是SSL的升级版本,其握手过程与SSLv3几乎一致。同时由于TLS根据客户端的不同握手选择,会有些许握手过程中的差别,我们希望大家能够找到TLS相关的书籍翻阅。此处就不再过多的叙述TLS的握手过程。   …

Tor源码分析六 — 总体框架图

1. 客户端的总体框图   由于画框图的过程稍微繁琐,所以框图给出的稍慢了些,请大家见谅。同时,框图画的比较急促,一定会有错误的地方,请大家指正。   框图中给出了客户端Tor系统所使用到的最重要的结构体以及其成员变量,有兴趣的朋友可以自行比对,这里就不便多说了。…

Tor源码分析五 — 客户端执行流程(libevent调度)

上一源码分析的小节中,已经将系统的主要流程启动过程介绍完毕。实际上,系统在如此启动之后,就可以通过正确的流程将Tor系统完整的启动起来,为用户提供应用程序代理服务,以达到匿名通信的目标。本节的目标,不是为了详细介绍系统初始化后的正确启动流程,而是介绍系统是如何通过Libevent的调度实现成功启动的。也就是说,本节的重点在于说明Libevent调度机制在Tor系统之中的应用。   …

Tor源码文件分析 — Circuits全局变量

Tor系统源码中用于控制链路circuit的文件主要有三个,分别是:circuitlist.c,circuituse.c,circuitbuild.c。这三个文件分别主要针对的处理功能与他们的名字相类似,即分别处理链路的组织,使用和建立。在本篇中,我们只介绍主要用于链路部分的全局变量,即存在于这三个文件之中的全局变量的使用。此处不再罗列链路函数,因为链路部分的函数着实不少,尤其是链路建立部分。或许在本文之后会花专门的篇幅描述链路建立以及对链路建立的函数加以说明,不过这不是本篇的主要内容。…

Tor源码文件分析 — Connetion_Edge

所谓的Edge连接主要是形容在链路两端所使用的连接,包括AP连接与EXIT连接两种。Edge连接的存在,主要是为了个应用程序连接提供服务,所以才将两种Edge连接命名为Application Proxy应用代理连接和EXIT出口连接。这两种连接主要出现于链路两端,即链路第一跳与链路最后一跳,分别用于接受应用请求和处理应用请求的发出。因为Edge连接在Tor系统中也具有重要的作用,所以本篇就简单分析关于Edge连接的源码文件connection_edge.c。   …

Tor源码文件分析 — Connection_OR

作为连接类型中最重要的一种连接,OR连接对OP与OR之间,OR与OR之间的通信负全责。也就是说,OR连接的存在,是解决底层两机之间通信的必要条件。所以,有必要对OR连接的源码文件进行深入分析,并对OR连接先做简要介绍。后期,在介绍Tor系统的全部连接之时,会更加详细地介绍各种连接及他们的作用。   …

Tor源码文件分析 — Connection

Tor协议的层次结果经过简要分析可以大致概括为如下框图:                 DIR连接……            应用层               ------------------------                 …