java - 通过通用网关发送请求时,服务器可用的应用程序和数据包层信息

标签 java http ip-address packet

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

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

最佳答案

 is the server able to differentiate between the two requests?

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

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

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

使用 NAT 的最常见原因是因为您的本地计算机没有静态 IP 地址

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

http 服务器永远无法知道它正在与网络中的哪台计算机进行低级请求和响应通信,但在应用程序级别 http 服务器可以使用cookie 以了解有关实际客户端的更多信息。

NAT 的工作原理

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

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

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

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

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

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

但是原始源端口对 http 服务器也是隐藏的。您的私有(private)系统的源端口号会被 NAT 表替换为 1024-65536 数字之一。所以http服务器无法知道你的私有(private)计算机通过哪个端口发出请求。

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

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

关于java - 通过通用网关发送请求时,服务器可用的应用程序和数据包层信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19531950/

相关文章:

Java小程序仅返回127.0.0.1

java - 在Java中,为什么参数化类型的构造函数的无类型调用会引起编译器警告?

java - 如何加快seda关闭速度?

java - 构建作为 HashMap 但在输入和输出上转换值的 Java Map 的正确方法是什么?

javascript - 如何在前端显示响应数据?

PayPal:能否通过IPN/PDT获取客户(买家)的IP地址?

java - 以正确的方式获取到 servlet 的信件

android - 加载资源失败:net::ERR_CLEARTEXT_NOT_PERMITTED

python - 如何在发送到 Spring Boot 休息 Controller 的请求正文中保留换行符

java - 基本的 bonjour java IP 地址解析