SOCKS代理和HTTP代理的区别

翻译自http://www.jguru.com/faq/view.jsp?EID=227532

括号里面都是我的注释,意会就好。

SOCKS代理

本地浏览器SOCKS服务器通常是用来做代理的,它通过TCP连接把目标主机和客户端连接在一起, 并转发所有的流量。SOCKS代理能在任何端口,任何协议下运行(额,好想有点不对, 这货是运行在session层,所以在他之下的层他就无法代理了)。SOCKS V4只支持 TCP连接,而SOCKS V5在其基础上增加了安全认证以及对UDP协议的支持(也就是说, SOCKS5支持密码认证以及转发UDP流量,注意,HTTP是不支持转发UDP的)。

SOCKS代理在任何情况下都不会中断server与client之间的数据(这是由这种协议的 特性决定的,毕竟非明文,但是在SOCKS代理服务器上还是可以还原出TCP和UDP的原始 流量的),当你的防火墙不允许你上网的时候,你就可以通过SOCKS代理来上网(这里的 意思是,如果GFW把google屏蔽了,你就可以通过一台海外的SOCKS代理服务器上谷歌)。

大多数的浏览器都支持SOCKS代理(这篇文章是三年前的,抱歉,谷歌第一条就是它)。( 浏览器上网的时候需要与目标主机建立TCP连接,这个时候浏览器就会告诉SOCKS代理,它想 与目标主机进行通讯,然后SOCKS代理就会转发浏览器的数据,并向目标主机发出请求,然 后再把返回的数据转发回来。)(关于shadowsocks的一点题外话:虽然github上的源码 没了,但是耐不住民间私货多呀。shadowsocks有server端和client端,这两个都是用 来转发数据的,但是由于其所处的位置不同,所以功能也不同,client即本地运行的程序, 监听1080端口,并将数据转发到远在他乡的SOCKS服务器,由于这种转发是加密的,在会话层, 所以GFW过滤的难度很大,所以才派人巴拉巴拉让作者删除源码,嗯,一定是这样的。然后server 那边收到数据后,会原原本本的把数据再向目标请求,收到反馈后再返回给本地client的1080端口, 这样,我们向本地的1080请求资源,本地向SOCKS服务器请求资源,SOCKS服务器向目标请求资源, 这一条TCP连接就这样建立起来了。)但是,但是,但是,SOCKS代理原则上是可以还原真实数据的, 所以,第三方的代理也许不是很可靠。

原来还想画张图,画着画着实在太low了,果断Alt+F4

HTTP代理

HTTP代理跟上面原理类似,用处也基本相同,都是让处于防火墙下的主机与外界建立连接,但是它与SOCKS代理不同的是,HTTP代理可以中断连接(即在中间截断数据流),因为HTTP代理是以HTTP请求为基础的 而这些请求大多以明文形式存在,所以HTTP代理可以在Client和下游服务器中间窃听,修改数据。但也正 由于HTTP代理只能处理HTTP请求,所以它对HTTP请求的处理也是很舒服的(原文中是smart)。而也由于 HTTP代理可以获取你的HTTP请求,所以HTTP代理服务器那边就可以根据你提交的数据来把那些资源缓存下来,提升访问的速度(用户亲密度+1)。有好多ISP都用HTTP代理,而不管用户那边的浏览器是怎样配置的,因为不管用户们怎么配置,他们总是要访问80端口,而这些80端口们又掌握在ISP们的手中。(原文完全不是这样说的= =。原文是说,互联网提供商们把流量都通过了HTTP代理,这样代理服务器中就有了缓存,访问的速度会快一些。)

(我来举个栗子:假如你的HTTP代理是Goagent,监听本地127.0.0.1:8080,此刻假设你已经把浏览器 的代理设置为:127.0.0.1:8080,那么你在浏览器中,所有的POST,GET,以及其他的请求,都会通过 本地的代理转发给远程的服务器,然后再通过远程的服务器去请求你所请求的这些资源,大家知道,HTTP协议是通过明文传输的,无论是在本地还是远程的服务器上,都是可以监听到这些流量的,所以才会有GFW的存在……HTTP协议属于应用层,而SOCKS协议属于传输层,ps:传输层在网络层之下,这就决定了两者的能力大小。)

拓展阅读

tcpdump下观察SOCKS代理和HTTP代理

先来一张乱码压压惊:

上面这张图是我浏览谷歌主页的时候在wireshark里面监听到的内容,可以看到,乱码。我不知道是因为https的原因还是因为socks加密的原因,但是结果都一样,看不出这是啥内容。(但尽管如此,还是可以看到Google的,是吧)

这张,是我访问 kfd.me 主页的时候所产生的HTTP请求,可以看到,每次GET请求之前都会跟着一个socks的握手,这是因为我请求的是本地资源(在浏览器看来),要先通过SOCKS建立一条TCP连接,然后再通过这条连接产生HTTP请求,第一行,序号是103的数据包先向对方表明了自己的socks版本以及要访问目标的端口号,以此让远程服务器对自己进行认证并转发数据。细心的同学可能已经注意到,箭头的方向就是数据流的方向,在这里,56059是本地端口号,socks是本地代理,即1080端口。(当初设计这些协议的人真厉害啊!)

然后打开其中一个数据查看其详情,这个是第212个包,我们从下往上看(不是在楼梯从下往上看啊喂!),最下面那层,是HTTP协议,在往上,是SOCKS协议,这里可以更加直观的看到,HTTP是通过SOCKS进行的,再往上是传输层(TCP),再往上是互联网层(IPV4),再往上是链路层(ethernet,以太网),最上面是wireshark的frame协议

再上面这一张是通过socks访问某个网站的数据流,好像是谷歌,我忘了。。中间还穿插着https这样的证书认证,hello完了才可以传输数据,也是蛮好玩的。

而这一张呢,是通过http代理获取一张图片的数据包,看他们的协议层就可以看出,HTTP直接通过TCP协议获取数据,而且HTTP协议又是明文传输的,所以……

下载查看数据流 这是我保存下来的整个过程,可以用sublimetext查看里面的内容,当然,有些东西是乱码也是正常的,但是提取出来就可以看到内容,因为这就是原始数据嘛。

如果想仔细观察这些数据包的话,你可以在安装了wireshark的情况下下载这些数据

comments powered by Disqus