认识 frp 是因为要想实现 Homelab 的内网穿透,开始对 frp 源码感兴趣是因为关心 frp 的安全性。
从去年大约9月份开始陆陆续续学习 frp v0.2.0 版本源代码,到年底差不多搞懂了,深有感触,感叹于 Go 语言的高效简洁,也感叹于 frp 作者高超的编程技巧和构思的创新性。
当我回过头来总结学习成果时,以复现 frp 代码为练习手段,形成了一系列的试验代码。目前代码是以 v0.2.0 为基础的,后续将继续学习和阅读更高版本,见证 frp 的进化,也会通过 Read In Public 和大家分享交流。
这是什么
这是一个使用 Go 语言实现 Frp 功能的技术笔记。通过循序渐进开发各功能点的方式,有序地掌握 Go 语法和 Frp 技术实现及其原理。达到增强 Go 语言开发能力,熟悉 Frp 开发思路和基本原理的目的。
这不是什么
这不是重新造轮子,也不是 frp 的开发复盘,实际上是一个 frp 代码阅读者,在学习和分析了原始代码后,尝试用试验的方式来整合 frp 源码相关知识,开发原理、技巧和其他阅读源码后获得的体会。它力图反映 Frp 早期原始代码的部分思路和原理,但不是一比一的复刻。
为什么要实现 Frp
为什么要做这个复盘,前段时间我阅读了 frp v0.2.0 的源码,但整理笔记的时候发现要完整表达清楚源码的主要逻辑十分不容易,程序关联性是多层次网状结构的,而笔记是线性结构的,平铺直叙的表达适合于局部代码的单维度分析,很难完整全面且系统的展现出代码的层次与关联,阅读者要读完整个笔记才能掌握源码的全貌和精髓,表达难度大,阅读难度更大(市面上多数源码分析的读物好像都有这个问题)。且针对具体的某个技术枝节也难于设计和软件本身相关联的试验程序,因为要让实验与程序内容相关可能涉及大量关连技术,如果不相干又可能让试验和内容脱节。
总之,按照阅读代码的思路来写代码分析不是一个好的主意,且其中的实验也不容易设计和操作。通过复盘 frp 功能过程的方式,依据功能内容从简到繁循序渐进的演进,即容易表达,又容易上手实操和理解。
收获
Frp 是一个规模适中,功能强大的软件,正适合我们阅读和学习。我本人也是通过学习 Frp 的代码从一个 Go 语言小白,变成一个熟悉 Go 语言,掌握一定编程技巧,了解 Go 基本网络知识,和一些常用模块使用的熟手。具体有以下收获:
学习 golang,golang 是非常值得去了解的一门语言,在 github 上就有很多优秀的软件是通过 GoLang 编写的(比如:git 仓库软件 Gitea,相册系统),而且还是二进制跨平台的。掌握 GoLang 我们可以去学习这些软件,或者开发自己的软件,通过学习frp,为我们添加了一个go项目开发的经验。
- 学习相关网络知识,frp 中涉及大量的网络概念和知识,通过实实在在的代码,我们能更加直观的体会了解网络知识和原理。
- 提高自己的编程技巧,阅读代码是一个学习编程很好的方法,通过学习别人的代码来提高自己的代码能力是非常有效的,你还可以在自己的项目中借鉴已有的代码,通过短时间的学习,掌握别人长时间摸索出来的编程技巧。
- 从别人的代码中学习软件构建的思路和方法,也许我们能很好的编写一段代码,但是不一定能优雅、健壮的构架一个完整的软件,从成熟的软件中提高我们整体构架的能力。
- 更好的使用 frp,了解一个软件内在的运行原理能帮助我们更好的使用它,例如,frp 不断发展提供了更多的网络协议、安全选项和配置功能,我们明白这些原理之后能针对应用场景最大优化配置。
- 开发自己的frp,熟悉源码之后,遇到作者暂时没有开发而我们又需要的功能时,就可以自己动手了。现在有一些项目就基于 frp 进行封装和改写,或用其他语言翻写,甚至你修改完成后可以 PR 给作者共享给大家使用。
- 学习代码阅读的技巧,代码阅读有很多好处,另一方面代码并不像小说一样易于阅读,在代码阅读实践中掌握的技巧可以帮助你阅读其他代码时事半功倍。
名词解释
- 隧道 —— 交换两个连接的中间通道
- 用户端 —— 用户访问程序,如浏览器等客户端程序
- 代理服务端 —— 即外层代理程序frps
- 代理客户端 —— 内层代理程序 frpc
- 应用服务器(目标服务器) —— 需要通过代理访问的应用服务
- 数据交换
特点
从零开始,由浅入深,循序渐进的开发 frp,并在过程中学习 Go 语言相关知识和开发技巧。另一方面简化 frp 程序理解,对各功能点抽丝剥茧的分析,深刻学习 frp 及相关网络原理。
章节简介
ch 0 —— 开篇
ch 1 —— frp 使用示例
ch 2 —— Go 语言基础知识
ch 3 —— 开发环境搭建
ch 4 —— Go 语言网络开发示例
ch 5 —— 使用 Go 语言实现 http 反向代理
ch 6 —— 一层简单代理实现
ch 7 —— 两层代理转发
ch 8 —— 使用 ini 进行配置
ch 9 —— 命令行参数解析
ch 10 —— 记录日志
ch 11 —— 控制连接及心跳
ch 12 —— 多用户访问
ch 13 —— 代理多个目标服务
获取更多信息
知识星球
后续,我将继续坚持阅读代码,目前仅包含 frp 基础功能,更多 frp 高级功能正在学习、整理和设计动手试验,扩展信息将第一时间发布到付费知识星球,在这里你可以学习,提问,分享共同进步:
微信
微信获取我的最新动态,部分整理内容也会发布成微信文章,你也可以通过微信给我点赞:
闲鱼
想要纸质打印版笔记的可以通过闲鱼号【码语星河】联系我。
B站
搜索关注 码语星河 不迷路,发布代码功能的演示视频,欢迎