1、“HTTP 代”与“SOCKS 代”有什么【差异】
“HTTP 代”是针对【HTTP 协议】而设计的(此处所说的 HTTP 协议包括 HTTPS);而“SOCKS 代”是为了支持【多种协议】而设计的。
另外,“SOCKS 代”的层次比“HTTP 代”更【低】——它对应于 OSI 7层模型的第5层【会话层】(session layer)。
2、“SOCKS4 & SOCKS4a & SOCKS5”都有什么【差异】
| 协议类型 | 远程域名解析 | IPv6 支持 | UDP 支持 |
|---|---|---|---|
| SOCKS4 | NO | NO | NO |
| SOCKS4a | YES | NO | NO |
| SOCKS5 | YES | YES | YES |
“远程域名解析”需要单独强调一下。
设计 SOCKS4 的时候,并未考虑 DNS 的问题。所以客户端与 SOCKS4 服务端建立连接时,需要发送“4字节”的 IPv4 地址。
后来 SOCKS4a 增加了这个特性(又叫做“服务端 DNS 解析”)。客户端可以把【域名】发给 SOCKS 代*的服务端,然后由 SOCKS 服务端完成域名解析。这个特性【很重要】,原因至少包括,如果你在【本机】进行域名解析,并且你的操作系统的 DNS 是传统的设置。那么,你的“DNS 查询请求”会通过网络【直连】。在这种情况下,如果 ISP 监控你的网络流量,就可以看出你在访问哪些域名的网站。
有鉴于上述原因,你使用的 SOCKS 代*,至少要选 SOCKS4a(SOCKS5 当然更好)。
3、两种 HTTP 代*——转发 VS 隧道
HTTP 转发
这是传统的方式。网络软件(比如:浏览器、IM)把自己想要的 URL 网址发给 HTTP proxy,当 proxy 拿到 URL 之后,向目标网站发起 HTTP 请求,获取 URL 对应的内容(页面/脚本/图片/等等),然后 proxy 把内容返回给网络软件。
使用这种代*,网络软件在进行 HTTP 通讯时,采用的依然是 HTTP 协议中常见的那几个 method(GET、POST、PUT 等等)。
这种代*也被称作“relay 或 forward”
HTTP 隧道
另外还有一种不太一样的 HTTP Proxy,使用一个专门的 HTTP method——【CONNECT】。用了 CONNECT 这个 method 之后,网络软件发给 proxy 的就【不再是】URL 网址了,可以是任意的【主机:端口】二元组。proxy 拿到“目标主机 & 端口”之后,尝试与该主机建立连接。然后,proxy 就可以充当“目标主机”和“网络软件”之间的中转——网络软件发出的数据通过 proxy 转发给目标主机的指定端口,而目标主机发出的数据也通过 proxy 返回给网络软件。
这种方式可以用来实现“各种 TCP over HTTP”(比如:SSH over HTTP 或 RDP over HTTP),所以也称为“隧道”(tunnel)。
4、“HTTP 代”与“SOCKS 代”如何【互相转换】
如果你使用的网络软件,仅仅支持 HTTP 或 SOCKS 的【其中一种】,而你用的代是【另外一种】。那么就需要进行两种代协议的【转换】。
1.HTTP 转 SOCKS
(如果你手头只有 SOCKS proxy,但你使用的网络软件只支持 HTTP 代*,就需要使用这种转换)
通过 Privoxy 来进行这种转换。Privoxy 本身可以充当 HTTP proxy,然后可以把数据转给别的 SOCKS proxy。
关于 Privoxy 的详细教程,参见《如何用 Privoxy 辅助翻墙?》
2.SOCKS 转 HTTP
(如果你手头只有 HTTP proxy,但你使用的网络软件只支持 SOCKS 代*,就需要使用这种转换)
通过 Tor(或 Tor Browser) 来进行这种转换。“Tor 客户端”本身可以充当 SOCKS proxy,然后可以把数据转给别的 HTTP proxy。