0%

代理服务器转发消息时的相关头部

在HTTP消息传输过程中,会经历会多正向代理服务器和反向代理服务器,那么这些代理服务器在转发消息时,会涉及到一些HTTP头部,这篇文章中,将会介绍这些HTTP头部。包括由于存在这些代理服务器,所以客户端与源服务器之间有许多条TCP连接,那么有一些HTTP头部是用于将客户端的实际IP地址,传递给服务器做相关用途的。

客户端与源服务器间存在多个代理

rest架构图,客户端与源服务器之间存在许多代理,而客户端每经过一个4层传输层以上的代理就建立一条新的TCP连接,而TCP连接中的源端的IP地址,只是这个TCP连接中的地址。比如说origin server,如果想基于客户端的IP地址来做负载均衡,或者是做限速限流,那么通过TCP连接是拿不到的。因为它只能拿到Gateway的IP地址。那么我们该怎么样传递客户端的IP地址到源服务器呢?我们可以通过一个HTTP头部。

问题:如何传递IP地址?

  1. TCP连接四元组(src ip, src port, dst ip, dst port)
  2. HTTP头部X-Forwarded-For用于传递IP
  3. HTTP头部X-Real-IP用于传递用户IP(非RFC规范中的,比如nginx就经常会使用X-Real-IP来传递用户的IP)
  4. 网络中存在许多反向代理(前提)

用户 内网IP: 192.168.0.x

ADSL 运营商公网IP:115.204.33.1

正向代理:IP地址 1.1.1.1 X-Forwarded-For:115.204.33.1 X-Real-IP: 115.204.33.1

CDN IP地址: 2.2.2.2 X-Forwarded-For:115.204.33.1 1.1.1.1 X-Real-IP: 115.204.33.1

反向代理 用户地址:115.204.33.1 remote_addr变量:2.2.2.2

消息的转发

  • Max-Forwards头部
    • 限制Proxy代理服务器的最大转发次数,仅对TRACE/OPTIONS方法有效(以防止过长的代理服务器的转发)
    • Max-Forwards=1*DIGIT (ABNF中的定义是1个数字)
  • Via头部
    • 指明经过的代理服务器名称及版本
    • Via = 1#(received-protocol RWS received-by [ RWS comment ])
      • received-protocol = [ protocol-name "/" ] protocol-version
      • reveived-by = ( uri-host [ ":" port ]) / pseudonym
      • pseudonym = token
  • Cache-Control:no-transform(还有很多其他的用途)
    • 禁止代理服务器修改响应包体(为了防止代理服务器修改服务器发向客户端的响应中的包体内容,那么HTTP规范又引入了一个新的Header字段叫做Cache-Control)

小结

这篇文章讨论了HTTP请求在历经重重的代理服务器后,在HTTP header的头部中能够反馈给我们的信息。特别是对于在服务器端获取到客户端的原始IP地址是非常有用的。