事出有因,前段时间老大让小姐姐在测试环境搭建一个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网络号不同)的网络通信必须经过网关,相同局域网的网络通信可以靠广播和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
从上面 特殊的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: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在这里就是默认路由
的意思。
0.0.0.0/0
的作用就是在没要到IP时所使用的源IP
。放张协议图,感兴趣的小伙伴可进一步了解:为了首尾呼应,小姐姐再讲一个网上看到的一个不那么冷的笑话吧。。
bitchcheker是一个扬言要攻击Elch的黑客:
至此你有没有更了解127.0.0.1呀~