cell是Tor协议里最小数据单位。
下面阐述node接收incoming cell后的处理过程。这里不写通信双方的建立TLS 握手过程。
connection_or模块采用connection_or_process_inbuf() 函数查询是否收到cell。一旦有incoming cell,调用channeltls.c模块的channel_tls_handle_cell()函数。
channeltls模块是处理通信两端TLS连接的模块,收到CREATE*, CREATED*, RELAY, DESTROY cell,这个模块调用 channel.c模块的cell_handler()函数。
channel.c模块是一个框架(这个表述不知道正不正确?),cell_handler()函数其实是指针函数,这个函数的回调函数是command.c模块的command_process_cell()。
command模块是处理incoming cell模块,到command模块的cell都是circuit层处理的cell
command根据cell->command类型分别调用onion.c, circuitbuild.c relay.c模块。具体如下:
- cell->command是CREATE,CREATE2,CREATE_FAST时,调用onion.c模块。
- cell->command是CREATED,CREATED2,CREATED_FAST时,调用circuitbuild.c模块。
- cell->command是RELAY时,调用relay.c模块
- cell->command是DESTROY是,command模块处理。