共计 1783 个字符,预计需要花费 5 分钟才能阅读完成。
在开发或者调试时,咱们常常须要和本地的服务器进行通信,例如启动 nginx
之后,在浏览器输出 lcoalhost
或者 127.0.0.1
就能够拜访到本机下面的 http
服务。
Linux 是如何拜访本机 IP 的?
大多数操作系统都在网络层实现了环回能力,通常是应用一个虚构的环回网络接口来实现。这个虚构的环回网络接口看着像是一个实在的网卡,实际上是操作系统用软件模仿的,它能够通过 TCP/IP
与同一台主机上的其余服务进行通信,以 127
结尾的 IPv4
地址就是为它保留的,支流 Linux
操作系统为环回网卡调配的地址都是127.0.0.1
,主机名是localhost
。
环回网络接口之所以被称之为环回网络接口,是因为从本机发送到本机任意一个 IP 的数据报文都会在网络层交给环回网络接口,不再下发到数据链路层进行解决,环回网络接口间接发送回网络层,最终交由应用层软件程序进行解决。这种形式对于性能测试十分有用,因为省去了硬件的开销,能够间接测试协定栈软件所须要的工夫。
那环回网络接口是如何判断目标 IP 是否为本机地址的呢?
答案就是网络层在进行路由转发的时候会先查本地的路由表,发现是本机 IP 后交给环回网络接口。查看本地路由表的命令如下:
ip route show table local
输入内容如下:
broadcast 10.141.128.0 dev eth0 proto kernel scope link src 10.141.155.131
local 10.141.155.131 dev eth0 proto kernel scope host src 10.141.155.131
broadcast 10.141.191.255 dev eth0 proto kernel scope link src 10.141.155.131
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
其中 local
结尾的便是本地 IP,dev
前面是网卡名称。
查完了本地路由表之后会再查主路由表,也就是咱们常常操作的路由表。
ip route show table main
输入内容如下
default via 10.141.128.1 dev eth0 proto static metric 100
10.141.128.0/18 dev eth0 proto kernel scope link src 10.141.155.131 metric 100
环回网络接口
当初咱们再来看下环回网络接口
ifconfig lo
输入
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 1554227 bytes 123327716 (117.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1554227 bytes 123327716 (117.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
能够看到本地环回接口的 IPv4
地址是 127.0.0.1
,子网掩码是255.0.0.0
,对应 A 类网络号127
,乏味的是当咱们拜访 127.0.0.1-127.255.255.254
之间的任意一个地址都会拜访到本机。
IPv6
地址 ::1
,前缀是128
位,示意只有一个地址。
环回网络接口的以后 MTU
是64KB
,不过最高能够设置到2GB
,真是恐怖如斯。
上面几条 RX
,TX
结尾的别离代表收发到的数据报文个数和大小以及错包、丢包、溢出次数和有效帧。
FAQ
虚构网卡的 IP 属于本机 IP 吗?
属于,因为与宿主机器共用同一个网络协议栈。
宿主机器上创立 netns,netns 外部的 IP 属于本机 IP 吗?
不属于,因为 netns 领有独立的网络协议栈,在 netns 外部也能够看到它自身的环回网络接口。
本文首发我的微信公众号:我在对面的角落
欢送关注,接管第一工夫更新告诉。