tcprelay.py 流程分析

main起来后会把TCPRelay加到eventloop。有新连接进来后在TCPRelay的handle_event处理,accept后生成一个TCPRelayHandler用于处理后续的事件。

TCPRelayHandler初始化的时候会把自己加到loop里,并把自己添加到fd_to_handlers,后续再有事件TCPRelay 会通过 fd_to_handlers 交对应的 TCPRelayHandler中的handle_event处理。

local和server走的是同一个对象,用is_local区分,无论哪个只要到了STAGE_ADDR这个状态就会新建另一个socket用于远端连接,用_remote_sock记录,并把这个sock加到loop,然后通过 fd_to_handlers 指向自己处理。也就是说一个 TCPRelayHandler 会处理两个连接。local 的_remote_sock指的是server,_local_sock指的是source; server 的 _remote_sock 指的是destination, server 的 _local_sock 指的是 local

来到STAGE_STREAM这个状态开始数据传输,_on_local_write和_on_local_write都是上次 TCPRelayHandler 没发完的数据继续发,这里就不详说了。

在local端数据流如下

source -> destination :
source -> _on_local_read -> (_handle_stage_stream -> encrypt) -> server

destination -> source :
server -> (_on_remote_read -> decrypt) -> source

在在server端数据流如下

source -> destination :
local -> (_on_local_read -> decrypt) -> _handle_stage_stream -> destination

destination -> source :
destination -> (_on_remote_read -> encrypt) -> local

基本就是这样,要修改数据承载的话改_handle_stage_stream
_on_remote_read 应该就可以了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注