代理是什么?(HTTP代理,爬虫代理)



什么是代理?
虽然很早就接触过代理,但一直对这个问题没有很深入的理解。究竟代理的是什么东西?谁来做这件事?这些东西完全不懂,顶多就明白是有某种机制帮我完成了本该我自己去完成的东西。这几天看这些东西看得我脑阔疼,说说我的现在理解:

HTTP代理
我们正常的HTTP通信是这样的:

客户端先通过TCP与服务器建立一条连接
连接建立完成后,客户端向服务器发送请求(比如GET /hello.html HTTP/1.1,意为我想要取得服务器根目录/下的hello.html文件)
服务器接收到客户端发来的请求,找到所请求的文件,并通过原来的连接发回去。(接上条的例子,找到根目录/下的hello.html文件,并发送HTTP/1.1 200 OK,代表找到了这个文件,现在我就发送给你)
客户端接收到服务器传过来的文件,并用浏览器渲染出来给用户看(通过html/css以及js等把传回来的文本内容可视化,展示在屏幕上)
但我现在可能不想要按照人家的规定来访问,比如说我想访问根目录下的fxxk.html文件,然而又没办法直接跳转过去,那怎么办?这时候就轮到代理服务器出场了(当然这种需求改个url就可以了,这里只是举个栗子):

设想我们有一个受我们控制的代理服务器A。
客户端先与A建立TCP连接,然后告诉代理服务器A我想要访问某某网址根目录下的hello.html
代理服务器A收到请求,这时我们可以修改请求的内容,比如把hello.html改成fxxk.html。再建立一条到客户端指定网址的TCP连接,把这个新的请求的通过这个新连接发送过去。
这样在服务器看来,就好像是客户端请求了/fxxk.html一样,然后把所请求的内容返回回去,代理服务器再把内容通过第一条连接送回客户端…
总结一下,这次请求中,HTTP代理共建立了两条TCP连接:一条是客户端到代理服务器的,另一条是代理服务器到HTTP服务器的。这时代理服务器就好像一个中间商,可以看到你们双方交互的所有内容,并且也可以邪恶地更改这些内容。
顺便一说,代理https也是一样建立了这两个连接。客户端与代理服务器建立https连接,代理服务器又与HTTP服务器建立https连接,所以表面上我们是与代理服务器建立https连接的,这也是为什么在进行这种代理的时候需要导入代理服务器的https证书。
再举个栗子吧。比如说你小时候,和你爸爸路过麦当劳。这时候你想要吃汉堡,但自己又没money,于是你只能先告诉你爸爸:“爸,我想吃汉堡”。深思熟虑后你爸同意了(一般不太可能orz),他去店里跟店员买汉堡,并拿回来给你。这时,你先与代理服务器(你爸爸)建立连接,把请求(汉堡)告诉他,他再与店员建立连接并发送请求(买汉堡),最后把结果返回到你手中,你爸爸就扮演了一个代理的角色。