硬核图解!断网了,还能ping通 127.0.0.1 吗?为什么?

【计算机网络】0.0.0.0与127.0.0.1的区别、默认路由原理 文章目录前言区别 前言 最近在项目开发中发现一个奇怪的问题,当服务器与客户端在同一台机器上时,用服务器ip(本地主机ip)192.168.1.xxx、127.0.0.1以及0.0.0.0都能登陆服务器,于是找点资料研究一下。 其实,最开始是发现服务器ip填0能登陆成功,后来知道了系统自动补全ip地址,什么意思呢,就是如果你填0或0.0或0.0.0,系统都会自动补全ip为0.0.0.0。下面就简要介绍一下这三种ip的区别。 区别 相信读者都知道,ipv4是点分十进制模式,每个ip地址都有特殊的含义。首先说一下 阅读详情

你 女神爱不爱你 ,你问她,她可能不会告诉你。

但 网通不通 ,你 ping 一下就知道了。

可能看到标题,你就知道答案了,但是你了解背后的原因吗?那如果把 127.0.0.1 换成 0.0.0.0 或 localhost 会怎么样呢?你知道这几个 IP 有什么区别吗?

以前面试的时候就遇到过这个问题,大家看个动图了解下面试官和我当时的场景,求当时小白的心里阴影面积。

话不多说,我们直接开车。

拔掉网线,断网。

然后在控制台输入 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 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.093 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.074 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.079 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.079 ms
^C
--- 127.0.0.1 ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.074/0.081/0.093/0.006 ms

说明,拔了网线, ping 127.0.0.1 是 能ping通的 。

其实这篇文章看到这里,标题前半个问题已经被回答了。但是我们可以再想深一点。

为什么断网了还能 ping 通 127.0.0.1 呢?

这能说明你不用交网费就能上网吗?

不能。

首先我们需要进入基础科普环节。

不懂的同学看了就懂了,懂的看了就当查漏补缺吧。

什么是127.0.0.1

首先,这是个 IPV4 地址。

IPV4 地址有 32 位,一个字节有 8 位,共 4 个字节。

其中 127 开头的都属于回环地址 ,也是 IPV4 的特殊地址,没什么道理,就是人为规定的。

而 127.0.0.1 是 众多 回环地址中的一个。之所以不是 127.0.0.2 ,而是 127.0.0.1 ,是因为源码里就是这么定义的,也没什么道理。

/* Address to loopback in software to local host.  */
#define    INADDR_LOOPBACK     0x7f000001  /* 127.0.0.1   */

回环地址

IPv4 的地址是 32 位的,2的32次方,大概是 40+亿 。地球光人口就76亿了,40亿IP这点量, 塞牙缝都不够 ,实际上 IP也确实用完 了。

所以就有了 IPV6 , IPv6 的地址是 128 位的,大概是2的128次方≈ 10的38次方 。据说地球的沙子数量大概是 10的23次方 ,所以IPV6的IP可以认为用不完。

IPV4以8位一组,每组之间用 . 号隔开。

IPV6就以16位为一组,每组之间用 : 号隔开。如果全是0,那么可以省略不写。

ipv6回环地址

在IPV4下的回环地址是 127.0.0.1 ,在 IPV6 下,表达为 ::1 。中间把 连续的0 给省略了,之所以不是 7个 冒号 ,而是 2个冒号: , 是因为一个 IPV6 地址中 只允许出现⼀次两个连续的冒号 。

多说一句:在IPV4下用的是 ping 127.0.0.1 命令。在IPV6下用的是 ping6  ::1 命令。

什么是 ping

ping 是应用层命令,可以理解为它跟游戏或者聊天软件属于同一层。只不过聊天软件可以收发消息,还能点个赞什么的,有很多复杂的功能。而 ping 作为一个小软件,它的功能比较简单,就是 尝试 发送一个小小的消息到目标机器上,判断目的机器是否 可达 ,其实也就是判断目标机器网络是否能连通。

ping应用的底层,用的是网络层的 ICMP协议 。

IP和ICMP和Ping所在分层

虽然ICMP协议和IP协议 都属于网络层协议 ,但其实 ICMP也是利用了IP协议进行消息的传输 。

ip和icmp的关系

所以,大家在这里完全可以简单的理解为 ping 某个IP 就是往某个IP地址发个消息。

TCP发数据和ping的区别

一般情况下,我们会使用 TCP 进行网络数据传输,那么我们可以看下它和 ping 的区别。

ping和普通发消息的关系

ping和其他应用层软件都属于 应用层 。

那么我们横向对比一下,比方说聊天软件,如果用的是TCP的方式去发送消息。

为了发送消息,那就得先知道往哪发。linux里万物皆文件,那你要发消息的目的地,也是个文件,这里就引出了socket 的概念。

要使用 socket , 那么首先需要创建它。

在 TCP 传输中创建的方式是 socket(AF_INET, SOCK_STREAM, 0); ,其中 AF_INET 表示将使用 IPV4 里 host:port 的方式去解析待会你输入的网络地址。 SOCK_STREAM 是指使用面向字节流的 TCP 协议, 工作在传输层 。

创建好了 socket 之后,就可以愉快的把要传输的数据写到这个文件里。调用 socket 的 sendto 接口的过程中进程会从 用户态进入到内核态 ,最后会调用到 sock_sendmsg 方法。

然后进入传输层,带上 TCP 头。网络层带上 IP 头,数据链路层带上 MAC 头等一系列操作后。进入网卡的 发送队列 ring buffer ,顺着网卡就发出去了。

回到 ping , 整个过程也基本跟 TCP 发数据类似,差异的地方主要在于,创建 socket 的时候用的是   socket(AF_INET,SOCK_RAW,IPPROTO_ICMP) , SOCK_RAW 是原始套接字 , 工作在网络层 , 所以构建 ICMP (网络层协议)的数据,是再合适不过了。ping 在进入内核态后最后也是调用的   sock_sendmsg 方法,进入到网络层后加上 ICMP和IP头 后,数据链路层加上 MAC头 ,也是顺着网卡发出。因此 本质上ping 跟 普通应用发消息 在程序流程上没太大差别。

这也解释了 为什么当你发现怀疑网络有问题的时候,别人第一时间是问你能ping通吗? 因为可以简单理解为ping就是自己组了个数据包,让系统按着其他软件发送数据的路径往外发一遍,能通的话说明其他软件发的数据也能通。

为什么断网了还能 ping 通 127.0.0.1

前面提到,有网的情况下,ping 最后是 通过网卡 将数据发送出去的。

那么断网的情况下,网卡已经不工作了,ping 回环地址却一切正常,我们可以看下这种情况下的工作原理。

ping回环地址

从应用层到传输层再到网络层。这段路径跟ping外网的时候是几乎是一样的。到了网络层,系统会根据目的IP,在路由表中获取对应的 路由信息 ,而这其中就包含选择 哪个网卡 把消息发出。

当发现 目标IP是外网IP 时,会从"真网卡"发出。

当发现 目标IP是回环地址 时,就会选择 本地网卡 。

本地网卡,其实就是个 "假网卡" ,它不像"真网卡"那样有个 ring buffer 什么的,"假网卡"会把数据推到一个叫 input_pkt_queue 的 链表 中。这个链表,其实是所有网卡共享的,上面挂着发给本机的各种消息。消息被发送到这个链表后,会再触发一个 软中断 。

专门处理软中断的工具人 "ksoftirqd" (这是个 内核线程 ),它在收到软中断后就会立马去链表里把消息取出,然后顺着数据链路层、网络层等层层往上传递最后给到应用程序。

工具人ksoftirqd

ping 回环地址和 通过TCP等各种协议发送数据到回环地址 都是走这条路径。整条路径从发到收,都没有经过"真网卡"。 之所以127.0.0.1叫本地回环地址,可以理解为,消息发出到这个地址上的话,就不会出网络,在本机打个转就又回来了。 所以断网,依然能 ping 通 127.0.0.1 。

ping回环地址和ping本机地址有什么区别

我们在mac里执行 ifconfig 。

$ ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    inet 127.0.0.1 netmask 0xff000000
    ...
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    inet 192.168.31.6 netmask 0xffffff00 broadcast 192.168.31.255
    ...

能看到 lo0 ,表示本地回环接口,对应的地址,就是我们前面提到的 127.0.0.1 ,也就是 回环地址 。

和 eth0 ,表示本机第一块网卡,对应的IP地址是 192.168.31.6 ,管它叫 本机IP 。

之前一直认为ping本机IP的话会通过"真网卡"出去,然后遇到第一个路由器,再发回来到本机。

为了验证这个说法,可以进行抓包,但结果跟上面的说法并不相同。

ping 127.0.0.1

ping 本机地址

可以看到 ping 本机IP 跟 ping 回环地址一样,相关的网络数据,都是走的 lo0 ,本地回环接口,也就是前面提到的 "假网卡" 。

只要走了本地回环接口,那数据都不会发送到网络中,在本机网络协议栈中兜一圈,就发回来了。因此 ping回环地址和ping本机地址没有区别 。

127.0.0.1 和 localhost 以及 0.0.0.0 有区别吗

回到文章开头动图里的提问,算是面试八股文里的老常客了。

以前第一次用 nginx 的时候,发现用这几个 IP ,都能正常访问到 nginx 的欢迎网页。一度认为这几个 IP 都是一样的。

访问127.0.0.1:80

访问localhost:80

访问0.0.0.0:80

访问本机的IP地址

但本质上还是有些区别的。

首先 localhost 就不叫 IP ,它是一个域名,就跟 "baidu.com" ,是一个形式的东西,只不过默认会把它解析为 127.0.0.1 ,当然这可以在 /etc/hosts 文件下进行修改。

所以默认情况下,使用 localhost 跟使用   127.0.0.1 确实是没区别的。

其次就是 0.0.0.0 ,执行 ping 0.0.0.0  ,是会失败的,因为它在 IPV4 中表示的是无效的 目标地址 。

$ ping 0.0.0.0
PING 0.0.0.0 (0.0.0.0): 56 data bytes
ping: sendto: No route to host
ping: sendto: No route to host

但它还是很有用处的,回想下,我们启动服务器的时候,一般会 listen 一个 IP 和端口,等待客户端的连接。

如果此时 listen 的是本机的 0.0.0.0 , 那么它表示本机上的 所有IPV4地址 。

/* Address to accept any incoming messages. */
#define    INADDR_ANY      ((unsigned long int) 0x00000000) /* 0.0.0.0   */

举个例子。刚刚提到的 127.0.0.1 和 192.168.31.6 ,都是本机的IPV4地址,如果监听 0.0.0.0 ,那么用上面两个地址,都能访问到这个服务器。

当然, 客户端 connect 时,不能使用 0.0.0.0 。必须指明要连接哪个服务器IP。

总结

  • 127.0.0.1 是 回环地址 。 localhost 是 域名 ,但默认等于 127.0.0.1 。

  • ping 回环地址和 ping 本机地址,是一样的,走的是 lo0 "假网卡" ,都会经过网络层和数据链路层等逻辑,最后在快要出网卡前 狠狠拐了个弯 , 将数据插入到一个 链表 后就 软中断 通知 ksoftirqd 来进行 收数据 的逻辑, 压根就不出网络 。所以断网了也能 ping 通回环地址。

  • 如果服务器 listen 的是 0.0.0.0 ,那么此时用 127.0.0.1 和本机地址 都可以 访问到服务。

看完三件事

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。

关注公众号 『 Java斗帝 』,不定期分享原创知识。

同时可以期待后续文章ing🚀

windows在使用ping 127.0.0.1时出现一般故障的解决方案 本文主要介绍了windows在使用ping 127.0.0.1时出现一般故障的解决方案,希望能对使用windows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 阅读详情

相关推荐

【车辆仿真】从0开始建立dSPACE RT Simulink工程:CAN通信(RTICANMM方法)

【工程环境信息】:本文基于链接文章搭建SCALEXIO Rack RTPC总线节点,用于与AutoBox通信硬件:上位机:惠普台式PC(Windows 11专业版)下位机(实时机):AutoBox (DS1006)板卡:DS6342软件:本文所使用的DBC链接提示:以下是本篇文章正文内容,下面案例可供参考!!!的部分一定记得配置,其他的按需配置RTICANMM的灵活度非常高,尽可能参考Help文档,理解相应的配置内容官方有RTICANMM的样例工程,在下方路径。

winnizap的博客 2381

脑残式网络编程入门(八):你真的了解127.0.0.1和0.0.0.0的区别?

本文由“小姐姐养的狗”原创发布于“小姐姐味道”公众号,原题《127.0.0.1和0.0.0.0地址的区别》,收录时有优化和改动。感谢原作者的分享。 一、引言 对于后端程序员来说,127.0.0.1和0.0.0.0这两个IP地址再熟悉不过了,看起来好像就那么回事,但真正较起真来,这两个IP地址到底有什么作用以及到底有什么不同?貌似谁可以轻松回答,但张嘴却又不知从何说起。。。(这要是面视,估计真会...

imtech4713的博客 567

【OpenCV3】cv::compare()使用详解

cv::compare()主要用于两个图像之间进行逐像素的比较,并输出比较的结果。具体用法如下: cv::compare() bool cv::compare( cv::InputArray src1, // 输入数组1 cv::InputArray src2, // 输入数组2 cv::OutputArray dst, // 输出数组 int cmpop // 比较操作子,见下表 ...

guduruyu的专栏 9761

ping 127.0.0.1和ping本地ip、ping网关、ping远程网站分别测试什么

ping 127.0.0.1    ping 127.0.0.1 是你本地主机的环回地址,实际上只要是127.0.0.1到127.255.255.254都是你本地主机环回地址,它能ping通,说明你的TCP/IP协议栈没问题。如果ping不通,你就得检查TCP/IP协议栈,或者重新安装它。 作用:用于检查本地主机TCP/IP协议栈是否正常。(用法如下)    通过ipconfig命令可以查看到笔者的本地IP为192.168.2.103,为了充分看到实验测试结果,笔者把网卡禁用;然后在运行

异次元网络的博客 3万+

Silvaco TCAD实战 | SiC MOSFET工艺仿真与关键参数DOE分析

本文详细介绍了使用Silvaco TCAD进行SiC MOSFET工艺仿真与关键参数DOE分析的实战方法。通过外延生长建模、离子注入工艺调试等步骤,结合DOE分析优化器件性能,帮助工程师在设计阶段预判电学特性,提升产品可靠性。文章还分享了网格划分、界面态建模等实用技巧,助力实现从仿真到产品的闭环验证。

weixin_30235225的博客 507

ADS谐波平衡仿真自动优化报错?三步搞定HB控件设置(附常见错误排查)

本文针对ADS谐波平衡仿真在自动优化中常见的报错问题,提供了三步核心排查法。首先检查并禁用HB控件中可能导致冲突的小信号仿真模式,其次合理化仿真频率与扫描参数设置,最后审视优化变量与目标的定义。通过精准配置HB控件以适配自动优化流程,能有效解决大多数仿真失败问题,确保非线性电路设计顺利进行。

c2d3e4f的博客 790

ip地址0.0.0.0与127.0.0.1的区别(转载)

原文链接:http://blog.csdn.net/ttx_laughing/article/details/58586907 最近在项目开发中发现一个奇怪的问题,当服务器与客户端在同一台机器上时,用服务器ip(本地主机ip)192.168.1.xxx、127.0.0.1以及0.0.0.0都能登陆服务器,于是找点资料研究一下。其实,最开始是发现服务器ip填0能登陆成功,后来知道了系统...

1万+

步进电机驱动算法——梯形加减速算法

目录步进电机梯形加减速梯形加减速算法原理分析算法实现 步进电机梯形加减速 电机的控制方式一般分为开环控制与闭环控制两种控制方式,其中开环控制原理框图如下: 这种种控制方式的特点是:控制简单、实现容易、价格较低,这种开环控制方式,负载位置对控制电路没有反馈。 对于步进电机,控制脉冲的输入并不依赖于转子的位置,而是按一固定的规律发出控制脉冲,如果励磁变化太快,电机不能移动到新的位置,那么实际负载位置与理想位置就会产生一个偏差,就有可能出现失步或者过冲现象,所以需要使用加减速算法。 梯形加减速算法,S加减速算法等

aaa376070331的博客 3万+

TCP/IP的灵魂十问:硬核拆解协议核心机制与高频面试题

一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达主机2,由于新连接和老连接的端口号是一样的,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。32位IP地址分为网络位和地址位,这样做可以减少路由器中路由表记录的数目,有了网络地址,就可以限定拥有相同网络地址的终端都在同一个范围内,那么路由表只需要维护一条这个网络地址的方向,就可以找到相应的这些终端了。

z19981的博客 965

从平面到立体:一张图看懂MOSFET、FinFET到GAAFET的演变史(附结构对比图)

本文深入解析了半导体晶体管从平面MOSFET到三维FinFET,再到全环绕栅极GAAFET的技术演进历程。通过结构对比图和物理原理分析,揭示了每一次创新如何解决短沟道效应等关键挑战,推动芯片性能提升。特别关注GAAFET作为最新技术突破的架构特点和性能优势。

weixin_30892037的博客 695

SAP 替代关系完全替代简介

这里产生了成品物料的计划订单,我们查看计划订单中BOM的变化,如下图可以看到物料的需求仍然落在了优先级为1的这个302300005555这个物料上面,并没有考虑到302300006666的这个库存,和我们理解的MRP的完全替代不一样,按我们的理解需求应该是要落在302300006666这个物料料,但是MRP计算后并没有这样进行分配。最近用户在对长周期物料进行备料的时候又提出替代料的问题,主料库存不足的时候需要考虑替代料的在途库存,经常会忘了SAP标准的替代料逻辑,这次一次性把这个逻辑写清楚。

我小时候很黑的博客 1744

计算机网络 | 网络诊断双刃剑:Tracert路由追踪实战与Windows防火墙端口配置指南

本文介绍了网络故障排查的两大实用技巧:路由追踪和防火墙端口配置。路由追踪部分详细解析了tracert命令的用法和输出结果,重点讲解了如何识别正常星号(*)跳转和真正的网络故障。防火墙配置部分提供了图形界面和命令行两种开放端口的方法,并强调了网络配置文件选择的重要性。文章还简要提及了使用Wireshark进行TCP三次握手分析的进阶技巧,帮助读者建立从基础到深入的网络诊断能力。这些方法共同构成了定位和解决网络连接问题的完整工具箱。

青春木鱼的博客 400

MATLAB基础应用精讲-【数模应用】数字预失真(DPD)(附MATLAB代码实现)

近年来,随着无线通信技术的发展,高功率放大器 (PA) 在提高信号传输功率的同时,也带来了非线性失真问题。PA的非线性失真会造成信号频谱扩展、功率下降、邻道干扰等问题,严重影响系统性能。为了克服PA的非线性失真,数字预失真 (DPD) 技术应运而生。DPD技术通过在发射机中引入一个非线性模块,对信号进行预失真处理,从而补偿PA的非线性失真。

qq_36130719的博客 896

0.0.0.0这个IP地址代表什么?

当socket绑定的IP地址0.0.0.0时, 表示监听本机上的所有IP地址, 也就是接收本机所有网卡发到本进程端口的请求 在网络中, 0.0.0.0表示整个网络中的所有主机, 它的作用是帮助路由器转发路由表中查询不到的包 ...

lambda 13万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【运维/IP地址】127.0.0.1、0.0.0.0、localhost到底是什么,怎么正确使用它们

假设机器1中sever监听0.0.0.0,则机器1中的client访问此server时可以通过127.0.0.1和192.168.11.111(机器1的ip)访问到此sever,机器2的client可以通过192.168.10.128访问到机器1的server。 所谓的回环地址,通俗的讲,就是我们在主机上发送给127开头的IP地址的数据包会被发送的主机自己接收,根本传不出去,外部设备也无法通过回环地址访问到本机。0.0.0.0称为“unspecified”,即未指定(即无效的,无意义的)地址。

hiliang521的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

localhost、127.0.0.1和0.0.0.0和本机IP的区别

localhost、127.0.0.1和0.0.0.0和本机IP的区别(转至 AlbertLi-i)localhost127.0.0.10.0.0.0本机IP localhost localhost其实是域名,一般windows系统默认将localhost指向127.0.0.1,但是localhost并不等于127.0.0.1,localhost指向的IP地址是可以配置的 127.0.0.1 首先...

Fumino的博客 1803

ping地址127.0.0.1相关学习

IP 地址由网络位和主机位组成,网络位一旦确定,可以将主机位中的一位或多位借过来当网络位,从而扩大网络。例如,192.168.1.0/24 这个网段中,192.168.1 是网络位,后面这 8 位数是主机位,如果将主机位中的一位借过来当网络位,就可以扩张成 192.168.1.x,后面几个 x 是主机位,二进制当中除了 0 就是 1。例如,对于 IP 地址 192.168.1.100,子网掩码为 255.255.255.0,则网络位为 192.168.1,主机位为 100。

林隐的博客 2554

Linux中的0.0.0.0和 ::

127.0.0.1属于{127,}集合中的一个,所有的网络号为127的地址都被称为环回地址,所以环回地址不等价于127.0.0.1,后者只是环回地址的一份子,是包含关系,环回地址loop back。Local :访问端口的方式,0.0.0.0 是对外开放端口,说明80端口外面可以访问;用双冒号“::”表示一组0或多组连续的0,但只能出现一次,每项数字前导的0可以省略,省略后前导数字仍是0则继续。127.0.0.1是个环回地址,是IP,并不表示“本机”,0.0.0.0才是真正表示网路中的本地。

u010227042的博客 7403
上一篇: 微服务之:服务挂的太干脆,Nacos还没反应过来,怎么办?
下一篇: 滴滴在流量链路检测架构设计及实践
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值