5

127.0.0.1和0.0.0.0地址的区别

 3 years ago
source link: https://aimuke.github.io/others/2021/02/09/network-specail-ip/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

原文地址 127.0.0.1和0.0.0.0地址的区别

1. 问题引入

之前在使用tomcat的时候,启动tomcat默认都会绑定到 127.0.0.1 这个地址,最近在使用hexo写博客的时候发现通过 hexo server 命令启动服务的时候绑定的ip地址是 0.0.0.0 。那么这两个IP地址到底有什么不同呢? 在讲解两个地址的不同之前,我们先回顾一下IP地址的基础知识。

2. IP地址分类

2.1 IP地址表示

IP地址由两个部分组成,net-idhost-id,即网络号和主机号。

  • net-id:表示ip地址所在的网络号。
  • host-id:表示ip地址所在网络中的某个主机号码。
IP-address ::=  { <Network-number>, <Host-number> }

2.2 IP地址分类

IP地址一共分为5类,即A~E,它们分类的依据是其net-id所占的字节长度以及网络号前几位。

  • A类地址:网络号占1个字节。网络号的第一位固定为0。
  • B类地址:网络号占2个字节。网络号的前两位固定为10。
  • C类地址:网络号占3个字节。网络号的前三位固定位110。
  • D类地址:前四位是1110,用于多播(multicast),即一对多通信。
  • E类地址:前四位是1111,保留为以后使用。

其中,ABC三类地址为单播地址(unicast),用于一对一通信,是最常用的。

2.3 特殊IP地址

特殊IP地址就是用来做一些特殊的事情。RFC1700中定义了以下特殊IP地址。

  • {0,0}: 网络号和主机号都全部为0,表示“本网络上的本主机”,只能用作源地址。
  • {0,host-id}: 本网络上的某台主机。只能用作源地址。
  • {-1,-1}:表示网络号和主机号的所有位上都是1(二进制),用于本网络上的广播,只能用作目的地址,发到该地址的数据包不能转发到源地址所在网络之外。
  • {net-id,-1}: 直接广播到指定的网络上。只能用作目的地址。
  • {net-id,subnet-id,-1}: 直接广播到指定网络的指定子网络上。只用作目的地址。
  • {net-id,-1,-1}: 直接广播到指定网络的所有子网络上。只能用作目的地址。
  • {127,}: 即网络号为127的任意ip地址。都是内部主机回环地址(loopback),永远都不能出现在主机外部的网络中。

3. 问题解答

接下来我们来看之前问过的问题:127.0.0.10.0.0.0 地址的区别是什么?我们先来看下共同点:

  • 都属于特殊地址。
  • 都属于A类地址。
  • 都是IPV4地址。

接下来我们分别看下这两个地址:

0.0.0.0

IPV4中,0.0.0.0地址被用于表示一个无效的,未知的或者不可用的目标。

  • 在服务器中, 0.0.0.0 指的是本机上的所有IPV4地址,如果一个主机有两个IP地址,192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是 0.0.0.0 ,那么通过两个ip地址都能够访问该服务。
  • 在路由中,0.0.0.0 表示的是默认路由,即当路由表中没有找到完全匹配的路由的时候所对应的路由。

用途总结:

  • 当一台主机还没有被分配一个IP地址的时候,用于表示主机本身。(DHCP分配IP地址的时候, 见评论)
  • 用作默认路由,表示”任意IPV4主机”。
  • 用来表示目标机器不可用。
  • 用作服务端,表示本机上的任意IPV4地址。

127.0.0.1

127.0.0.1 属于{127,}集合中的一个,而所有网络号为 127 的地址都被称之为回环地址(loopback),所以回环地址!=127.0.0.1,它们是包含关系,即回环地址包含127.0.0.1

回环地址:所有发往该类地址的数据包都应该被loop back。

用途:

  • 回环测试,通过使用 ping 127.0.0.1 测试某台机器上的网络设备,操作系统或者TCP/IP实现是否工作正常。
  • DDos攻击防御:网站收到DDos攻击之后,将域名A记录到127.0.0.1,即让攻击者自己攻击自己。
  • 大部分Web容器测试的时候绑定的本机地址。
  • 监听仅能从本机进行访问的服务。

localhost

相比 127.0.0.1 localhost 具有更多的意义。 localhost 是个域名,而不是一个ip地址。之所以我们经常把 localhost127.0.0.1 认为是同一个是因为我们使用的大多数电脑上都讲 localhost 指向了 127.0.0.1 这个地址。
在ubuntu系统中,/ets/hosts 文件中都会有如下内容:

127.0.0.1   localhost
127.0.1.1   jason-Lenovo-V3000
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

上面第一行是几乎每台电脑上都会有的默认配置。但是 localhost 的意义并不局限于 127.0.0.1

localhost 是一个域名,用于指代this computer或者this host,可以用它来获取运行在本机上的网络服务。在大多数系统中,localhost 被指向了IPV4的 127.0.0.1 和IPV6的 ::1

127.0.0.1    localhost
::1          localhost

所以,在使用的时候要注意确认IPV4还是IPV6

127.0.0.1 是一个环回地址。并不表示“本机”。 0.0.0.0 才是真正表示“本网络中的本机”。

在实际应用中,一般我们在服务端绑定端口的时候可以选择绑定到 0.0.0.0 ,这样我的服务访问方就可以通过我的多个ip地址访问我的服务。

比如我有一台服务器,一个外网地址A,一个内网地址B:

  • 如果我绑定的端口指定了0.0.0.0,那么通过内网地址或外网地址都可以访问我的应用。
  • 如果我只绑定了内网地址B,那么通过外网地址A就不能访问。
  • 如果我只绑定了127.0.0.1,那么就只能从本机通过 127.0.0.1 进行访问

所以如果绑定0.0.0.0,也有一定安全隐患,对于只需要内网访问的服务,可以只绑定内网地址。

5. 精彩回复

neko77java攻城狮 (https://juejin.cn/post/6844903886629634061)

一间漆黑静谧的屋子里,突然出现了一个婴儿。 剧烈的啼哭传遍了各个角落(新机入网,ip:0.0.0.0 子网掩码 255.255.255.255 广播消息)

DHCP1: w(゚Д゚)w DHCP2:(⊙ˍ⊙) DHCP3: …… DHCP1暴起吆喝一句【刚才是谁叫我?!xxxxxx】 DHCP2悠悠的道【谁新上来了?xxxxxx】 (DHCP查找合法地址,附在返回报文中)

婴儿:【收到DHCP1的消息了,我似乎是192.168.1.248】 婴儿:【DHCP1 DHCP2 DHCP3大家好,我是练习时长达两年半的个人练习生,马上要成为192.168.1.248,喜欢……,】

DHCP1,DHCP2,DHCP3【好了,好了,我们知道了,以后你就以192.168.1.248出道了】

(机器只接受最新达到的DHCP消息,拿到ip后并未修改,而是广播所有DHCP,收到ACK后机器再修改ip)

References


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK