如果现在我们需要访问 GitHub
首页。但是由于"墙"的原因,我们无法直接使用电脑访问到 GitHub
。此时我们可以曲线救国,先连接一台 代理服务器,代理服务器将我们的请求转发到 GitHub
,再将 GitHub
的返回再转发给我们。
什么是正向代理和反向代理?
正如 David Wheeler 所说的那样:
"All problems in computer science can be solved by another level of indirection."
"计算机科学中的所有问题都可以通过增加一个间接层来解决"
代理 的思想在计算机的许多领域都有体现。本质上就是原本 A 和 B 可以直接联系,但是我们增加一个 C 作为中介,A 和 B 都通过 C 来进行联系。
那么我们不禁要问:为什么要多此一举呢?这不是凭空地增加了系统的复杂性吗?本文将通过讲解计算机网络中 正向代理 和 反向代理 两种模式来解答这个问题,看一下引入代理 C 会为我们带来什么样的收益,也解释其必要性。文章将以下面这个顺序进行讲解:
我们知道一个完整的请求是由:client(客户端) -> proxy(代理) -> server(服务端) 组成的,不管是正向代理还是反向代理其实都是遵循这个结构和请求步骤。
正向代理
顺着请求的方向进行代理,即代理服务器是由客户配置,为客户端服务,去请求目标服务器。
我们考虑以下这个场景:
对于 GitHub
来说,并不知道我们其实无法直接访问到它。
正向代理的作用
- 访问原来没法访问的资源。
- 可以做缓存,加速访问资源。
- 对客户端访问授权,进行认证。
- 代理可以记录用户访问的行为,但是对外隐藏用户信息。
反向代理
与正向代理为客户端服务不同,反向代理为目标服务器进行服务。但是请注意,请求的流程仍然还是:client(客户端) -> proxy(代理) -> server(服务端)。
那么反向代理是为了解决什么问题呢?请考虑以下场景:
对于百度来说,有上亿人在进行访问。单一的服务器必然没有办法接受这么大量的请求,海量的网络内容也不可能存储在同一个服务器上。所以百度内部必然有成千上万不同的服务器同时对用户进行服务。那么当一个用户希望进行搜索的时候,他怎么会知道自己想要访问的资源在哪个服务器上呢?这显然是不可能的。所以所有的用户的请求其实是发送到 baidu.com
这个域名的代理服务器,代理服务器将转发我们的请求到对应的服务器节点,节点的结果返回代理服务器后被再次返回给客户端。
对于用户来说,只需要访问代理服务器而不需要关注真正提供响应的服务器,代理服务器只进行请求和转发。
反向代理的作用
- 保证内网安全。通常大型网站将反向代理服务器作为公网访问地址,而自己的Web服务器是内网环境。
- 负载均衡。代理服务器在转发的过程中可以进行流量的负载均衡。
总结
正向代理是面对客户端的代理,服务端不知道实际请求的客户端是谁。客户端和代理属于同一个 LAN。
反向代理是面对服务端的代理,客户端不知道实际提供服务的服务端是谁。服务端和代理属于同一个 LAN。