Skip to content

Instantly share code, notes, and snippets.

@guomaimang
Last active March 29, 2023 12:19
Show Gist options
  • Save guomaimang/6a11549cfaaaf823ac08ae077371aaa8 to your computer and use it in GitHub Desktop.
Save guomaimang/6a11549cfaaaf823ac08ae077371aaa8 to your computer and use it in GitHub Desktop.
如何理解下面的字段

如何理解下面的字段

// +----+----------+----------+
// |VER | NMETHODS | METHODS  |
// +----+----------+----------+
// | 1  |    1     | 1 to 255 |
// +----+----------+----------+

这个字段表示一个协议头(protocol header)的格式。具体来说,它包含了三个字段:VER、NMETHODS 和 METHODS。

  • VER:一个字节的字段,表示协议版本号。在这个协议头中,它的值是固定的,为 1。
  • NMETHODS:一个字节的字段,表示 METHODS 字段中方法列表的数量。它的值的范围是 1 到 255,也就是说,METHODS 字段最多可以包含 255 个方法。
  • METHODS:一个可变长度的字段,表示支持的方法列表。它的长度由 NMETHODS 字段决定,最多可以包含 255 个方法。每个方法的值是一个字节,代表一个支持的方法。

在上述的协议头中,VER 字段和 NMETHODS 字段各占一个字节,而 METHODS 字段的长度根据 NMETHODS 字段的值而变化。这种格式常用于网络协议的设计,它可以在保证协议的可扩展性的同时,尽量减小协议头的长度,以提高网络传输的效率。

这是什么的协议头?

根据上文提供的信息,这个协议头包含了 VER、NMETHODS 和 METHODS 三个字段,其中 VER 字段的值为 1,NMETHODS 表示 METHODS 中方法列表的数量,METHODS 是一个可变长度的字段,表示支持的方法列表。根据这些信息,我们可以判断出这个协议头是 SOCKS5 协议的第一个请求消息的协议头。

SOCKS5 是一种网络传输协议,用于在客户端和服务端之间建立代理连接。在 SOCKS5 协议中,第一个请求消息包含了一个协议头,用于告诉服务端客户端支持的认证方法(AUTH METHODS)。这个协议头的格式如下:

+----+----------+----------+
|VER | NMETHODS | METHODS  |
+----+----------+----------+
| 1  |    1     | 1 to 255 |
+----+----------+----------+

其中 VER 表示协议版本号,NMETHODS 表示 METHODS 中方法列表的数量,METHODS 是一个可变长度的字段,表示支持的方法列表。这个协议头是 SOCKS5 协议的重要组成部分,用于在客户端和服务端之间协商认证方法,确保连接的安全性和可靠性。

| 1 | 1 | 1 to 255 | 是什么意思?

这个表格描述了 SOCKS5 协议的第一个请求消息中的协议头格式,包括了三个字段:VER、NMETHODS 和 METHODS。每个字段的具体含义如下:

  • VER:一个字节的字段,表示协议版本号。在 SOCKS5 协议中,它的值为 1。
  • NMETHODS:一个字节的字段,表示 METHODS 字段中方法列表的数量。它的值的范围是 1 到 255,也就是说,METHODS 字段最多可以包含 255 个方法。
  • METHODS:一个可变长度的字段,表示支持的方法列表。它的长度由 NMETHODS 字段决定,最多可以包含 255 个方法。每个方法的值是一个字节,代表一个支持的方法。

因此,这个表格中的 "| 1 | 1 | 1 to 255 |" 表示了这个协议头的具体格式,其中第一个竖线表示这个字段的名称,第二个竖线表示这个字段的长度,第三个竖线表示这个字段的取值范围。具体来说,VER 字段和 NMETHODS 字段各占一个字节,取值分别为 1 和 1,而 METHODS 字段的长度根据 NMETHODS 字段的值而变化,取值范围为 1 到 255。

| 1 | 1 | 1 to 255 | 指长度还是范围?

在这个表格中,第二列中的 1 表示的是对应字段的长度,第三列中的 1 to 255 表示的是对应字段的取值范围。

具体来说,第一个竖线 | 后面的 1 表示 VER 字段和 NMETHODS 字段各占一个字节。第二个竖线 | 后面的 1 表示 NMETHODS 字段中 METHODS 字段列表的数量也占一个字节。第三个竖线 | 后面的 1 to 255 表示 METHODS 字段的长度可以是 1 到 255 个字节。

因此,这个表格中的 1 to 255 表示的是 METHODS 字段的长度可以是从 1 到 255 个字节之间的任意长度,而不是表示取值范围。

不同的ver 代表什么?

在 SOCKS5 协议中,VER 字段表示协议版本号,它占用一个字节,用于区分不同版本的协议。当前 SOCKS 协议有两个版本,分别是 SOCKS4 和 SOCKS5。

  • SOCKS4:它是 SOCKS 协议的早期版本,只支持 TCP 协议,并且不支持 UDP 协议和认证功能。它的协议头比 SOCKS5 简单,只包含了 8 个字节,其中 VER 和 CMD 两个字段各占一个字节。
  • SOCKS5:它是 SOCKS 协议的最新版本,支持 TCP 和 UDP 协议,并且支持多种认证方式。它的协议头比 SOCKS4 复杂,包含了 10 个字节,其中 VER 和 NMETHODS 两个字段各占一个字节。

在 SOCKS5 协议中,VER 字段的值固定为 0x05,表示使用的是 SOCKS5 协议。如果 VER 字段的值不为 0x05,则表示使用的是 SOCKS4 或其他协议。因此,通过检查 VER 字段的值,可以判断当前使用的是哪个版本的 SOCKS 协议。

协议版本号是其他的话分别代表什么协议?

在 SOCKS5 协议中,如果 VER 字段的值不为 0x05,则表示使用的不是 SOCKS5 协议。根据 SOCKS 协议的版本历史,一些早期的 SOCKS 协议版本也使用了 VER 字段来标识协议版本号。如果 VER 字段的值不为 0x05,则可以根据具体的值来判断使用的是哪个版本的 SOCKS 协议。

常见的 SOCKS 协议版本包括:

  • SOCKS4:它的 VER 字段的值为 0x04,如果收到的协议头的 VER 字段的值为 0x04,则表示使用的是 SOCKS4 协议。
  • SOCKS4A:它是 SOCKS4 的扩展版本,支持通过域名来访问目标主机。它的 VER 字段的值为 0x04,如果收到的协议头的 VER 字段的值为 0x04,则表示使用的是 SOCKS4A 协议。
  • SOCKS5:它的 VER 字段的值为 0x05,如果收到的协议头的 VER 字段的值为 0x05,则表示使用的是 SOCKS5 协议。

除了 SOCKS 协议之外,也有一些其他的协议也使用了 VER 字段来标识协议版本号,比如 SSH 协议中的版本号就是由 VER 字段来标识的。因此,在使用协议时,需要根据具体的协议规范来判断协议版本号的含义。

Method 都有哪些

在 SOCKS5 协议中,客户端在发送第一个请求消息时需要告诉服务端它支持的认证方法(AUTH METHODS)。这些认证方法被编码为一个字节序列,每个字节代表一种支持的方法。常见的 SOCKS5 认证方法包括:

  • 0x00:表示无需认证,客户端可以直接连接服务端。
  • 0x01:表示使用 GSSAPI 认证,客户端需要使用 GSSAPI 协议与认证服务器进行身份验证。
  • 0x02:表示使用用户名和密码认证,客户端需要使用用户名和密码进行身份验证。
  • 0x03~0x7F:保留的认证方法,暂未使用。
  • 0x80~0xFE:由第三方厂商定义的私有认证方法,可以扩展 SOCKS5 协议的认证方式。
  • 0xFF:表示客户端不支持任何认证方法,客户端将断开连接。

因此,客户端可以根据需要支持一个或多个认证方法。服务端在收到客户端的请求消息后,会选择一个支持的认证方法进行身份验证。如果服务端不支持客户端发送的任何认证方法,服务端会拒绝连接,并返回一个拒绝连接的响应消息。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment