要知道女神爱不爱你,你问她可能得不到答案,只是Ping测试网络是否畅通。
你知道Ping命令背后的原因吗?如果把127.0.0.1改成0.0.0或者localhost会怎么样?这些IP地址有什么区别?我在一次面试中遇到过这个问题。
我和采访者之间的场景可以在下面的动画中看到,以了解小白当时内心的阴影区域。事不宜迟,现在就手术吧。拔下网线以断开网络连接,然后在命令提示符窗口中输入Ping 127.0.0.1命令。
控制台进入ping 127.0.0.1。
$ ping 127 . 0 . 0 . 1 ping 127 . 0 . 0 . 1(127 . 0 . 0 . 1) : 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.080 ms64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.093 ms64 bytes from 127.0.0.1:
什么是127.0.0.1?
/* Address to loopback in software to local host. */#define INADDR_LOOPBACK0x7f000001 /* 127.0.0.1 */
IPv4地址有32位,IPv6地址有128位,因此IPv6地址空间比IPv4地址空间大得多。IPv4地址空间中只有大约43亿个可用地址。
IPv6地址空间中有超过340亿个可用地址。IPv4地址按每8位分组,每组用点分隔。IPv6地址按每16位分组,每组用冒号分隔。
如果多个连续组都是零,可以省略部分甚至全部。
IPV4中的环回地址是127.0.0.1,在IPV6中表示为:1。中间省略了连续的0,原因不是7个冒号,而是2个冒号:
因为IPV6地址中只允许两个连续的冒号。
还有一点:命令ping 127.0.0.1是在IPV4下使用的。IPV6下使用Ping6 :1命令。
ping是什么?
Ping命令是基于应用层的网络工具,可以测试两台主机之间的连接。具体来说,它向目标主机发送一个小数据包(通常为32字节),并等待目标主机返回响应数据包。
如果可以成功返回响应包,说明目标主机可以正常连接,否则说明连接有问题。在底层实现中,
ping命令使用Internet控制消息协议(ICMP),这是一种网络层协议,用于在IP网络中传输控制消息。
ping命令向目标主机发送ICMP Echo请求消息,目标主机收到消息后会返回ICMP Echo Reply消息作为响应。
这样就可以通过检查响应报文是否正常到达来判断目标主机的网络连接状态。
虽然ICMP协议和IP协议都属于网络层协议,但ICMP实际上是使用IP协议来传输消息。
所以这里大家可以简单的理解为ping一个IP,就是向一个IP地址发送消息。
TCP发送数据和ping的区别一般情况下,我们会使用TCP进行网络数据传输,所以可以看看它和ping的区别。
Ping和其他应用层软件属于OSI模型的同一应用层,但是它使用ICMP协议,工作在OSI模型的网络层,和传输层聊天软件使用的TCP协议不同。
使用TCP协议发送消息时,需要先创建一个socket,通过socket发送数据,进入传输层,带TCP头,网络层带IP头,数据链路层带MAC头,然后进入网卡的发送队列。
终于发出来了。而ping在创建socket时使用socket (af _ inet,SOCK_RAW,IP proto _ icmp),其中sock _ raw。。原始socket,工作在网络层。
因此,建立互联网控制消息协议更为合适。ping发送一个包,它以ICMP和IP头进入网络层,以MAC头进入数据链路层,然后进入网卡的发送队列,最后发送出去。因此,
本质上ping 跟普通应用发消息在程序流程上基本类似,但是它使用的协议不同,所以在网络层的处理上会有所不同。这也解释了为什么当你怀疑网络有问题的时候,别人会问你能否ping 通,
因为能ping 通说明网络通畅,其他应用程序也有可能正常工作。
为什么断网了还能
ping 通127.0.0.1
前面提到,有网的情况下,ping 最后是通过网卡将数据发送出去的。那么断网的情况下,网卡已经不工作了,ping 回环地址却一切正常,我们可以看下这种情况下的工作原理。
当应用程序向网络发送数据时,数据会从应用层逐层往下传递,依次经过传输层和网络层。对于ping 命令,它使用的是ICMP 协议,属于网络层协议。在ping 发送消息时,
系统会根据目标IP 地址在路由表中获取对应的路由信息,选择哪个网卡将消息发出。如果目标IP 是外网IP,则会从真实的网卡发出;如果目标IP 是回环地址,则会选择本地网卡。
本地网卡与真实的网卡不同,它是一种虚拟的网卡,没有ring buffer 等硬件设备。本地网卡将数据推入input_pkt_queue 链表中,这个链表是所有网卡共享的,
上面挂着发给本机的各种消息。消息被发送到这个链表后,会再次触发一个软中断。内核线程ksoftirqd 会处理软中断,当它接收到软中断时,会立即从链表中取出消息,
然后顺着数据链路层、网络层等层层往上传递,最终将消息传递给应用程序。对于ping 命令,它最终会收到目标机器回复的ICMP 响应消息,根据响应消息的内容来判断目标机器是否可达。
回环地址(loopback address)是一种特殊的IP地址,是在本机上进行网络通信时使用的地址。在IPv4协议中,回环地址为127.0.0.1。当使用ping回环地址时,
数据会直接从应用层进入传输层,再进入网络层,绕过了真实的物理网络接口,直接返回到本地主机,因此可以在没有网络连接的情况下进行ping通。除了ping回环地址外,
通过TCP等各种协议发送数据到回环地址也是走这条路径,整条路径从发到收都没有经过真实的网络接口。因此,127.0.0.1也被称为本地回环地址,因为数据不会出网络,在本机打个转就又回来了。
总结
127.0.0.1 是回环地址,表示本机的IP地址,而localhost 是域名,但是默认等同于127.0.0.1。当使用ping 命令ping 回环地址或本机地址时,
数据包都会经过lo0 '假网卡',然后在网络层和数据链路层等逻辑处理后,最终在即将出网卡之前,将数据插入到一个共享的链表input_pkt_queue 中,
触发软中断通知ksoftirqd 进行数据收取和处理的逻辑。因此,ping 回环地址和本机地址都不会离开本机,不会走出真实的网络环境,即使网络断开也能够正常ping 通回环地址。
如果服务器监听的是0.0.0.0,表示监听所有网卡的请求,此时使用127.0.0.1 或者本机地址都可以访问该服务。
标题:断网了,127.0.0.1还能 ping 通?
链接:https://www.52hkw.com/news/rj/70829.html
版权:文章转载自网络,如有侵权,请联系删除!