最近学习go语言,看完基础和高级篇后,果断拿起一个开源项目看看,于是就找到内网穿透工具——frp,它具体干嘛的,我就不多说,可以自己上官网看看,动手试试。
概念
连接
,本文用的连接,可以成为socket连接,connection,tcp连接, udp连接等工作连接
和通信连接
要分开的理解工作连接
是实际用户操作的连接,如ssh通信的流量就走这连接。通信连接
是客户端与服务端的协议通信建立内网穿透的逻辑,里面逻辑就包含工作连接
的创建用户连接
是用户发起与服务端的连接实际业务的连接
就是目标程序的连接,如ssh,就是内网22端口的连接,frpc会创建一个tcp连接,连接到22端口
角色
客户端:就是执行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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。