名词解析(常更新)

TAP is the original Tor Authentication Protocol, the one described in the original Tor paper (html). A security proof was later done by Goldberg at PET2006 and I think this is where the name of the scheme and the TAP acronym comes from.

TAP 是传统的TOR加密协议

NTor is a new protocol that aims to use faster and stronger cryptographic primitives. It is specified in proposal 216 and implemented in the Tor 0.2.4.x branch.

NTor是新的更快更健壮的协议,使用加密基元。

Cert (Certificates) 认证单元,估摸着是用来做通讯认证的。

Channels 通道

OP(Onion Proxy)运行于TOR应用上的洋葱代理程序

OR(Onion Router or Onion Relay)洋葱路由或中继

TOR中的连接(connection)与缓存区(buffers)解释:

TOR中的网络代码基于连接,每个连接代表一个可以收发网络事件的对象,大多数情况下每个连接都有一个潜在对应的TCP流

一个连接,像TCP传输流一样,有一个输出缓存区,输入缓存区,输入的数据存储于输入缓存区,输出的数据排队于输出缓存区。

扫描二维码关注公众号,回复: 4932587 查看本文章

缓存模块在buffers.c中实现,缓存区均以链式队列实现,像经典的BSD mbuf,或者LINUX下的sk_buf.

连接的读写操作可被禁用或者启用,其底层实现利用了libevent事件,一个读一个写。这些事件在main.c中实现启动或者禁用。

当一个读或写事件开启时,主libevent循环向内核提请事件,询问哪个套接字可读或写。当libevent发现一个套接字准备就绪,便调用读写函数。

相关的回调函数均被委托于connection_handle_read()和connection_handle_write(),依赖openssl

在数据读写或者其他事件发生后,这些connection_handle_read_write()函数调用连接中用于相关操作的逻辑函数,收发数据,确认,入缓冲处理。

不同的连接类型(含伪连接类型):

边缘连接:收发数据至洋葱网络外,有两种

入口连接,向一个TOR客户端收发数据。实现SOCKS端口,传输端口,BSD的传输端口等等,有时也叫AP(Application Proxy)连接

出口连接,在出节点处存在,向TOR网络外收发数据

当执行一个远端DNS请求时,出链接也不会减弱其在洋葱网络里以“流”的形式存在。

OR连接:在TLS基础上基于TOR 链接协议收发TOR cells(数据元),其相关实现在connection_or.c,command.c,relay.c,channeltls.c

拓展OR连接:一种用于在网桥上进行可插入传输的OR连接,以便PT在传输一个入连接的数据时告知网桥该连接的信息。

目录链接:服务器端或者客户端连接,实现TOR基于HTTP的目录协议。当TOR创建一个不加密的HTTP连接时使用套接字实例,当TOR在TOR链路上传输一个目录请求时,目录连接为一个相关连接对,目录连接实现于directory.c,一些服务器端的逻辑实现于diresercer.c。

控制器连接:一种对控制器进程的本地连接,实现控制协议,在control.c里。

监听器连接:非流连接,相反,包裹了一个监听套接字用于检测新的进来的连接,他们绕过大多数关于“流”的逻辑,与缓存无关,实现于connection.c。


连接类型

关联连接:有时两个通道重叠,因此一个TOR进程发送的数据应被对端TOR进程立即接收。(例如,当TOR创建一个目录连接通道时,在客户端实现为接收该连接输出的目录连接,不对网络而是对本地入连接。当一个目录服务器收到一个目录连接通道时,实现一个用于输出的出链接,不对网络而是对本地目录连接。)现在的TOR使用进程内关联的方式使用连接对,每个关联连接获取一个对对方的指针,当数据写入时能立刻被对方读取。

从连接到通道:在OR连接上,Cell之下有一层抽象层(处理数据元),称之为通道。通道的作用在于在TOR实例间传送认证数据元。

目前,只有一个实现存在,Channel_tls,在基于TLS的OR连接上收发数据元。

从通道穿越链路:当中继数据元到达一个已存在的链路时,用cirecuit_receive_relay_cell()函数处理(TOR里面内容最繁杂的函数之一),该函数用合适的方式加解密中继数据元,并且查看是不是当前hop的数据元。如果是,交给connection_edge_process_relay_cell(),根据数据元的中继命令工作,并且其数据入队。如果不是,把它入队到下一队列中的通道 append cell_to_circuit_queue()。使其交付到链路上的下一hop

链路上发送数据元:复杂比特

中继数据源从两个方式中的一个进入链路队列:从边缘连接中读取和接收一个被用于中继链路的数据元。这两种方式都会将他们的数据元入队,每个链路在每个链路方向上都有一个数据元队列。

在每个链路上使用队列时,我们能在们个通道上基于及时原则添加数据元,在每个时刻通过性能优先算法选择数据元。实现于scheduler.c和circuitmux*.c该调度模块全局决定所有的可写入数据元的通道,哪一个应该接收在排队的数据元。链路锁模块决定所有有数据元队列的通道的链路的数据元排入。

(这个逻辑仅应用于 出中继数据元,入中继数据元仅在他们到达时被处理。)

global_write_bucket() 当前时间(秒)最大可写令牌数,global_relayed_write_bucket(),当前最大中继可写令牌数。这两个参数涉及到TOR自身协议里面的令牌桶机制,目前没发现具体逻辑但发现了在connection.c中

猜你喜欢

转载自blog.csdn.net/LHF_debug/article/details/79538488