特殊的Header头——X-Forwarded-For 与 X-Real-IP 学习

特殊的Header头

    • X-Forwarded-For
    • X-Real-IP
    • remote_addr
    • End-to-end 和 Hop-by-hop
      • End-to-end 端到端头部
      • Hop-by-hop 逐跳首部
    • 其他 header 头

X-Forwarded-ForX-Real-IP只有请求存在dai li时才有值

X-Forwarded-For

记录dai li 服务器的地址,每经过一个dai li,该字段会加上一个记录,由于是记录来源地址,所以该字段不会保存最后一个dai li 服务器的地址

  • 存储客户端 ip 和反向 dai li IP 列表,以逗号+空格分隔
  • 记录最后直连实际服务器之前的整个 dai li 过程
  • 可能会被伪造 ip,但是直连实际服务器这段不会被伪造

图示:
特殊的Header头——X-Forwarded-For 与 X-Real-IP 学习_第1张图片
可以看到,第一层 dai li ,其存储了客户端的 IP,第二层 dai li 追加了 第一层的dai li 的IP(proxy_ip1),但并没有保存自己的proxy_ip2。

X-Real-IP

也是用来记录服务器的地址,但是和上面的不同,它不把记录添加到结尾,而是直接替换。

  • 请求实际服务器的 IP
  • 每过一层 dai li 都会被覆盖掉,只需第一层设置 dai li
  • IP可以被伪造,但如果存在一级以上的 dai li,它就不会收到影响,因为每经过一次dai li,它就会被覆盖

图示:
特殊的Header头——X-Forwarded-For 与 X-Real-IP 学习_第2张图片

第一层 dai li 已经拿到了真实的 ip,并在 header 中设置了 X-Real-IP,因此第二层 dai li 不需要再去设置 X-Real-IP,只需要做转发就可以

remote_addr

表示上一个客户端连接的地址,不存在 dai li 就表示客户端的地址,存在 dai li 就表示最后一个 dai li 服务器的地址

  • remote_addr无法伪造,
  • remote_addr 字段不是通过请求头来决定的,而是服务端在建立tcp连接时获取的的客户端地址

可以这样理解,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求

Go 中可以通过 req.RemoteAddr 代码获取请求地址的 ip,

End-to-end 和 Hop-by-hop

End-to-end 端到端头部

  • 此类头部字段会转发给 请求/响应 的最终接收目标。
  • 必须保存在由缓存生成的响应头部。
  • 必须被转发。

Hop-by-hop 逐跳首部

  • 此类头部字段只对单次转发有效。会因为转发给缓存dai li 服务器而失效。
  • HTTP 1.1 版本之后,如果要使用 Hop-by-hop 头部字段则需要提供 Connection 字段。

除了一下 8 个字段为逐跳字段,其余均为端到端字段。

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authenrization
  • Trailer
  • TE
  • Tranfer-Encoding
  • Upgrade

其他 header 头

  • Connection——标记请求连接是长连接还是短连接,或者说已关闭;http1.1 后默认是从长连接,该字段的值为:keep-alive
  • TE——HTTP 请求头字段,传输编码的优先级,固定值:TE: trailers,deflate
  • Trailer——HTTP 响应头字段,用户说明传输中分块编码的编码信息,固定值 Trailer: Max-Forwards

更多 header 头

参考:
End-to-end、Hop-by-hop

你可能感兴趣的:(计算机网络)