0

当连接到同一个 WIFI 网络的 2 台机器向服务器发送 HTTP 请求时,服务器是否能够区分这两个请求?是否有任何信息可以让服务器知道这 2 个请求来自 2 台不同的机器?据我了解源 IP 地址在 HTTP 请求中不可用。服务器软件从 ip 数据包中提取 if 并分配给变量REMOT_ADDR

发送到服务器的 FROM : IP 地址将是公共网关的地址。因此服务器会将请求发送回网关。然后网关如何将响应转发回各自的机器?如果可能,请提供一些实现细节

4

2 回答 2

1
 is the server able to differentiate between the two requests?

,因为您的 wifi 路由器充当您的网络和外部 Internet 之间的中介。所有连接到您的 wifi 网络的计算机只能通过此路由器与外部网络通信。因此,http 服务器认为它正在与您的 wifi 路由器通信。

因此,在本节中,您的路由器有责任处理和区分来自网络中不同计算机的请求。为此,您的 wifi 路由器保留一个table包含您计算机的所有 IP 地址的地址。

因此,外部 http 服务器只能看到您的路由器的 IP 地址,当 http 服务器发送回响应时,wifi 路由器会检查标头并决定从您的哪台计算机发送请求。这是通过查看路由器之前使用的同一张表来完成的。找到正确的计算机后,路由器将响应发送给它。这称为网络地址转换NAT. 这整个过程对您和 http 服务器是完全透明的。您的本地用户不必担心这一切是如何完成的。

最常见的原因why NAT is used是因为您的本地计算机没有static ip addresses.

 Is there any information from which the server can come to know that the 2 requests have come from 2 different machines?

http 服务器永远无法知道它正在与网络中的哪台计算机通信,low level requests and response但在application levelhttp 服务器上可以使用它cookies来了解更多关于实际客户端的信息。

NAT 的工作原理

在一个非常简单的设置中,路由器维护一个 IP 地址映射表。

在该表中,所有本地 IP 地址都由路由器映射到一组全局 IP 地址。

现在,当本地系统向外部服务器发送请求时,您的路由器会检查 NAT 映射表并为当前本地地址选择映射的全局地址。然后路由器修改请求的头部,并将数据包的源地址设置为映射的全局 ip。这样http 服务器只能看到这个全局 IP地址。

当服务器返回响应时,路由器再次检查NAT映射表并选择映射到服务器发送响应的目的地的ip,并再次修改标头并将目的地更改为系统的正确本地ip

但是这种方法存在一些问题,例如只能将一个本地 ip 映射到一个全局 ip。这限制了一个全局 ip 可以建立的连接数。

为了解决这个问题,端口地址也包含在 NAT 映射表中。现在同一个全局 ip 可以被多个本地系统使用,因为这一次 ip 和端口对可以在一个非常大的范围内变化。

但是原始源端口也对 http 服务器隐藏。您的私有系统的源端口号被 NAT 表中的 1024-65536 数字之一替换。因此,http 服务器无法知道您的私人计算机通过哪个端口发出请求。

当您的浏览器要求系统提供端口号时,操作系统也会从 1024-65536 值中随机选择这些源端口号。由于随机选择的端口号,两个本地系统可以使用相同的端口,这可能会产生冲突。因此,要解决此问题,NAT 软件会为每个系统选择一个新号码。

这个垃圾端口号(而不是原始源)被发送到服务器,服务器可以看到它,也可以提取它。因此,例如,如果您在服务器上使用了 servlet,您将能够在任何 servlet 中获取客户端端口(在静态 IP 的情况下)或通过此方法 request.getRemotePort() 发出请求的最后一个代理对于任何 httprequest

于 2013-10-27T07:35:51.880 回答
0

WiFi 路由器作为网络地址转换 (NAT) 的一部分维护源自私有 IP 地址的连接的状态信息。

将路由器视为在网络堆栈中较低级别实现的代理。

路由器在更改源 IP 和以太网地址后代表客户端发送请求,如果客户端正在等待响应,则路由器将与服务器保持连接,以便每个客户端接收响应.

服务器可以通过查看 HTTP 标头来区分哪个请求属于哪个客户端的唯一方法。源 IP 地址或主机名在标头中可用,但对于两个客户端来说都是相同的。服务器确定哪个请求属于哪个客户端的一种方法是让服务器使用 cookie 来嵌入会话的概念或识别用户。作为来自客户端的请求的一部分,如果设置了 cookie,它将始终存在于 HTTP 标头中。服务器必须查找 cookie 并确定用户是谁。如果用户可以同时使用多个浏览器,例如 firefox 和 chrome,那么服务器不仅需要有关用户的信息,还需要另一条数据来跟踪用户的会话。

此外,不能总是依赖静态 IP 地址。如果浏览器碰巧在智能手机上并且用户碰巧在移动,例如在火车上,IP 地址不断变化是很常见的。随着智能手机与不同的基站连接,IP 地址会发生变化,服务器仍然必须保持用户仍然有有效会话的概念。

于 2013-10-26T03:39:53.580 回答