Shadowsocks 源码分析——UDP 代理
我们在 Shadowsocks 源码分析——TCP 代理中分析了 TCP 部分的源码,UDP 的实现比 TCP 简单不少,同时代码结构上与 TCP 又有所不同。本文将在假设读者已经看过了前面几篇文章的基础上,对 UDP 部分的实现作分析。
我们在 Shadowsocks 源码分析——TCP 代理中分析了 TCP 部分的源码,UDP 的实现比 TCP 简单不少,同时代码结构上与 TCP 又有所不同。本文将在假设读者已经看过了前面几篇文章的基础上,对 UDP 部分的实现作分析。
一年一度的年终小结又到了,今年似乎做了不少事情,又似乎没做什么,是时候写下来好好的审视一下了。
Shadowsocks 是一款性能很不错的代理工具,它的高性能体现在两个方面:速度快、资源占用少。相信你在读完「协议与结构」和「TCP 代理」这两篇文章后,就能理解为什么 shadowsocks 的速度快了1。资源占用少主要是因为 shadowsocks 使用了事件循环而不是多线程,另一方面,及时的进行超时和异常处理,能够将空闲的资源回收再利用也是原因之一。本文基于 2.9.0 版本的源码介绍 tcprelay.py 如何进行超时处理。
Shadowsocks 源码分析——协议与结构 已经对 shadowsocks 进行了大体上的分析,我们进一步的深入,来了解 shadowsocks 真正的核心——TCP 代理。
Shadowsocks 是一款著名的 SOCKS5 代理工具,深受人民群众喜爱。它的源码工程质量很高,十分便于研究。不过当你真正开始读源码的时候,会有一种似懂非懂的感觉,因为虽然它的大体框架容易理解,但是其中的诸多细节却不是那么简单明了。
本文将基于 2.9.0 版本的源码对 shadowsocks 进行分析,希望读者看完以后能对 shadowsocks 的原理有个大体上的认识。为了行文简洁,在示例中我们用 ss 指代 shadowsocks。
为了读懂 JOS 的代码,最近学了一波汇编。主要是通过粗略的过一遍 OpenSecurityTraining.info 上的 Introductory Intel x86 课程 来了解大概,因为已经学过一次,所以只要捡起来直接看代码就行了,遇到模糊不清的地方就详细看看 PC Assembly Tutorial。
Introductory Intel x86 课程上有个很有趣的逆向工程作业——拆除「炸弹」。「炸弹」是一个二进制可执行文件,由 6 个阶段和 1 个隐藏阶段组成,每个阶段都会读取用户输入,只有特定的输入才能通过这个阶段,在通过所有阶段后,炸弹就被成功拆除了。之所以说它有趣,是因为:
本文将一步一步介绍怎么拆除炸弹。关于炸弹的详细说明请戳:CMU binary bomb challenge,下载「炸弹」请戳:bomb32.tar,查看答案或者帮助请戳:loggerhead/CMU-binary-bomb-challenge。
一直对 Python 的 import 机制不甚了解,这次在写 Easy-Karabiner 的时候就踩坑了,顺便了解了一下,发现这玩意儿还不是那么「符合直觉」,遂写篇博客讲讲。
如果你常常使用 GitHub,稍微留心就会发现,不少项目都有勋章(badges),那这些勋章有什么用呢?要怎么给自己的项目也「戴上」勋章呢?
呜。。写小结完全是为了督促自己一把,顺便理一理过去一年自己把时间都花在哪了。就像理财,不怕亏损,就怕花得不明不白。很具体的也没啥好说的,就随便过一过好了。
高中学过一个神奇的数列——Fibonacci 数列,它的特点是:除了最初的两个 Fibonacci 数以外,其余的所有 Fibonacci 数都等于前两个 Fibonacci 数之和。表达成数学公式就是:
下面是 Fibonacci 数列的头几项(0 是第零项)。
同时,Fibonacci 数列也出现在很多计算机相关的书上面,那么我们怎么编程求第 n 个 Fibonacci 数呢?1