在 HTTP 请求消息中,有一个主机 ip 地址和服务器 url 的字段:GET /cs453/index.html ~ Host: gaia.cs.umass.edu
但是主机的IP地址(请求者,发送此请求消息的浏览器正在运行)呢?
我认为服务器需要从 HTTP 请求消息中知道客户端的主机,但没有字段。
它是如何工作的?
在 HTTP 请求消息中,有一个主机 ip 地址和服务器 url 的字段:GET /cs453/index.html ~ Host: gaia.cs.umass.edu
但是主机的IP地址(请求者,发送此请求消息的浏览器正在运行)呢?
我认为服务器需要从 HTTP 请求消息中知道客户端的主机,但没有字段。
它是如何工作的?
您需要了解网络中不同层的概念。
HTTP 是一种应用层协议。当发送 HTTP 消息时,它使用 TCP 作为传输层协议。
TCP 将 HTTP 消息分割成多个段,并为每个段添加一个 TCP 标头。TCP 标头包括源端口号和目标端口号(TCP 地址)。然后 TCP 使用 IP 传送 TCP 段。
IP 获取 TCP 段并将它们封装到 IP 数据包中。IP 数据包具有包含源 IP 地址和目标 IP 地址的 IP 标头。IP 使用第 2 层协议(例如以太网)来传递 IP 数据包。
以太网将 IP 数据包封装成以太网帧。每个以太网帧都有一个以太网报头,其中包含源 MAC 地址和目标 MAC 地址。然后,以太网将包含 IP 数据包的以太网帧发送到发送比特的硬件,其中包含 TCP 段,其中包含 HTTP 消息的片段。
随着应用程序消息在堆栈中向下传播,数据在各个层被封装,并且每一层都有自己的地址方案,该方案用于该层的数据报头。
当服务器接收到这些位时,它会反转该过程,直到 HTTP 请求被传递到 HTTP 服务器。当 HTTP 服务器回复时,它使用相同的过程来封装并将回复发送回 PC。
tl;dr:真正的客户端的源 IP 地址通常是通过传递到 Web 服务器的 IP 数据包知道的。
但是,在客户端和服务器之间的源 NAT (sNAT) 或 HTTP 代理的情况下,真正的客户端 IP 不会在服务器看到的数据包中。当涉及 HTTP 中介时,x-forwarded-for (XFF) 标头应包含客户端的真实 IP,因为 Web 服务器看到的 IP 是代理的 IP。使用 sNAT,真正的客户端 IP 会丢失,除非执行 sNAT 的设备创建/重写一个 HTTP 标头(如前面讨论的 XFF)或另一个自定义标头来包含它。