SOCKS5 代理?
SOCKS5
代理,啥远古的东西了?
序
昨天凑巧被问到这个,好久没碰过了,复习一下,希望能产出点东西。
协议与状态机
很多朋友一看到协议二字就紧张得不行,其实大可不必。
协议就是本质某种秩序,某种规则,在编排代码时按需即可。
就像是红灯停,绿灯行一样,他们是驾驶员与行人之间的协议,大家都遵守,就不会发生问题。
所有协议都可以被这么简化。
实际上现代计算机几乎所有的地方都离不开协议二字。
CPU上执行的二进制编码,可以视为硬件专家与软件专家之间的协议。
双击图标就能打开,是产品设计者与用户之间的协议。
。。。。或大或小,他们无处不在。
而 SOCKS5
则是一种用于网络代理的协议,仅此而已。
为了代理,很容易就能想到,他们二者有约定俗成的结构编排方式,其内部会包含一些信息。
同时,为了在不同阶段处理不同种类形式的任务,会告知对方需要做什么。
简单说就是一种状态的改变。为了降低这种状态转换时的心智负担,往往协议会伴随 状态机
一起出现,
状态机
可以被简单的认为是一种描述状态迁移过程的机器,虽然有着高大上的名字,但本质不复杂。
本文后面会给出一个 SOCKS5
的状态机模型。
先看一个伪代码,如下:
1 | any s = S0; |
对,你没看错,这就是最最简单的状态机模型了。
描述一下:
- 当 S 位于 s0 状态时,啥都不干,并迁移到 s1 状态。
- 否则,啥都不干,迁移到 s0
像不像一个来回拨动的按钮?
无论是说起来多么高大上的协议,最终也逃不过这个最简单的框架,妙哇~
代理
再说一下代理,这个就是字面意思,举个形象的例子。
- A 写了封信交给 B,B 再交给 C,他把回信也交给 B,最后由 B 交给 A 就是一个典型的代理过程。
1 | A -> B -> C |
这个过程中,B 会被称为中间人,而 SOCKS5 server
正是这种中间代理人的存在。
那么问题来了。
- 刚才只有 A,那假如 D、E、F 也想让 B 帮忙送信怎么办?
- 如果 A 要送给 G、H、I 怎么办?
那就需要和 B 协商要将信交给谁,信被回复时也会原路返回。 源头和目标之间就像 隧道
一样连接起来。
再复杂化一点,假如 B
有好多个版本,类似于邮政、顺丰… 你到邮政版的 B 那里寄出顺丰,他当然不会帮到咯。
上述过程就可以直接被代入到具体的 SOCKS5
协议中,大概有了一个代理协议
的雏形。
SOCKS5 协议
协议简单,资料很多,大同小异。
为了避免熵增,节能减排,扒拉一个排版干净的放这,就不再赘述。
核心框架实现
下图来自: Socks5 代理协议详解 & 基于 Netty 的实现
1 |
|
上文伪代码部分实现了一个大致的框架,大致流程如此。
除了数据转发外,其它的网络事件也需要同时处理二者,例如 local 断开后,remote 也应断开。
UDP ASSOCIATE?
啥都不是,散会。
到此为止
虽然还想多讲一会儿,
但是这个东西实在是没有太多值得提的,到此为止吧,毁灭吧。