127.0.0.1和0.0.0.0的区别

612 阅读15分钟

本文由"JackJiang"发布于"segmentfault",原题为《# 脑残式网络编程入门(八):你真的了解127.0.0.1和0.0.0.0的区别?》,收录时稍作改动。感谢原作者的分享。

引言

对于后端程序员来说,127.0.0.1和0.0.0.0这两个IP地址再熟悉不过了,看起来好像就那么回事,但真正较起真来,这两个IP地址到底有什么作用以及到底有什么不同?貌似谁可以轻松回答,但张嘴却又不知从何说起。。。(这要是面视,估计真会被这搞砸...)

本文将系统地总结127.0.0.1和0.0.0.0这两个IP地址的作用,以及它们之间的区别,希望能为你解惑。

IP地址表示

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

1)net-id:表示ip地址所在的网络号;
2)host-id:表示ip地址所在网络中的某个主机号码。

即:

IP-address ::=  { , }

就像下图这样:

image.png

IP地址分类

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

大致分类如下:

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

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

IP地址分类看下面这张图,可能更直接一些:

image.png

这里还有一张IP地址分类的思维导图:

image.png

特殊IP地址

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

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

具体来说,特殊的IP地址,主要是以下这些:

1)0.0.0.0:

严格说来,0.0.0.0已经不是一个真正意义上的IP地址了。它表示的是这样一个集合:所有不清楚的主机和目的网络。这里的“不清楚”是指在本机的路由表里没有特定条目指明如何到达。对本机来说,它就是一个“收容所”,所有不认识的“三无”人员,一律送进去。如果你在网络设置中设置了缺省网关,那么Windows系统会自动产生一个目的地址为0.0.0.0的缺省路由。

2)255.255.255.255:

限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机。如果翻译成人类的语言,应该是这样:“这个房间里的所有人都注意了!”这个地址不能被路由器转发。

3)127.0.0.1:

本机地址,主要用于测试。用汉语表示,就是“我自己”。在Windows系统中,这个地址有一个别名“Localhost”。寻址这样一个地址,是不能把它发到网络接口的。除非出错,否则在传输介质上永远不应该出现目的地址为“127.0.0.1”的数据包。

4)224.0.0.1:

组播地址,注意它和广播的区别。从224.0.0.0到239.255.255.255都是这样的地址。224.0.0.1特指所有主机,224.0.0.2特指所有路由器。这样的地址多用于一些特定的程序以及多媒体程序。如果你的主机开启了IRDP (Internet路由发现协议,使用组播功能)功能,那么你的主机路由表中应该有这样一条路由。

5)169.254.x.x:

如果你的主机使用了DHCP功能自动获得一个IP地址,那么当你的DHCP服务器发生故障,或响应时间太长而超出了一个系统规定的时间,Wingdows系统会为你分配这样一个地址。如果你发现你的主机IP地址是一个诸如此类的地址,很不幸,十有八九是你的网络不能正常运行了。

6)10.x.x.x、172.16.x.x~172.31.x.x、192.168.x.x:

私有地址,这些地址被大量用于企业内部网络中。一些宽带路由器,也往往使用192.168.1.1作为缺省地址。私有网络由于不与外部互连,因而可能使用随意的IP地址。保留这样的地址供其使用是为了避免以后接入公网时引起地址混乱。使用私有地址的私有网络在接入Internet时,要使用地址翻译(NAT),将私有地址翻译成公用合法地址。在Internet上,这类地址是不能出现的。

127.0.0.1和0.0.0.0的区别

七层协议

因为接下来会讲述这两个地址和七层协议之间的关系,所以这里先描述下。

物理层

  • 功能:负责在物理介质上传输比特流(0 和 1 的序列)。定义了电气、机械、过程和功能特性,以建立、维护和断开物理连接。
  • 硬件:网卡、中继器、集线器、调制解调器、网线、光纤等。
  • 举例:网卡将数字信号转换为电信号或光信号,通过网线或光纤传输到另一个设备的网卡,接收方网卡再将信号转换为数字信号。

2. 数据链路层

  • 功能:负责在两个相邻节点之间建立逻辑连接,进行数据的封装成帧、差错检测、流量控制和介质访问控制。
  • 硬件:网桥、交换机。
  • 举例:交换机根据 MAC 地址转发数据帧,确保数据帧到达正确的目的地。网桥连接两个不同的网络,并在它们之间转发数据帧。

3. 网络层

  • 功能:负责数据的寻址和路由选择,将数据包从源端传输到目的端。
  • 硬件:路由器。
  • 举例:路由器根据 IP 地址和路由表,选择最佳路径将数据包转发到下一个路由器,直到到达目的地。

4. 传输层

  • 功能:负责端到端的数据传输,提供可靠或不可靠的数据传输服务,以及流量控制和拥塞控制。
  • 硬件:通常没有直接对应的硬件,功能主要由操作系统和网络协议栈实现。
  • 举例:TCP 协议提供可靠的数据传输,通过确认机制、重传机制和流量控制确保数据完整到达。UDP 协议提供不可靠的数据传输,适用于实时性要求高的应用,如视频流和语音通话。

5. 会话层

  • 功能:负责建立、管理和终止会话,实现数据的同步和恢复。
  • 硬件:通常没有直接对应的硬件,功能主要由操作系统和网络协议栈实现。
  • 举例:在视频会议中,会话层负责建立和维护参与者之间的会话,确保音频和视频数据同步传输。

6. 表示层

  • 功能:负责数据的格式转换、加密解密和压缩解压缩,确保不同系统之间的数据可以正确理解。
  • 硬件:通常没有直接对应的硬件,功能主要由操作系统和网络协议栈实现。
  • 举例:在发送电子邮件时,表示层将文本转换为 MIME 格式,以便接收方可以正确显示。

7. 应用层

  • 功能:为用户提供网络服务和应用程序接口,实现各种网络应用。
  • 硬件:计算机、服务器、智能手机等终端设备。
  • 举例:浏览器、电子邮件客户端、FTP 客户端、视频播放器等都是应用层软件,它们通过网络协议与服务器进行通信,实现网页浏览、邮件收发、文件传输和视频播放等功能。

接下来,我们回到正题:127.0.0.1和0.0.0.0地址的区别是什么?

我们先来看下共同点:

1)都属于特殊地址;
2)都属于A类地址;
3)都是IPV4地址。

接下来我们分别看下这两个地址的具体作用,不同点就一目了解了。

0.0.0.0

0.0.0.0地址被用于表示所有可用的 IPv4 网络接口

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

注意:0.0.0.0 本身不对应任何特定的接口(网卡),它是一个通配符,表示监听所有可用的 IPv4 接口。是通过程序实现的通配的逻辑,进而接收网卡数据,而某个具体的ip地址(比如:192.168.1.12)是直接通过网卡实现接收数据。

我们将实现0.0.0.0程序逻辑称为zero。那么接收网络数据要走什么样的逻辑呢?

物理层-->数据链路层-->网络层(zero参与实现通配逻辑)-->传输层-->会话层-->表示层-->应用层

下面解释为什么zero逻辑出现在网络层:

首先将一个应用程序调用 bind() 函数并将 IP 地址指定为 0.0.0.0 时,操作系统会在传输层执行以下操作:

  1. 套接字创建:操作系统为应用程序创建一个套接字(socket),用于网络通信。
  2. 绑定到所有可用接口:操作系统将该套接字绑定到所有可用的 IPv4 网络接口上,包括物理网卡、虚拟网卡和环回接口。
  3. 监听传入连接:操作系统开始监听所有绑定接口上的传入连接请求。当有连接请求到达时,操作系统会接受连接,并将连接分配给应用程序。
  • 网络层:当数据包到达网络层时,操作系统会检查数据包的目的 IP 地址。如果目的 IP 地址与服务器上绑定的任何一个 IPv4 地址匹配(包括 0.0.0.0 对应的所有地址),操作系统会将数据包传递给传输层。

  • 数据链路层和物理层:当数据包到达物理网卡时,网卡驱动会检查数据包的目的 MAC 地址。如果目的 MAC 地址与网卡的 MAC 地址匹配,网卡会将数据包传递给操作系统进行进一步处理。

zero 用途总结:

  1. 默认路由
  • 情景:您的计算机连接到路由器,路由器的 IP 地址是 192.168.1.1。您想访问一个不在本地网络的网站,例如 www.example.com

  • 过程

    • 您的计算机首先会查找路由表,看是否有到 www.example.com 的特定路由。
    • 如果没有找到,它会使用默认路由,将数据包发送到默认网关(192.168.1.1)。
    • 路由器会负责将数据包转发到互联网上的 www.example.com 服务器。
  • 0.0.0.0 的作用:在路由表中,目的地址为 0.0.0.0 的路由表示默认路由,用于处理无法找到特定路由的情况。

  1. 服务器监听
  • 情景:您在本地计算机上运行一个 Web 服务器,希望它能被本地网络中的其他设备访问。

  • 过程

    • 您将 Web 服务器配置为监听 0.0.0.0 地址和端口 80。
    • 这意味着服务器会监听所有可用网络接口上的端口 80,包括本地环回接口(127.0.0.1)和连接到本地网络的以太网接口等。
    • 其他设备可以通过您的计算机的本地 IP 地址(例如 192.168.1.100)访问 Web 服务器。
  • 0.0.0.0 的作用:在服务器配置中,0.0.0.0 表示监听所有可用网络接口,使得服务器可以接受来自任何网络接口的连接请求。

  1. 客户端配置
  • 情景:您的计算机通过 DHCP 自动获取 IP 地址。在获取到 IP 地址之前,它的 IP 地址可能被设置为 0.0.0.0。
  • 0.0.0.0 的作用:在这种情况下,0.0.0.0 表示计算机尚未获取到有效的 IP 地址。

127.0.0.1

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

回环地址的定义:

所有发往该类地址的数据包都通过环回接口被loop back。

环回接口的定义:

环回接口(Loopback Interface)是一种特殊的虚拟网络接口,它不对应任何物理硬件。它的主要作用是在同一台计算机上的不同进程之间提供通信,实现本地进程间通信(IPC)的一种方式。

与物理网卡不同,环回接口的数据包不会通过物理介质传输,而是直接在计算机内部的内存中进行处理。这使得环回接口的通信速度非常快,并且不受网络环境的影响。

如果套接字bind 127.0.0.1。那么接收网络数据要走什么样的逻辑呢?

网络层("环回"实现的逻辑)-->传输层-->会话层-->表示层-->应用层

当一个数据包到达网络层时,操作系统会检查其目的 IP 地址。如果目的 IP 地址属于 127.0.0.0/8 网段(即回环地址),操作系统会执行以下操作:

  1. 识别回环地址:操作系统识别出这是一个回环地址,表示数据包应该在本地主机内部处理,而不是发送到外部网络。
  2. 绕过物理层和数据链路层:操作系统会绕过物理层和数据链路层,不会将数据包交给网卡驱动程序进行处理。
  3. 直接传递给传输层:操作系统会将数据包直接传递给传输层,就好像数据包是从外部网络接收到的。
  4. 传输层处理:传输层会根据数据包的协议类型(TCP 或 UDP)进行解封装,并将数据传递给相应的应用程序。

其他层的参与

  • 应用层、表示层和会话层:这些层在回环通信中仍然发挥作用,负责数据的生成、格式转换、会话管理等。
  • 数据链路层和物理层:由于数据包不会发送到物理网卡,所以数据链路层的数据帧封装和物理层的电信号传输都不会发生。

127主要用途:

  • 1)回环测试:通过使用ping 127.0.0.1 测试某台机器上的网络设备,操作系统或者TCP/IP实现是否工作正常;
  • 2)程序测试:大部分Web容器测试的时候绑定的本机地址。

**** 题外知识:127.0.0.1与localhost的关系***

相比127.0.0.1,localhost具有更多的意义。localhost是个域名,而不是一个ip地址。之所以我们经常把localhost与127.0.0.1认为是同一个是因为我们使用的大多数电脑上都讲localhost指向了127.0.0.1这个地址。

在ubuntu系统中,/ets/hosts文件中都会有如下内容:

127.0.0.1   localhost
127.0.1.1   52im-aliyun
#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,那么通过内网地址或外网地址都可以访问我的应用。但是如果我只绑定了内网地址,那么通过外网地址就不能访问。所以如果绑定0.0.0.0,也有一定安全隐患,对于只需要内网访问的服务,可以只绑定内网地址。