Skip to content

如何理解 HTTP 代理?

参考答案:

我们知道在 HTTP 是基于请求-响应模型的协议,一般由客户端发请求,服务器来进行响应。

当然,也有特殊情况,就是代理服务器的情况。引入代理之后,作为代理的服务器相当于一个中间人的角色,对于客户端而言,表现为服务器进行响应;而对于源服务器,表现为客户端发起请求,具有双重身份

那代理服务器到底是用来做什么的呢?

功能

  • 负载均衡。客户端的请求只会先到达代理服务器,后面到底有多少源服务器,IP 都是多少,客户端是不知道的。因此,这个代理服务器可以拿到这个请求之后,可以通过特定的算法分发给不同的源服务器,让各台源服务器的负载尽量平均。当然,这样的算法有很多,包括随机算法轮询一致性hashLRU``(最近最少使用)等等,不过这些算法并不是本文的重点,大家有兴趣自己可以研究一下。
  • 保障安全。利用心跳机制监控后台的服务器,一旦发现故障机就将其踢出集群。并且对于上下行的数据进行过滤,对非法 IP 限流,这些都是代理服务器的工作。
  • 缓存代理。将内容缓存到代理服务器,使得客户端可以直接从代理服务器获得而不用到源服务器那里。下一节详细拆解。

相关头部字段

Via

代理服务器需要标明自己的身份,在 HTTP 传输中留下自己的痕迹,怎么办呢?

通过Via字段来记录。举个例子,现在中间有两台代理服务器,在客户端发送请求后会经历这样一个过程:

客户端 -> 代理1 -> 代理2 -> 源服务器

在源服务器收到请求后,会在请求头拿到这个字段:

Via: proxy_server1, proxy_server2

而源服务器响应时,最终在客户端会拿到这样的响应头:

Via: proxy_server2, proxy_server1

可以看到,Via中代理的顺序即为在 HTTP 传输中报文传达的顺序。

X-Forwarded-For

字面意思就是为谁转发, 它记录的是请求方IP地址(注意,和Via区分开,X-Forwarded-For记录的是请求方这一个IP)。

X-Real-IP

是一种获取用户真实 IP 的字段,不管中间经过多少代理,这个字段始终记录最初的客户端的IP。

相应的,还有X-Forwarded-HostX-Forwarded-Proto,分别记录客户端(注意哦,不包括代理)的域名协议名

X-Forwarded-For产生的问题

前面可以看到,X-Forwarded-For这个字段记录的是请求方的 IP,这意味着每经过一个不同的代理,这个字段的名字都要变,从客户端代理1,这个字段是客户端的 IP,从代理1代理2,这个字段就变为了代理1的 IP。

但是这会产生两个问题:

  • 意味着代理必须解析 HTTP 请求头,然后修改,比直接转发数据性能下降。

  • 在 HTTPS 通信加密的过程中,原始报文是不允许修改的。

由此产生了代理协议,一般使用明文版本,只需要在 HTTP 请求行上面加上这样格式的文本即可:

// PROXY + TCP4/TCP6 + 请求方地址 + 接收方地址 + 请求端口 + 接收端口
PROXY TCP4 1 2 1111 2222
GET / HTTP/1
...

这样就可以解决X-Forwarded-For带来的问题了。

题目要点:

代理服务器在网络通信中扮演着重要的角色,它可以在客户端和服务器之间转发请求和响应,起到负载均衡、安全保障和缓存等功能。

代理服务器的功能

  1. 负载均衡:代理服务器可以根据算法将客户端请求分发给不同的源服务器,以平衡负载。
  2. 安全保障:代理服务器可以监控源服务器的状态,剔除故障服务器,并对数据进行过滤,限制非法IP访问。
  3. 缓存代理:代理服务器可以缓存常用内容,提高访问速度,减少对源服务器的请求。

相关头部字段

  • Via:记录请求和响应在HTTP传输中经过的代理服务器,有助于追踪请求路径。
  • X-Forwarded-For:记录原始客户端的IP地址,经过代理时会被修改。
  • X-Real-IP:记录客户端的真实IP地址,即使经过多个代理也不会改变。
  • X-Forwarded-Host:记录客户端的原始域名。
  • X-Forwarded-Proto:记录客户端使用的原始协议(如HTTP或HTTPS)。

X-Forwarded-For产生的问题

  • 性能问题:代理必须解析HTTP请求头,修改X-Forwarded-For字段,这可能降低性能。
  • HTTPS问题:在HTTPS通信中,原始报文不允许修改,因此X-Forwarded-For字段无法直接使用。

代理协议

为了解决X-Forwarded-For带来的问题,可以使用代理协议。代理协议通常使用明文版本,在HTTP请求行中添加特定的文本,以指示代理服务器的存在和路径。这样可以在不修改原始报文的情况下,记录请求路径和客户端IP。