你真的了解127.0.0.1和0.0.0.0吗~

事出有因,前段时间老大让小姐姐在测试环境搭建一个ELK。我说我搭好了,但Kibana端口不知为啥没暴露出去,其他机子访问不了我的Kibana但确可以ping通这台机子...一个小伙伴马上用netstat命令确定到我把Kibana IP绑到127.0.0.1上了,然后我就收到了组内一堆 “ ..... ” 的回复。。

幸好阿姨带着口罩上班,不然他们可能看到我没洗的小红脸(。。嗯,做人就是要脸皮厚)。。

在了解127.0.0.1和0.0.0.0是啥之前(因为这个问题实在太常识了),我们先看一下为啥会有IP。。

网络传输需要解决的主要问题有两个: 发给谁通过怎么样的路线才能发给他(也就是路由)

我们先来看一下TCP/IP封装的数据包结构:


当我们发送数据时,按照应用层 —>数据链路层自上而下封装数据包。当我们接收数据时,按照数据链路层 —>应用层 进行拆包。这里我们再来看一下数据链路层以太网帧的结构:

每个网卡在出厂时就会有一个全世界唯一的MAC地址,就相当于是我们每个人在世界上都是唯一的。那MAC地址其实就能解决第一个 发给谁 的问题。那为啥还需要IP层呢?

想象你到世界上找一个叫Monica2333的人,你不可能大街上随便逮到一个人就问你认识Monica2333吗..(当然如果你真这么干了,请关注公众号 码农知识点,小姐姐在这里等你~)
你应该先搞清楚 Monica2333住址是在哪个国家哪个城市哪个区哪个街道,从国家-》城市-》区-》小区一步步定位,这么找人就符合常理了。。IP解决的就是网络上数据包的路由定位困难问题

IP怎么表达出“国家城市区”的概念呢,这就是IP地址定义的事了。

IP 地址用32位来表示,通常被分割为4个“8位”。以“点分十进制”表示成 [a.b.c.d] 的形式。同时这32bit又被划分为网络号主机号组成。比如10.100.122.2/24 这个IP: 10.100.122.2是“点分十进制”表示形式,/24 表示的是前24位是网络号,后8位是主机号。这个网络号其实充当的就是“国家城市区”的概念。比如我们只需要记住怎么去往10.100.122.x,就知道怎么去找10.100.122.1/24和10.100.122.2/24了。为了方便获取网络号 ,又出现一个子网掩码的概念。子网掩码就是网络号位上全为1,主机号全为0的IP地址。这样当
IP&子网掩码得到的就是IP的网络号。所以10.100.122.2/24的子网掩码就是255.255.255.0

好了,我们来看一下IPv4对IP地址的划分:


其中A/B/C类可用于表示公网IP。D类用于多播组号,使用这一类地址,属于某个组(相同网络号的)的机器都能收到,E类还留待使用。但是我们并不用记住公网IP是属于A/B/C类中哪一类,我们只需要用/24或/16这样的CIDR方式去区分IP的网络号和主机号就可以。

实际上,A/B/C类划分的IP显然是不够用每个地球人用的,我们日常在接入公网时,都需要走能有公网IP的网关。在整个公网内部,再分配私有IP地址给每个人上网使用就可以了。比如家庭常用的192.168.0.x/24 私有IP网段。

此外,在这五类IP地址基础上还划分出了特殊的IP网段

我看心情选了一部分。小伙伴也发现了,127.0.0.1和0.0.0.0终于出现了,但我们现在先不讲他们俩。我们再回到开始的第二个问题: 通过怎么样的路线才能发给他

IP路由

上面我们说了IP的目的就是将路由简单化,IP的网络号承担了"一组IP
的路由"出入口的作用。实际上网关就是这个出入口。不同局域网(IP网络号不同)的网络通信必须经过网关,相同局域网的网络通信可以靠广播和MAC地址来送达目标机器(也就是二层协议行的通)。

好了,假使我们从203.16.20.5/24 —> 203.16.24.4/24 发一个包,其中源IP和目标IP都是公网IP。那包的路由过程如下:

源机器网络程序在封装数据包的过程中发现目标机器和自己的IP不在同一局域网内,则需要通过网关将包从网卡发出去。1处的数据包结构为:

到了网关1,拆包发现目标IP地址是 203.16.24.4/24。查了下自己的路由表,发现要想访问 203.16.24.4/24,要从 203.16.22.2/24 这个口出去,下一跳为 203.16.22.4/24。此时2处的数据包结构为:

到了网关2,拆包发现目标IP地址是 203.16.24.4/24。查了下自己的路由表,发现要想访问 203.16.24.4/24,要从 203.16.24.1/24 这个口出去。此时3处的数据包结构为:

到了目标机器,拆包发现目标IP地址就是自己呀,所以进行更上层的拆包,把数据收进来就可以了。

我们可以发现这种方式的路由每经过一次局域网,MAC地址需要改变,但IP地址不需要改变。这种网关称为转发网关。而实际上还存在一种改变 IP 地址的网关,称为NAT 网关。我们就不展开了,小伙伴可以自行搜索。

现在我们知道IP/MAC地址/网关等怎么解决上述两个 发给谁 和 通过怎么样的路线才能发给目标机器 的问题了(当然还有路由策略等内容没有展开,我们这里只讨论如果有路由路线,咋发的问题)。但特么127.0.0.1和0.0.0.0到底有啥特殊的啊。。。

127.0.0.1 & 0.0.0.0

终于要切入正题了。。

127.0.0.1
从上面 特殊的IP网段中我们可以知道127.0.0.1表示的是回环IP地址(loopback address)。啥意思呢?所有发往目标IP为127.0.0.1的数据包都不会通过网卡发送到网络上,而是在数据离开网络层时将其回送给本机的有关进程。

形象些说就是因为发送数据包是从应用层 —>数据链路层自上而下一层层按照程序封装的,当到了网络层时,发现目标IP是127.0.0.1,就不会仔往下封装数据链路层了,而是把包又丢给需要往上层解析的队列中了。


实际上localhost通常也代表127.0.0.1。这是因为通常在本机Hosts文件会把localhost映射为127.0.0.1 。此外以127开头的IP地址都是回环地址,只是我们通常使用127.0.0.1。所以这只能在本机来回收发包的地址有啥用呢?本机测试用!!

0.0.0.0

0.0.0.0这个IP地址指的是没有路由的元地址,通常被用来表示无效的,未知的 或是 没有指定目标IP的地址。看不懂没关系,它其实相当于Java中的this,真表示啥要放到实际所处环境中去考虑。用处主要有:

  • 本机所有IP
    当考虑它在一台服务器中的作用时,它指代的就是这台机器上所有的IP。假如一台机器上有两个IP:203.16.20.5/24 和 203.16.24.4/24。如果我们把一个Java应用的IP绑定到了0.0.0.0:8080,那访问203.16.20.5:8080 和 203.16.24.4:8080都可以与这个Java应用建立连接。

  • 默认路由

上面讲IP路由的时候我们提到了路由表。路由表就是一个记录数据包下一跳应该去哪的路由规则。每一条规则至少包含三项信息:

网络ID:就是目标地址的网络ID。
子网掩码:用来判断IP所属网络。
下一跳地址/接口:就是数据在发送到目标地址的旅途中下一站的地址。

假设一个IP匹配了多条路由规则,则子网越小的越优先,也就是/n这样的CIDR越大的越优先。
而假如配置了0.0.0.0/0 -> via 111.222.1.254这样的路由策略,表示的是当解析不到任何精确的路由规则时,下一跳就统统跳往111.222.1.254。0.0.0.0在这里就是默认路由的意思。

  • DHCP
    当一个网络设备初次启动时,假如没有配置IP。它需要通过DHCP协议向所处局域网要一个IP。但DHCP是建立在UDP 上的协议,没IP咋发包要IP啊。这里0.0.0.0/0的作用就是在没要到IP时所使用的源IP。放张协议图,感兴趣的小伙伴可进一步了解:

为了首尾呼应,小姐姐再讲一个网上看到的一个不那么冷的笑话吧。。

bitchcheker是一个扬言要攻击Elch的黑客:

至此你有没有更了解127.0.0.1呀~

欢迎关注我的公众号:「码农知识点」,和我交流讨论~

参考资料:
https://www.zhihu.com/question/20717354
https://time.geekbang.org/column/article/8590
https://www.tech-faq.com/127-0-0-1.html
https://www.howtogeek.com/225487/what-is-the-difference-between-127.0.0.1-and-0.0.0.0/

你可能感兴趣的:(你真的了解127.0.0.1和0.0.0.0吗~)