如果现在我们需要访问 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.