Node.js-HTTP响应如何始终命中正确的设备?

时间:2019-05-27 21:05:42

标签: node.js http ip

大家好!不久前,我问this question。经过有用的答复后,我了解到,根据设计,Web使不可能直接区分连接到同一路由器的设备。

因此,例如,下面的代码永远不可能100%起作用...

require('http').createServer((req, res) => {

    let uniqueDeviceId = getUniqueDeviceId(req);

}).listen(80, '<my public ip>', 511);

...,因为无法以保证的方式实现getUniqueDeviceId。它不能只是返回req.connection.remoteAddress,因为多个设备可能具有相同的地址。

鉴于此,我的问题是: res.end(...)总是如何响应正确的设备?

例如考虑一下这个简单的服务器:

require('http').createServer((req, res) => {

    res.end(req.url);

}).listen(80, '{{my public ip}}', 511);

采用两个连接到相同IP地址的不同设备。每个设备使用自己的网址:

  • 设备1使用http://{{my public ip}}/device1
  • 设备2使用http://{{my public ip}}/device2

现在,这两种设备都每秒以数千个请求轰炸其网址。

作为响应,即使使用此配置可​​能导致竞争状况,设备1始终将获得/device1,设备2将始终获得/device2

即使 I 无法直接确定设备的唯一ID,res.end仍将始终与相应的req相对应-它不会出错并且不会向某些设备发送响应即使在几乎完全相同的时间从相同的IP地址接收到了不同的req,也是如此。对我来说,这证明了在一定程度上可以确定唯一的设备ID(低于Nodejs)。

如果这是正确的,那么我们可以保证在哪个HTTP体系结构级别上,响应将始终返回到其初始请求者?以及如何实现?

2 个答案:

答案 0 :(得分:1)

“对我来说,这可以证明在某种程度上,可以确定唯一的设备ID(低于Nodejs)”

-不,不是可以确定的“唯一设备ID”,而是可以确定的唯一的“ IP-端口”组合。

例如,在您的情况下,设备1和设备2隐藏在路由器后面,这使其IP地址(路由器的IP)与您的Web服务器相同。但是,尽管它们具有相同的IP,但它们的端口却不同。

对于设备1,从Node.js Web服务器的角度来看,套接字(SourceIP /端口-DestinationIP /端口的组合)可能是:

{{RouterIP}}:{{PortX}} - {{Node.js serverIP}}:{{Node.js serverPort}}

对于设备2,从Node.js Web服务器的角度来看,套接字可以是:

{{RouterIP}}:{{PortY}} - {{Node.js serverIP}}:{{Node.js serverPort}}

因此,尽管设备1和设备2具有相同的IP,但HTTP响应将返回到路由器中的相应端口-设备1的响应将返回到路由器的PortX,而设备2的响应将返回到路由器PortY。

然后,在路由器内部有一个映射,例如:

{{PortX}} - {{Device 1's private IP}}:{{Device 1's Port}}
{{PortY}} - {{Device 2's private IP}}:{{Device 2's Port}}

因此,返回到路由器的PortX的响应将被重定向到设备1(及其对应的端口),并且返回到PortY的响应将被重定向到设备2。

这称为NAT,上面的描述只是一个非常简单的示例。

“我们可以在什么级别的HTTP体系结构中保证响应将始终返回到其初始请求者?这是如何实现的?”

-与HTTP无关,它属于IP层。实现发生在路由器中。 Web应用程序开发人员无需执行任何操作。

答案 1 :(得分:0)

MAC地址“唯一”标识设备。但是甚至:

首先,http是tcp / ip的顶部。 IP是定义网络中设备位置的标准。设备从其路由器获取IP,设备可以将其自己的IP发送到路由器。 (192.168.2.1:80(路由器)-> 192.168.2.100:80(PC))

然后,路由器通过您的ISP将内容发送到WWW。

您的公共IP -请求> ISP -请求> TargetIP -回答> ISP -回答>

(这一切都发生在将包的IP和端口保留在包裹在其他数据包中的包中。而且,在大多数情况下,跳数也比这更多。)


然后有端口:如果您使用端口,则该端口将被设备本地阻止。如果没有端口,TCP / IP将具有您提到的竞争条件,因为它们会相互阻塞。


问题是这样的:您没有使用其他端口或IP。因此,您要做的只是让一台服务器处理两个传入的请求,否则第二台尝试阻止端口的服务器将无法处理,因为它不符合TCP / IP。 您将无法让IP1:80 / device1和IP1:80 / device2与2个尝试阻止端口80的应用程序一起运行。

因此,您是对的(可能会有差异),但由于2 Server能够运行端口80的想法,也很容易引起误解。

处理您正在谈论的情况的方法如下:

任何一个

  • 使用Apache / Nginx / Nodejs并创建一个主应用程序(路由器),以通过反向代理和其他类型的* question方法将查询重定向到服务器。
  • 使用其他端口

为澄清起见:HTTP如下:

  • 路径(/ this / is / a / path)
  • 标头(您实际上看不到的标头,但它们包含缓存提示,数据类型以及关于如何处理文件以及将其视为什么和具有安全性的文件处理)

服务器对HTTP所做的工作是使用从HTTP格式获取的数据。 (这仅仅是TCP中数据的特定布局) 然后使用它来确定结果的路径/路线。

shaochuancs提到的套接字处理是TCP和UDP的两个底层协议的一部分。 网络中大约有7层。因此,这只是整个故事的一部分。如果您想了解更多信息,请专门在Google上搜索“网络层”。这是一个很好的关键字,可以获取有关此东西的更多信息。