Skip to content

什么是正向代理和反向代理?

1031字约3分钟

网络

2024-09-27

正如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首页. 但是由于"墙"的原因, 我们无法直接使用电脑访问到GitHub. 此时我们可以曲线救国, 先连接一台代理服务器, 代理服务器将我们的请求转发到GitHub, 再将GitHub的返回再转发给我们.

对于GitHub来说, 并不知道我们其实无法直接访问到它.

正向代理的作用

  1. 访问原来没法访问的资源
  2. 可以做缓存, 加速访问资源
  3. 对客户端访问授权, 进行认证
  4. 代理可以记录用户访问的行为, 但是对外隐藏用户信息

反向代理

与正向代理为客户端服务不同, 反向代理为目标服务器进行服务. 但是请注意, 请求的流程仍然还是: client(客户端) -> proxy(代理) -> server(服务端).

那么反向代理是为了解决什么问题呢? 请考虑以下场景:

对于百度来说, 有上亿人在进行访问. 单一的服务器必然没有办法接受这么大量的请求, 海量的网络内容也不可能存储在同一个服务器上. 所以百度内部必然有成千上万不同的服务器同时对用户进行服务. 那么当一个用户希望进行搜索的时候, 他怎么会知道自己想要访问的资源在哪个服务器上呢? 这显然是不可能的. 所以所有的用户的请求其实是发送到baidu.com这个域名的代理服务器, 代理服务器将转发我们的请求到对应的服务器节点, 节点的结果返回代理服务器后被再次返回给客户端.

对于用户来说, 只需要访问代理服务器而不需要关注真正提供响应的服务器, 代理服务器只进行请求和转发.

反向代理的作用

  1. 保证内网安全. 通常大型网站将反向代理服务器作为公网访问地址, 而自己的Web服务器是内网环境
  2. 负载均衡. 代理服务器在转发的过程中可以进行流量的负载均衡

总结

正向代理是面对客户端的代理, 服务端不知道实际请求的客户端是谁. 客户端和代理属于同一个LAN.

反向代理是面对服务端的代理, 客户端不知道实际提供服务的服务端是谁. 服务端和代理属于同一个LAN.