最近学习 go 语言,看完基础和高级篇后,果断拿起一个开源项目看看,于是就找到内网穿透工具——frp,它具体干嘛的,我就不多说,可以自己上官网看看,动手试试。
概念
工作连接
和通信连接
要分开的理解 工作连接
是实际用户操作的连接,如 ssh 通信的流量就走这连接。通信连接
是客户端与服务端的协议通信建立内网穿透的逻辑,里面逻辑就包含 工作连接
的创建
角色
客户端:就是执行 frpc 程序的机子(也就是内网的机子)
服务端:就是执行 frps 程序的机子
用户: 就是外网机子,访问 frps 的机子。
核心流程
- 客户端登陆(通信连接)
- 服务端建立 controler
- 客户端建立 control,发送 NewProxy(通信连接)
- 服务端接收到 NewProxy(通信连接),并响应 ReqWorkConn,开始建立与用户的监听,handler 是 HandleUserTcpConnection(server/proxy/proxy.go:235)
- 客户端接收 ReqWorkConn(通信连接)
- 客户端创建流量连接(与服务端的新连接)
- 发送 NewWorkConn 给服务端(流量连接)
- 客户端创建与本地的连接(实际业务)
- 客户端 join 两个连接(流量连接和本地连接)
- 服务端在接收 NewWorkConn,就将该流量连接放入连接池
- 服务端接收用户的连接,会调用 HandleUserTcpConnection,该 handler 就是从上面的连接池获取连接,然后 join 用户连接和流量连接。
所谓建立 controler 也是为了创建消费者模式的,readCh, sendCh, msgHandler, manager