文章目录

前言

最近在项目开发中发现一个奇怪的问题,当服务器与客户端在同一台机器上时,用服务器ip(本地主机ip)192.168.1.xxx、127.0.0.1以及0.0.0.0都能登陆服务器,于是找点资料研究一下。

其实,最开始是发现服务器ip填0能登陆成功,后来知道了系统自动补全ip地址,什么意思呢,就是如果你填0或0.0或0.0.0,系统都会自动补全ip为0.0.0.0。下面就简要介绍一下这三种ip的区别。

区别

相信读者都知道,ipv4是点分十进制模式,每个ip地址都有特殊的含义。首先说一下ip地址:127.0.0.1,这是大家最熟悉不过的本地loopback(回环)地址,代表本地主机,在windows和 Linux 上等价于localhost,可在C:\Windows\System32\drivers\etc\hosts文件中修改主机名或定义ipv6地址(# ::1 localhost)。

正常的网络包从ip层进入链路层,然后发送到网络上, 而发向loopback地址的包,直接在IP层短路了,也就是发到IP层的包直接被IP层接收了,不再向下发送。

192.168.1.x,是开放的ip地址,这些是在网络中代表本机的ip地址,可通过此ip地址远程访问或控制主机。 当然192.168开头的是私有地址,仅限于局域网内使用。

0.0.0.0,最特殊的一个ip地址,代表的是本机所有ip地址,不管你有多少个网口,多少个ip,如果监听本机的0.0.0.0上的端口,就等于监听机器上的所有ip端口。换句话说,就是只要数据报目的地址是你机器上的一个ip地址,那么就能被接受。这个ip相当于 Java 中的this,代表当前设备的IP。

0.0.0.0 和127.0.0.1 仅限于在主机上(假设为A)使用,如果跨机器(假设为B)是不行的,因为在B上,这2个地址会当做B的本机上的地址,只能使用公开的IP地址访问。

下面再来说说这三种地址的区别。在Java开发中,服务器端如果没有显示绑定ip地址,如:

ServerSocket serverSock = new ServerSocket(8888);
serverSock.accept();

系统默认的ip地址是0.0.0.0,表示监听所有的地址,倘若在主机上ping,此时用以上3种ip都能连接成功。

如果显示绑定ip,则该ip和0.0.0.0可通,其余ip不通,如:

ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress("127.0.0.1",8888));
serverSock.accept();

倘若在主机上ping,此时ip192.168.1.x将连接不上,而ip127.0.0.1和0.0.0.0仍然可以连接。

同理,也可以显示指定ip192.168.1.x, 此时 ip127.0.0.1不通,0.0.0.0通

总结:
监听0.0.0.0,三种均通
监听127.0.0.1或公开IP时, 指定的ip通,其余不通 ,但0.0.0.0通。

原理

0.0.0.0的表示默认路由,即连接外网的路由。网络中0.0.0.0的IP地址表示整个网络,即网络中的所有主机。它的作用是帮助路由器发送路由表中无法查询的包。如果设置了全零网络的路由,路由表中无法查询的包都将送到全零网络的路由中

我们查看 linux环境的 路由表:

# route -n
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.238.80.254   0.0.0.0         UG    0      0        0 eth0
10.238.88.0     10.238.88.1     255.255.255.0   U     0      0        0 eth1      //网段,多个地址,只要是该网段中的地址,则匹配成功
194.246.13.5    194.246.13.1    255.255.255.0   UH    0      0        0 eth2     //单一地址

0.0.0.0 类似 java中 switch 语法中的 default 关键字:

 witch (dest ip )  
 case 194.246.13.5 :
       把消息转发给 194.246.13.1
       break;
  case 10.238.88.2- 10.238.88.254:
       把消息转发给 10.238.88.1
       break;     
  default :
       把消息转发给   10.238.80.254
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐