简介

很久很久以前,人们还穿的是草鞋,草鞋虽然穿着舒服,但是不够美观。然后人们就发现,用动物的皮也可以做成鞋,于是出现了皮鞋。但是皮鞋穿着磨脚,于是人们又发明了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长得什么样子的:

含义 VER CMD DSTPORT DSTIP ID
字节个数 1 1 2 4 可变

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

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

DSTPORT 占用2个字节,表示目标端口号。

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

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

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

含义 VN REP DSTPORT DSTIP
字节个数 1 1 2 4

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的请求格式:

含义 VER CMD DSTPORT DSTIP ID DOMAIN
字节个数 1 1 2 4 可变 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消息的格式:

含义 VER NAUTH AUTH
字节个数 1 1 可变字节

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: 内部使用的保留方法

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

含义 VER CAUTH
字节个数 1 1

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

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

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

客户端发送认证请求:

含义 VER IDLEN ID PWLEN PW
字节个数 1 1 (1-255) 1 (1-255)

VER 占用1个字节表示当前用户名和密码认证的版本。

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

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

PWLEN 占用1个字节,表示密码的长度。

PW 就是密码。

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

含义 VER STATUS
字节个数 1 1

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

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

接下来,客户端就可以和服务器端发送建立连接消息了:

含义 VER CMD RSV DSTADDR DSTPORT
字节个数 1 1 1 可变字节 2

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

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

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

含义 TYPE ADDR
字节个数 1 可变字节

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

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

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

含义 VER STATUS RSV BNDADDR BNDPORT
字节个数 1 1 1 可变字节 2

总结

以上就是SOCKS4和SOCKS5的详细协议内容。注意,SOCKS一定要大写!

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

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

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

网络协议之:一定要大写的SOCKS的更多相关文章

  1. 基础笔记(三):网络协议之Tcp、Http

    目录 一.网络协议 二.TCP(Transmission Control Protocol,传输控制协议) TCP头格式 TCP协议中的三次握手和四次挥手 TCP报文抓取工具 三.HTTP(Hyper ...

  2. 网络协议 8 - TCP协议(上):性恶就要套路深

    系列文章: 网络协议 1 - 概述 网络协议 2 - IP 是怎么来,又是怎么没的? 网络协议 3 - 从物理层到 MAC 层 网络协议 4 - 交换机与 VLAN:办公室太复杂,我要回学校 网络协议 ...

  3. 网络编程基础:网络基础之网络协议、socket模块

    操作系统(简称OS)基础: 应用软件不能直接操作硬件,能直接操作硬件的只有操作系统:所以,应用软件可以通过操作系统来间接操作硬件 网络基础之网络协议: 网络通讯原理: 连接两台计算机之间的Intern ...

  4. 网络协议之:还在用HTTP代理?弱爆了!快试试SOCKS5

    目录 简介 为什么要使用SOCKS SOCKS5 SOCKS5的使用 总结 简介 存在即是合理,SOCKS5的出现是为了解决SOCKS4中不支持身份认证的大问题而出现的,毕竟大家对网络中的安全越来越重 ...

  5. 网络协议学习笔记(四)传输层的UDP和TCP

    概述 传输层里比较重要的两个协议,一个是 TCP,一个是 UDP.对于不从事底层开发的人员来讲,或者对于开发应用的人来讲,最常用的就是这两个协议.由于面试的时候,这两个协议经常会被放在一起问,因而我在 ...

  6. PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析

    Python黑帽编程1.5  使用Wireshark练习网络协议分析 1.5.0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks At ...

  7. C# RFID windows 服务 网络协议方式

    上篇话说是串口方式操作RFID设备. 下面介绍网络协议方式. 设备支持断线重连. 那我们的服务也不能差了不是. 所以这个服务类也是支持的哦. 不解释上代码: namespace Rfid { /// ...

  8. CCNA网络工程师学习进程(3)常规网络设计模型与基本的网络协议

        本节介绍分层的网络设计模型与基本的网络协议,包括ARP协议,ICMP协议和IP协议.     (1)三层网络架构: 一个好的园区网设计应该是一个分层的设计.一般分为接入层.汇聚层(分布层).核 ...

  9. 对TCP/IP网络协议的深入浅出归纳

    前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网 ...

随机推荐

  1. Kubernetes List-Watch 机制原理与实现 - chunked

    概述http chunkedwatch api 概述 Kubernetes 中主要通过 List-Watch 机制实现组件间的异步消息通信,List-Watch 机制的实现原理值得深入分析下 . 在 ...

  2. Sequence Model-week1编程题3-用LSTM网络生成爵士乐

    Improvise a Jazz Solo with an LSTM Network 实现使用LSTM生成音乐的模型,你可以在结束时听你自己的音乐,接下来你将会学习到: 使用LSTM生成音乐 使用深度 ...

  3. django 中的hello word 开心,通过申请博客了,,发个随笔庆祝一下~~~~~~~

    django 中的hello word! 准备:[pymsql,pycharm,django3.0.7] >>>终端中:django-admin.py startproject [项 ...

  4. Java:创建对象小记

    Java:创建对象小记 对 Java 中的创建对象的内容,做一个微不足道的小小小小记 创建对象的方式概述 使用 new 关键字:Person person = new Person(); 反射创建:使 ...

  5. [对对子队]会议记录5.27(Scrum Meeting12)

    今天已完成的工作 朱俊豪 ​ 工作内容:寻找电池模型和BGM,修改关卡选择场景 ​ 相关issue:优化初步导出版本 ​ 相关签入:perf:地图界面优化 feat:更新系列资源(星星,大电池) 何瑞 ...

  6. sql_exporter的使用

    sql_exporter的使用 一.背景 二.sql-exporter的使用 1.下载 2.配置文件 1.sql_exporter.yml 2.collectors 目录中的配置文件 1.collec ...

  7. 替换excel模板中的内容并使用JavaMail发送邮件

    由于在公司工作,常年出差,每天都要以日报的形式向公司汇报当天的工作内容.而日报的内容大体上就只有当天工作的主要内容时变化的,其余的都是不变 的. 而我的电脑刚打开excel有点卡,因此决定使用Java ...

  8. Spring Cloud Gateway Route Predicate Factory 的使用

    Spring Cloud Gateway的使用 一.需求 二.基本组成 1.简介 2.核型概念 1.Route 路由 2.Predicate 谓语.断言 3.Filter 过滤器 3.工作原理 三.网 ...

  9. netty入门实现简单的echo程序

    最近看以往在程序中编写的代码,发现有一个功能是使用socket通讯来实现的,而那个时候使用的是基于bio的阻塞io来实现的,最近在看netty,发现可以使用netty来使用nio的方式来实现,此博客记 ...

  10. SpringCloud 2020.0.4 系列之服务降级的其他用法与熔断

    1. 概述 老话说的好:控制好自己的情绪,才能控制好自己的人生.冲动是魔鬼,冷静才最重要. 言归正传,之前聊了在 Feign 调用时,如何给整个 Feign接口类 增加降级策略. 今天我们来聊一下 H ...