0.0.0.0、127.0.0.1和localhost的区别
对于 Web 前端开发来说,启动本地服务,常用 http://localhost 或者 http://192.168.*.* 来访问。常通,我们把 localhost 访问称为本地访问,类似的,还有 127.0.0.1 、0.0.0.0 访问;192.168.*.* 称为内网 IP 地址访问,用于同一网段其他主机访问本主机。
在 webpack 配置 devServer 时会发现,host 配置为 localhost 或者 127.0.0.1 ,服务启动后,是无法用 192.168.*.* 访问的,同样,配置为 192.168.*.* ,则无法用 localhost 等地址访问。但是,配置为 0.0.0.0,无论是 localhost 、 127.0.0.1 ,还是 192.168.*.* 都可以访问了。
devServer: {
host: '0.0.0.0',
port: 8080,
}
本文源于此场景,总结了 127.0.0.1、0.0.0.0 和 localhoat 的意义以及它们之间的区别。
IP地址分类
IP 是 TCP/IP 协议族中最为核心的协议。所有的 TCP、UDP、ICMP 及 IGMP 数据都以 IP 数据报格式传输。
IP地址表示
IP 地址由两个部分组成,net-id 和 host-id,即网络号和主机号:
- net-id:表示 IP 地址所在的网络号;
- host-id:表示 IP 地址所在网络中的某个主机号码。
即:IP-address ::= { <Network-ID>, <Host-ID> }。如下图:

IP地址分类
IP 地址一共分为5类,即 A~E,它们分类的依据是其 net-id 所占的字节长度以及网络号前几位。
大致分类如下:
- A类地址:网络号占1个字节,网络号的第一位固定为0;
- B类地址:网络号占2个字节,网络号的前两位固定为10;
- C类地址:网络号占3个字节,网络号的前三位固定位110;
- D类地址:前四位是1110,用于多播(multicast),即一对多通信;
- E类地址:前四位是1111,保留为以后使用。
其中,ABC三类地址为单播地址(unicast),用于一对一通信,是最常用的。

特殊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),永远都不能出现在主机外部的网络中。
0.0.0.0
IPV4 中,0.0.0.0 地址被用于表示一个无效的,未知的或者不可用的目标。 严格说来,0.0.0.0 已经不是一个真正意义上的 IP 地址了。它表示的是这样一个集合:所有不清楚的主机和目的网络。这里的“不清楚”是指在本机的路由表里没有特定条目指明如何到达。
在路由中,0.0.0.0 表示的是默认路由,即当路由表中没有找到完全匹配的路由的时候所对应的路由。
在服务器中,0.0.0.0 指的是本机上的任何地址,包括回环地址。 任何地址的意思是,不管主机有多少个网口,多少个IP,如果监听本机的 0.0.0.0 上的端口,就等于监听机器上的所有 IP 端口。数据报的目的地址只要是机器上的一个 IP 地址,就能被接受。比如:一个主机有两个 IP 地址,192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是 0.0.0.0,那么通过两个 IP 地址都能够访问该服务。
在不同上下文中,表示的意义不同:
- 当一台主机还没有被分配一个 IP 地址的时候,用于表示主机本身。(DHCP 分配 IP 地址的时候)
- 用作默认路由,表示 ”任意IPV4主机”;
- 用来表示目标机器不可用;
- 用作服务端,表示本机上的任意地址。
127.0.0.1
127.0.0.1 是最著名的保留IP地址 。 该地址称为回环地址 ,用于测试网络适配器或集成芯片。所谓回环地址,即所有发往该类地址的数据包都应该被回送,也就是,通过本地网络或公共因特网发送的 127.0.0.1 数据包不会出现在网络传输过程中。
从技术上讲,从 127.0.0.0 到 127.255.255.255 的整个范围都是为回送目的而保留的,但在现实世界中几乎不会看到 127.0.0.1 以外的任何内容。
127.0.0.1 通常分配给 loopback 接口,用来测试本机的 TCP/IP 协议栈。loopback 是一个特殊的网络接口(可理解成虚拟网卡),用于本机中各个应用之间的网络交互。只要操作系统的网络组件是正常的,loopback 就能工作。
可以理解为本机有三块网卡,一块网卡叫做 loopback(虚拟网卡),另外一块网卡叫做 ethernet (以太网,有线网卡),另外一块网卡叫做 wlan(Wireless Local Area Network,无线网卡)。
本机 IP 是真实网卡的 IP(如:私有 IP 192.168.x.x),具体来说有线无线各有一个 ,而 127.0.0.1 则是loopback(虚拟网卡)的 IP。
主要用途:
- 回环测试:通过使用 ping 127.0.0.1 测试某台机器上的网络设备,操作系统或者 TCP/IP 实现是否工作正常;
- DDos 攻击防御:网站收到 DDos 攻击之后,将其域名记录到 127.0.0.1,即让攻击者自己攻击自己;
- 程序测试:大部分 Web 容器测试的时候绑定的本机地址。
localhost
localhost 是个域名,而不是一个 IP 地址。 之所以我们经常把 localhost 与 127.0.0.1 认为是同一个,是因为我们使用的大多数系统中,都将 localhost 指向了 IPV4 的 127.0.0.1 和 IPV6 的 ::1。
以 Mac 为例,找到 /etc/hosts 文件,打开可以看到如下内容:
# /etc/hosts
127.0.0.1 localhost
::1 localhost
事实上,你也可以将 localhost 换成其他名称,也可以新增一个域名指向。
# /etc/hosts
127.0.0.1 localhost
::1 localhost
127.0.0.1 lizh
hosts 是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的 IP 地址建立一个关联“数据库”。当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从 hosts 文件中寻找对应的 IP 地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交 DNS 域名解析服务器进行 IP 地址的解析。 需要注意的是,hosts 文件配置的映射是静态的,如果网络上的计算机更改了 IP 地址,hosts 文件也要及时更新对应 IP 地址,否则将不能访问。
其他IP
255.255.255.255
一个特殊的受限广播地址。 对本机来说,只发送到本地网络的所有主机,路由器默认不转发目的地址为受限的广播地址的数据报,路由器将此类广播隔离到子网。注意, 255.255.255.255 不能被任何一台独立主机拥有。
比如:电脑刚刚启动好,我们还没有 IP,这个时候最重要的事情就是让自己获得一个可用的 IP。但是,这个时候,我们也不知道 DHCP 服务器(自动分配 IP 地址和子网掩码的服务器)的 IP 是什么, 那么就可以用 255.255.255.255 地址广播一个报文,发送给局域网内的所有主机。其他主机收到广播报文之后,发现不是发给自己的,会把报文丢弃;DHCP 服务器收到广播后,刚会给我们返回一个可使用 IP 地址。
224.0.0.1
组播地址。 注意它和广播的区别:广播是单台设备向网络中所有主机发送数据,而组播是向指定的一组主机发送主机。从 224.0.0.0 到 239.255.255.255 都是这样的地址。224.0.0.1 特指所有主机,224.0.0.2 特指所有路由器。这样的地址多用于一些特定的程序以及多媒体程序。如果你的主机开启了 IRDP (Internet 路由发现协议,使用组播功能)功能,那么你的主机路由表中应该有这样一条路由。
169.254.x.x
如果你的主机使用了 DHCP 功能自动获得一个 IP 地址,那么当你的 DHCP 服务器发生故障,或响应时间太长而超出了一个系统规定的时间,Wingdows 系统会为你分配这样一个地址。如果你发现你的主机 IP 地址是一个诸如此类的地址,很不幸,十有八九是你的网络不能正常运行了。
10.x.x.x、172.16.x.x~172.31.x.x、192.168.x.x
私有 IP 地址,也被称为本地 IP 地址 。
私有 IP 地址是保留供路由器或其他网络地址转换(NAT)设备内部使用的IP地址 。私人 IP 地址与公共 IP 地址相反, 公共 IP 地址是公共的, 不能在家庭或商业网络中使用。
互联网号码分配机构(IANA)保留下列IP地址块用作专用 IP 地址:
- 10.0.0.0 至 10.255.255.255
- 172.16.0.0 至 172.31.255.255
- 192.168.0.0 到 192.168.255.255
上面的第一组 IP 地址允许超过 1600 万个地址,第二组超过 100 万,最后一组超过 65000 个。私有 IP 地址的另一个范围是169.254.0.0到169.254.255.255,但仅用于自动专用IP寻址 (APIPA)。
自动专用IP寻址(APIPA)是 Microsoft Windows 支持的本地 Internet 协议版本4(IPv4)网络的 DHCP 故障转移机制。 借助 APIPA,当 DHCP 服务器无法工作时,DHCP 客户端可以获得 IP 地址 。 APIPA 存在于Windows 的所有现代版本中,包括 Windows 10。
家庭或商业网络中的设备不是使用公共 IP 地址(其供应有限),而是私有 IP 地址提供完全独立的一组地址,这些地址仍允许在网络上访问,但不占用公共IP地址空间。使用私有地址的私有网络在接入 Internet 时,要使用地址翻译 (NAT),将私有地址翻译成公用合法地址。
比如:192.168.1.1 是一个 C 类 IP 地址,可以是局域网内任何一台主机,取决于路由器把这个地址分配给了哪台主机。一些宽带路由器,也往往使用 192.168.1.1 作为缺省地址。
总结
127.0.0.1 是一个回环地址,并不表示“本机”,可以理解为主机的虚拟网卡的 IP;localhost 是一个通过 hosts 文件指向 127.0.0.1 的域名,可以理解为 127.0.0.1 的别名;192.168.x.x 是本地 IP 地址,可以理解为真实网卡(有线、无线网卡)在某一网段内的 IP 地址。0.0.0.0 才是真正表示 “本网络中的本机”,它监听包括回环地址、私有 IP 地址在内的所有可以访问本机的地址。
所以,在实际应用中,我们启动本地服务时,可以选择绑定到 0.0.0.0,这样就可以通过多种方式访问到本地。如: 0.0.0.0、127.0.0.1、localhost,以及私有地址 192.168.x.x 等。
参考资料
脑残式网络编程入门(八):你真的了解127.0.0.1和0.0.0.0的区别?