lo回环地址(环回地址怎么算)

lo回环地址(环回地址怎么算)今天在面试的时候被问到了一个问题 请求本机 IP 带宽上限会受网卡限制吗 进一步 不请求 127 0 0 1 请求 eth0 网卡的 ip 地址 会受限制吗 我反正是一脸懵逼 没什么思路 然后回来查了一下 发现类似的问题还是蛮多的 这个问题本质上还是对环回地址和本机 IP 通信的考察 可以拓展出不少东西 那么此篇博客就记录一下由这个特殊的 IP 地址引发的一系列思考 首先 这是个 nbsp nbsp 地址 nbsp 地址有 nbsp nbsp 位 一个字节有 nbsp nbsp 位 共 nbsp nbsp 个字节 其中 127 开头的都属于回环地址 也是 nbsp nbsp 的特殊地址 而是 众多



今天在面试的时候被问到了一个问题:请求本机IP,带宽上限会受网卡限制吗?进一步,不请求127.0.0.1,请求eth0网卡的ip地址,会受限制吗?

我反正是一脸懵逼,没什么思路,然后回来查了一下,发现类似的问题还是蛮多的,这个问题本质上还是对环回地址和本机IP通信的考察,可以拓展出不少东西。那么此篇博客就记录一下由这个特殊的IP地址引发的一系列思考。

首先,这是个  地址。 地址有  位,一个字节有  位,共  个字节。

其中127 开头的都属于回环地址,也是  的特殊地址,而是众多回环地址中的一个。

用途主要是本机进程间通信。

我们电脑主板上都内置了多种网卡,一般主要有以下几类:

  • 虚拟网卡(loopback)
    注意,它是虚拟的,并不是物理网卡,也被称为是本地环回地址(或接口),一般将127.0.0.1作为本地环回地址。
  • 有线网卡/以太网卡(Ethernet)
    这是以太网(局域网)使用的,我们日常说的网卡指的就是这个,插入的就是网线。转存失败,建议直接上传图片文件
  • 无线网卡(WLAN)
    这是无线局域网所使用的网卡,笔记本上常内置此网卡,它用的是无线电技术,不需要像以太网卡那样插网线。

以上这些网卡都会绑定一个本机IP。

先说结论,可以ping通。

下图是我在自己电脑上做的实验:

image.png

那么为什么拔了网线耶尔可以ping成功呢?

我们先来了解一下ping是干什么的。

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

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

IP和ICMP和ping所在分层

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

所以,ping可以简单理解为ping某个ip就是朝着这个IP发送消息。

再来看一下ping发送消息和TCP发送消息的区别:

ping.png

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

横向对比一下,如果我们用TCP去发消息。

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

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

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

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

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

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

那么回到原来的问题上来,为什么断网之后还能ping通127.0.0.1呢?

我们看一下ping127.0.0.1时数据的发送过程。

66.png

127.0.0.1是一个本地环回地址,ping它的时候数据根本不走网卡,而是加入到了一个叫input_pkt_queue的链表里。

从应用层再到传输层再到网络层。这一部分和ping外网IP的过程是一样的。

到了网络层,系统会根据目标IP从路由表获取路由信息,这就包括从哪个网卡把数据发出去。

如果是外网IP,那就从真网卡发出。如果是本地地址,就从虚拟网卡,也就是本地网卡发出。

本地网卡,其实就是个"**假网卡 **",它不像"真网卡"那样有个什么的,"假网卡"会把数据推到一个叫  的 链表 中。

总的来说,本机网络 IO 和跨机 IO 比较起来,发送数据不需要进 RingBuffer 的驱动队列,直接把 skb 传给接收协议栈(经过软中断)。但是在内核其它组件上,可是一点都没少,系统调用、协议栈(传输层、网络层等)、设备子系统整个走了一个遍。

这个链表,其实是所有网卡共享的,上面挂着发给本机的各种消息。

消息被发送到这个链表后,会再触发一个软中断

专门处理软中断内核线程lsoftirqd收到中断之后立马去链表里把数据取出来,然后顺着数据链路层、网络层等层层往上传递最后给到应用程序。

ping环回地址二号用TCP给这个地址发送的消息都额米有经过真正的网卡,而是相当于在主机里绕了一圈又回来了,所以发往这个地址的消息是不经过网络的。

127.0.0.1它是一个私有IP,代表的就是你的本机环回地址,其实本质上是绑定在虚拟网卡(loopback)上的IP。

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

local host其实是个域名,只不过默认会把它解析为  ,当然这可以在  文件下进行修改。

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

0.0.0.0是一个无效的目标地址,一般来说,ping 0.0.0.0会失败。在我的服务器上可以ping0.0.0.0成功,因为0.0.0.0好像默认绑定了127.0.0.1,是蛮奇怪的。

image.png

我们启动服务器的时候,一般会  一个 IP 和端口,等待客户端的连接。如果此时  的是本机的  , 那么它表示本机上的所有IPV4地址

我们可以做个实验:

先执行ifconfig:

image.png

我的服务器只有一个真实网卡,可以看到eth0的ip和虚拟地址的ip。

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

然后我们分别ping一下这两个地址:

image.png

image.png

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

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

编程小号
上一篇 2025-03-08 13:51
下一篇 2025-02-13 21:57

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/59716.html