HTTP 代理与 Socks5 代理

概述

本文通过实践经历基本的认识 HTTP 代理与 Socks5 代理的用法与理解其精髓。同时也解决 go get 库无法下载的问题。

渐渐

终端走代理我最初接触到的是 HTTP 代理,这篇文章可以见证(代理服务器 | 韶 光)。当然我的这些实践都是基于 shadowsocks 这款产品。随后我又接触了 Socks5 代理,因为简单其更快,又隐隐觉得其更底层,通过以下代码配置:

1
2
# .zshrc
export ALL_PROXY=socks5://127.0.0.1:20808

仍然要开 全局模式 终端才能走代理。

虽然没有使用 HTTP 代理,但是很长一段时间我都没有关闭 启用 HTTP 代理 这个按钮,直到一天我连接手机热点 shadowsocks 闪退,我才关闭将其关闭了。这更显 Socks5 代理的优秀。

今天

当我重新安装 vim-go,并执行 :GoUpdateBinaries 故事又开始了。
显示类似于如下的一系列报错:

1
2
3
vim-go: Updating guru. Reinstalling golang.org/x/tools/cmd/guru@master to folder /Users/sweeney/Documents/code/go/bin
vim-go: Error installing golang.org/x/tools/cmd/guru@master: go get golang.org/x/tools/cmd/guru@master: golang.org/x/tools/cmd/guru@master: invalid version: Get "https://proxy.golang.org/golang.org/x/tools/cmd/guru/@v/master.info": dial tcp 172.217.24.17:443: i/o
timeout

首先我对 socks5 是很相信的,天生的认为其是较为底层的代理,应该不存在 HTTP 能代理而 Socks5 不能代理的情况。

“应该” 呵呵,所以我就耗了近一个半小时在这里。

以上问题其实和直接执行 go get golang.org/x/tools/cmd/guru,然后输出如下错误是一个道理。

1
unrecognized import path "golang.org/x/tools/cmd/guru": https fetch: Get "https://golang.org/x/tools/cmd/guru?go-get=1": dial tcp 216.239.37.1:443: i/o timeout

都是 go get 无法从 golang.org 下载包。

虽然 curl golang.org 能够访问这个网站,但是还是无法下载包。

Socks5 vs HTTP

HTTP ProxySocks5 Proxy
功能http 代理对于使用浏览器上网的用户很重要。并不使用 http 协议,是更通用,更低级别的代理。
安全被传输的数据极可能被查看。由于SOCKS无法读取数据,因此查看数据的几率很小。
速度速度较慢。通用服务器速度快。
连接工具任何工具。有限制工具。
建议传输少量数据。传输大体积的速度。

SOCKS 作用在 OSI 模型的第四层 —— 会话层上。SOCKS4 只能代理TCP协议,而 SOCKS5 什么协议都可以代理。HTTP工作在应用层上,Socks代理只是简单地传递数据包,而不必关心是何种应用协议(比如 FTP、HTTP 和 NNTP 请求),所以Socks代理服务器比应用层代理服务器要快得多。
network.png

解决方案

1
2
3
export ALL_PROXY=socks5://127.0.0.1:20808
export http_proxy=socks5://127.0.0.1:20808
# alias go='http_proxy=socks5://127.0.0.1:20808 go'

遗留问题

我还是不知道为什么 ALL_PROXY 没对 go get 生效,而 http_proxy 生效了。并且经过测试,不是大小写的问题。


参考文献: