专栏名称: 程序人生
十年漫漫程序人生,打过各种杂,也做过让我骄傲的软件;管理过数十人的团队,还带领一班兄弟姐妹创过业,目前在硅谷一家创业公司担任 VP。关注程序人生,了解程序猿,学做程序猿,做好程序猿,让我们的程序人生精彩满满。
目录
相关文章推荐
程序猿  ·  雷军删文,热搜第一! ·  4 天前  
稀土掘金技术社区  ·  协程中使用 ... ·  2 天前  
京东零售技术  ·  在京东 探索技术的无限可能 ·  2 天前  
51好读  ›  专栏  ›  程序人生

Wireguard:简约之美

程序人生  · 公众号  · 程序员  · 2019-11-11 09:07

正文

请到「今天看啥」查看全文


WG 仅有 4k 的内核代码实现!精巧 简直不能再精巧! 虽然这么说有些不敬,但对比下来,仿佛 OpenVPN 或者 StrongSwan 是按行收费的印度外包公司的产品,而 WG 是真正的程序员的杰作! Linus 本尊对 WG 赞不绝口,他在 18 年 8 月 2 日的 一封邮件 这么写到:

Btw, on an unrelated issue: I see that Jason actually made the pull request to have wireguard included in the kernel.

Can I just once again state my love for it and hope it gets merged soon? Maybe the code isn’t perfect, but I’ve skimmed it, and compared to the horrors that are OpenVPN and IPSec, it’s a work of art.

Linus

要知道,Linus 平日来评论代码的画风是这样的(Mauro 是一个 Kernel maintainer):

"It’s a bug alright – in the kernel. How long have you been a maintainer? And you still haven’t learnt the first rule of kernel maintenance?

"Shut up, Mauro. And I don’t ever want to hear that kind of obvious garbage and idiocy from a kernel maintainer again. Seriously.

所以能让 Linus “state my love” 比登天还难。所以让我们怀着朝圣的心情,跪着学习 WG 是怎么做到的 —— 这样做产品写代码的思路值得我们潜心研习!

WG 接口的概念

首先从概念说起。

很多人做产品并不太在意去清晰地解释产品中存在的诸多新老概念,尤其是不敢创建新的概念。这是非常错误的做法。我们在开始架构设计的时候,就应该把产品的所有概念梳理清楚,并且当现有的概念不能很好地描述产品的某部分时,要勇于创建新的概念来使其描述足够完备。概念是工程师之间,以及工程师和外界沟通的基础,通过大家一致认可的概念去沟通,更精确,更高效。比如当我上文赋予 ECDH 是 DH 算法使用椭圆双曲线的一种变体这样一个概念后,我再提及 ECDH,就不必费劲重新解释一下。当我们产生一个新的概念后,我们可以将很多属性附着于这个概念之上,使其区别于其它概念。

WG 先定义了一个很重要的概念 —— WireGuard Interface(以下简称 wgi)。为什么要有 wgi?为什么现有的 tunnel 接口不适合?一个 wgi 是这么一个特殊的接口:

  • 有一个自己的私钥(curve25519)

  • 有一个用于监听数据的 UDP 端口

  • 有一组 peer(peer 是另一个重要的概念),每个 peer 通过该 peer 的公钥确认身份

通过定义这样一个新的接口,wgi 把它和一般的 tunnel 接口区分开。有了这样一个接口的定义,其它数据结构的挂载,以及数据的收发都很清晰明了了。







请到「今天看啥」查看全文