简介

很久很久以前,人们还穿的是草鞋,草鞋尽管衣着难受,然而不够好看。而后人们就发现,用动物的皮也能够做成鞋,于是呈现了皮鞋。然而皮鞋衣着磨脚,于是人们又创造了socks,套在脚上,代替脚跟鞋子接触,既进步了舒适感,也缩小了磨损,几乎是两全其美的事件,十分完满。

在网络世界,也存在这样的socks,为了和真实世界的socks进行辨别,这里咱们应用大写的SOCKS。

SOCKS就是咱们明天要解说的网络代理协定。

SOCKS的故事

在解说SOCKS之前,咱们回顾一下OSI网络七层协定。

OSI是Open System Interconnect的缩写,意为开放式系统互联。

而SOCKS也是一种网络协议,它的作用和socks一样,用来代替客户端和服务器端进行连贯,也就是代理协定。

SOCKS在OSI七层协定的第五层,也就是会话层中,它处于体现层和传输层的两头。从上图能够看到SOCKS的底层就是TCP和UDP协定。

作为一个代理协定,SOCKS能够提供基于TCP和UDP的代理,相较于HTTP的代理而言,SOCKS的代理更加底层,所以利用场景也会更多。

通常来说,SOCKS的规范端口是1080。

SOCKS的历史

每个协定都有本人的发展史,SOCKS也不例外,如果要把所有协定的发展史以故事的模式讲述起来肯定会很有意思,大家能够期待一下,说不定某天这样的文章就呈现了。

代理是网络中的一项基本功能,SOCKS代理最先是由美国MIPS科技公司的David Koblas设计的。MIPS公司以开发MIPS架构和基于该架构的一系列 RISC CPU 芯片而闻名。不过前面被一系列的收买,最终MIPS 架构被放弃了,转而反对RISC-V架构。

MIPS在1992年被Silicon Graphics收买了,在那一年Koblas发表了对于SOCKS的论文,SOCKS一举成名。

SOCKS最宽泛应用的协定版本是4和5。SOCKS4是NEC的Ying-Da Lee创造的。因为SOCKS 4中并没有对于平安方面的约定,然而对于当初的网络来说,平安越来越重要,所以呈现了SOCKS5,SOCKS5协定最后是一种使防火墙和其余平安产品更易于治理的平安协定。

SOCKS协定的具体内容

当初罕用的SOCKS协定次要有SOCKS4、SOCKS4a和SOCKS5。本节将会具体讲诉他们的协定形成。

SOCKS4

先看一下SOCKS4的申请数据package长得什么样子的:

含意VERCMDDSTPORTDSTIPID
字节个数1124可变

VER 占用1个字节,示意的是SOCKS协定的版本号,对于SOCKS4来说,这个值是0x04。

CMD 占用1个字节,示意的是要执行命令的代码,有两个抉择,其中0x01 示意建设一个TCP/IP 流连贯,0x02示意建设一个TCP/IP端口绑定。

DSTPORT 占用2个字节,示意指标端口号。

DESTIP 占用4个字节,示意的是IPv4地址。

ID 占用字节不定,示意的是用户ID。

对于申请数据,相应的返回数据如下:

含意VNREPDSTPORTDSTIP
字节个数1124

VN占用1个字节,示意是返回的音讯的版本。

REP占用1个字节,示意返回的code:

字节含意
0x5A申请受权
0x5B申请回绝或者申请失败
0x5C因为申请不蕴含客户端ID或者服务器端无奈连贯客户端而失败
0x5D因为客户端ID不匹配而失败

DSTPORT占用两个字节,示意目的地的端口,如果没有绑定的话,则为空。

DSTIP占用4个字节,示意客户端绑定的目的地的IP地址。

举个例子,如果客户端想应用SOCKS4从Fred连贯到66.102.7.99:80,申请如下:

0x04 | 0x01 | 0x00 0x50 | 0x42 0x66 0x07 0x63 | 0x46 0x72 0x65 0x64 0x00

其中最初一个字段是Fred的ASCII编码。

如果服务器端返回OK,则对应的响应如下:

0x00 | 0x5A | 0xXX 0xXX | 0xXX 0xXX 0xXX 0xXX

其中0xXX能够是任意值。

当连贯建设结束之后,所有的SOCKS客户端到SOCKS服务器端的申请都会转发到66.102.7.99。

SOCKS4a

因为SOCKS4只能指定目标服务器的IP地址,这对应服务器有多个IP的状况下会有很重大的限度。所以SOCK4a对SOCK4进行了扩大,能够反对指标服务器的域名。

SOCKS4a也是由SOCKS4的作者Ying-Da Lee,提出来的。咱们看下SOCKS4a的申请格局:

含意VERCMDDSTPORTDSTIPIDDOMAIN
字节个数1124可变variable

SOCKS4a是在SOCKS4的最初退出了domain。

DOMAIN示意的是要连贯到的指标服务器的域名。应用null (0x00)来结尾。对应的DSTIP的前三个字节设置为NULL,最初一个字节设置成一个非0的值。

服务端的响应和SOCKS4是一样的。

SOCKS5

尽管SOCKS5是SOCKS的最新版本,然而SOCKS5和SOCKS4是不兼容的。SOCKS5反对认证,并且提供了对IPv6和UDP的反对。其中UDP能够用来进行DNS lookups。它的交互流程如下所示:

  1. 客户端和服务器端进行连贯,并发送一个greeting音讯,同时蕴含了反对的认证办法列表。
  2. 服务器端抉择一个反对的认证办法,如果都不反对,则发送失败响应。
  3. 依据选中的认证办法,客户端和服务器进行后续的认证交互,交互流程跟选中的认证办法相干。
  4. 客户端以SOCKS4类似的形式发送连贯申请。
  5. 服务器端发送和SOCKS4类似的响应。

咱们看下greeting音讯的格局:

含意VERNAUTHAUTH
字节个数11可变字节

VER 占用1个字节示意SOCKS的版本号,这里是0x05。

NAUTH 占用1个字节,示意反对的认证办法的个数。

AUTH 是可变字节,示意的是反对的认证办法。一个字节示意一个办法,反对的办法如下:

    0x00: 没有认证    0x01: GSSAPI     0x02: 用户名/明码 (RFC 1929)    0x03–0x7F: methods assigned by IANA        0x03: Challenge-Handshake Authentication Protocol        0x04: 未调配        0x05: Challenge-Response Authentication Method        0x06: Secure Sockets Layer        0x07: NDS Authentication        0x08: Multi-Authentication Framework        0x09: JSON Parameter Block        0x0A–0x7F: 未调配    0x80–0xFE: 外部应用的保留办法

对应的服务器端的响应如下:

含意VERCAUTH
字节个数11

VER 占用1个字节,示意的是版本号。对于SOCKS5来说,它的值是0x05。

CAUTH 占用1个字节,示意选中的认证办法。如果没有被选中,则设置为0xFF。

选好认证办法之后,接下来就是客户端和服务器端的认证交互了,这里咱们抉择最根本的用户名和明码0x02认证为例。

客户端发送认证申请:

含意VERIDLENIDPWLENPW
字节个数11(1-255)1(1-255)

VER 占用1个字节示意以后用户名和明码认证的版本。

IDLEN 占用1个字节,示意用户名的长度。

ID 占用1到255个字节,示意用户名。

PWLEN 占用1个字节,示意明码的长度。

PW 就是明码。

对应的服务器端的响应如下:

含意VERSTATUS
字节个数11

VER 占用1个字节,示意版本号。

STATUS 占用1个字节,示意服务器的响应状态。

接下来,客户端就能够和服务器端发送建设连贯音讯了:

含意VERCMDRSVDSTADDRDSTPORT
字节个数111可变字节2

CMD 是连贯可选的命令,0x01示意建设TCP/IP流连贯,示意建设TCP/IP端口绑定,0x03示意连贯一个UDP端口。

RSV 是保留字节,必须是0x00。

DSTADDR是SOCKS5的地址。地址的定义是这样的:

含意TYPEADDR
字节个数1可变字节

TYPE 示意地址的类型,0x01是IPv4地址,0x03是域名,0x04是IPv6地址。

ADDR 示意的是地址,如果是IPv4,则应用4个字节,如果是域名,则第一个字节示意长度,前面字节示意域名。如果是IPv6地址,则应用16个字节。

对应的服务器端的响应如下:

含意VERSTATUSRSVBNDADDRBNDPORT
字节个数111可变字节2

总结

以上就是SOCKS4和SOCKS5的具体协定内容。留神,SOCKS肯定要大写!

本文已收录于 http://www.flydean.com/09-socks/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」,懂技术,更懂你!