因此,例如,下面的代码永远不可能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地址的不同设备。每个设备使用自己的网址:
http://{{my public ip}}/device1
http://{{my public ip}}/device2
现在,这两种设备都每秒以数千个请求轰炸其网址。
作为响应,即使使用此配置可能导致竞争状况,设备1始终将获得/device1
,设备2将始终获得/device2
!
即使 I 无法直接确定设备的唯一ID,res.end
仍将始终与相应的req
相对应-它不会出错并且不会向某些设备发送响应即使在几乎完全相同的时间从相同的IP地址接收到了不同的req
,也是如此。对我来说,这证明了在一定程度上可以确定唯一的设备ID(低于Nodejs)。
如果这是正确的,那么我们可以保证在哪个HTTP体系结构级别上,响应将始终返回到其初始请求者?以及如何实现?
答案 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的想法,也很容易引起误解。
处理您正在谈论的情况的方法如下:
任何一个
为澄清起见:HTTP如下:
服务器对HTTP所做的工作是使用从HTTP格式获取的数据。 (这仅仅是TCP中数据的特定布局) 然后使用它来确定结果的路径/路线。
shaochuancs提到的套接字处理是TCP和UDP的两个底层协议的一部分。 网络中大约有7层。因此,这只是整个故事的一部分。如果您想了解更多信息,请专门在Google上搜索“网络层”。这是一个很好的关键字,可以获取有关此东西的更多信息。