天天给 App 抓包,还不懂 HTTP 代理吗?
作者:媒体转发 时间:2019-06-19 21:01

一、序
有段时间没写 HTTP 协议相关的文章了,突然发现文章选题池里, 《实用 HTTP》 系列中还躺了个 HTTP 代理的主题没有写,那今天就来聊聊 HTTP 代理吧。
在 HTTP 协议中,最基础的就是请求和响应的报文,而报文又由报文头和报文实体组成。大多数 HTTP 协议的使用场景,都是依赖设置不同的 HTTP 请求/响应 的 Header 来实现的。
既然要说到代理,先提两个问题来当主线,从问题出发讲解 HTTP 代理。
抓包工具是如何实现 HTTP 抓包的。
对于 HTTPS 流量,不安装证书的情况下,通过抓包工具,请求和响应依然正常。
今天说的 HTTP 代理,更多的是一种抽象概念,其中的原理才是最关键的。
二、HTTP 代理
2.1 什么 HTTP 代理?
说到 HTTP 代理,作为客户端开发,最熟悉的就是使用 Fiddler、Charles 等工具进行抓包时,需要在手机上挂个代理,来方便我们排查一些网络问题,这只是代理众多使用场景中的一个。
实际上,HTTP 代理(Web 代理)是一种存在于网络中间的实体,可以提供各种功能。如果没有 HTTP 代理,客户终端就要直接与终端服务器进行交互。而有了 HTTP 代理后,客户终端就可以与代理通信,然后由代理代表客户端与服务器进行交互。
HTTP 代理算是最容易理解的一个 HTTP 协议概念,它和我们的生活最贴近。在我们的生活中,存在各种代办的服务。
例如你和女友准备出国游,一些不免签的国家,就需要提前办理签证。我们不熟悉自然觉得流程很复杂,这时就可以选择交由旅行社来代理办理签证,你只需要根据对方提供的清单准备材料,就可以很方便的获得签证。在这个过程中,你节省了时间,而旅行社赚了你一点钱。

代理服务,就是代理客户端完成事务处理的中间人,它接管客户端的事务,代替客户端与服务端交互。
代理服务是一个抽象的中间实体,可以存在网络的各个中间点,浏览器、路由器、代理服务器、Web 服务器的反向代理等,
2.2 HTTP 代理的分类
从最熟悉的抓包工具说起,Fiddler、Charles 这种抓包工具,封装的都非常好,哪怕我们完全不理解 HTTP 代理的细节,简单配置就可以使用。
在使用过程中,你会发现两种场景:
对于 HTTP 协议请求,可以直接显示请求/响应报文的细节
对于 HTTPS ,如果没有导入证书,请求依然可以发送至服务器,并且也可以正常返回数据,但是不会显示报文细节。
在没有导入证书的情况下,HTTPS 请求我们无法获知细节,但是并不影响我们的请求和响应。
这个两种不同的表现,也对应了两种不同的 HTTP 代理:
普通代理。基于修订后的 RFC 2616 在 HTTP/1.1 中被定义。这种代理扮演的是「中间人」的角色。对客户端来说,它是服务端,而对真正的服务端来说,它又是客户端,它就是负责在两端之间传递 HTTP 报文。
隧道代理。这种一种基于 TCP 协议的隧道传输代理,它通过 HTTP 协议的 CONNECT 方法完成通信,以 HTTP 的方式,实现任意基于 TCP 的应用层协议代理。
接下来我们就分别对这两种代理进行讲解。
2.3 普通代理
普通代理,理解起来并不复杂,它是网络中的中间实体,位于客户端和服务端之间,扮演「中间人」的角色,在两端之间来回传递报文。
这个「中间人」左手牵着客户端,右手牵着服务端,在收到客户端发送的请求报文时,需要正确的处理请求和连接状态,同时向服务器发送新的请求,在收到响应后,将响应结果包装成一个响应体返回给客户端。

在普通代理的流程中,代理两端都是有可能察觉不到「中间人」的存在。
举个例子,我们要访问 A 网站,实际上我们是向代理服务器发送请求,而代理服务器又再向 A 网站发起请求,最终将响应体通过代理服务器,返回给我们。在我们的角度,我们正常的向一个网站服务器发起请求,并且对方也返回给我们正确的数据,在这个过程中,我作为客户端,会认为代理服务器就是 A 网站的服务器,而 A 网站的服务器,又认为代理服务器是一个真实的用户。




