nodeJS踩坑-记本地地址127.0.0.1与0.0.0.0的区别


注:本文和Node.js本身关系不大,只是这个这个知识点由学习Node时候引出,主要是关于网络的一个小知识点

问题的提出

nodejs中创建web服务时,作为小白的我自然是跟着官网文档走起

1
2
3
4
5
6
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

然后很自然本地就可以用localhost或者127.0.0.1访问了。那我想用本机ip访问呢?那就再listen(192.168.1.10) listen(localhost)啥的吧?结果却不行。我再挂到服务器上想要通过ip访问?怎么也访问不成功。
开始觉得是不是端口问题,设置了半天云主机的防火墙啥的还是没有用。果然太年轻,一开始就把问题方向搞错了。

问题的基本解决

看看官网的文档有这么一句:

server.listen(port, [hostname], [backlog], [callback])#
Begin accepting connections on the specified port and hostname. If the hostname is omitted, the server will accept connections directed to any IPv4 address (INADDR_ANY).

意思就是说如果不填写主机名hostname字段,默认是监听INADDR_ANY,也就是任意的IPv4地址。
所以解决这个问题就很简单了直接listen(1337)或者listen(1337,'0.0.0.0')就可以了。
这个0.0.0.0也就是所谓的INADDR_ANY
问题是解决了可是这个知识点还要进一步理清。

127.0.0.1与0.0.0.0

127.0.0.1是一个回送地址,指本地机,一般用来测试使用。大家常用来ping 127.0.0.1来看本地ip/tcp正不正常,如能ping通即可正常使用。对于大多数习惯用localhost的来说,实质上就是指向127.0.0.1这个本地IP地址。在操作系统中有个配置文件将localhost与127.0.0.1绑定在了一起。可以理解为本地主机的意思。
这个知识点应该是没有什么问题的。其实不只有127.0.0.1,127.x.x.x都是本机回送地址(Loopback Address),只不过在系统配置中把localhost和127.0.0.1做了绑定,我们习惯用它而已。那么这个INADDR_ANY又是什么呢?

INADDR_ANY

这个也叫通配地址,也就是说它不单单指本机。
0.0.0.0/8可以表示本网络中的所有主机
0.0.0.0/32可以用作本机的源地址
0.0.0.0/8也可表示本网络上的某个特定主机
综合起来可以说0.0.0.0表示整个网络
忽然想起来上计算机网络课程的时候有个默认路由的设置:

在路由器配置中可用0.0.0.0/0表示默认路由,作用是帮助路由器发送路由表中无法查询的包。如果设置了全零网络的路由,路由表中无法查询的包都将送到全零网络的路由中去。

结论

在我们刚刚nodejs配置web服务的语境下。0.0.0.0可以表示所有可以访问的地址,也就是本机的所有IPv4地址。

基础知识还是要扎实掌握才好,不然不会为了这么一点东西而大费周章。也让我想起了在腾讯面试中被问起的ICP四次回收过程,改日写博客详细记录。希望通过博客的点点滴滴助力我更扎实的成长。