我试图理解ip a
命令的输出。
例如,我们可以从中得到以下输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:4c:26:18 brd ff:ff:ff:ff:ff:ff
inet 172.21.254.173/20 brd 172.21.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fe4c:2618/64 scope link
valid_lft forever preferred_lft forever
我想了解的是关于inet和inet6的信息。
我研究过它们是IPv4和IPv6的信息,然后它说IP地址(和广播地址)和范围。
但我找不到范围信息后内容的文档。例如,lo
之后inet 127.0.0.1/8 scope host
。
我已经看到它可能有附加信息,例如dynamic
.
有人知道有关他们的文件吗?
(另外,我不知道为什么inet行的末尾显示了接口名称,而inet6行则没有)
谢谢你!
答案1
man ip
将为您提供有关该命令的标题文档ip
。最后,它提供了交叉引用(“另请参阅”),以便ip-address
了解有关该ip address
命令的更多信息。
如果您查看该文档,man ip-address
您会发现对该范围的引用,例如:
IFADDR := PREFIX | ADDR peer PREFIX [ broadcast ADDR ] [ anycast ADDR ] [ label LABEL ] [ scope SCOPE-ID ] SCOPE-ID := [ host | link | global | NUMBER ]
进一步搜索同一手册页将定义SCOPE
如下
scope SCOPE_VALUE
该地址有效的区域范围。文件中列出了可用范围/etc/iproute2/rt_scopes
。预定义范围值为:
global
- 该地址全球有效。site
-(仅限 IPv6,已弃用)该地址是站点本地地址,即该地址在该站点内有效。link
- 该地址是本地链接地址,即仅在此设备上有效。host
- 该地址仅在该主机内部有效。
您问题的第二部分由类型地址的定义来回答link
。
答案2
IPv6 链路本地地址的特殊之处在于,作为正常操作的一部分,在每个 IPv6 链路上使用相同的地址范围。它所说的部分scope link
强调了链接本地地址fe80::215:5dff:fe4c:2618/64
仅在 上有效eth0
,它对于其他网络接口上的主机来说不是有效的地址。 (事实上,相同的地址可能被其他链路上的其他主机使用,尽管考虑到通常根据 MAC 地址分配地址的方式,这种情况很少见。)
这与全局地址不同,全局地址在所有链路和接口上都有效。
请参见例如“地址范围”和“范围文字 IPv6 地址(带区域索引)”部分维基百科页面“IPv6 地址”
答案3
我将尝试回答您提到的部分问题:
“我不知道为什么 inet 行的末尾显示接口名称,而 inet6 行则不然”
inet(或 ipv4)似乎出于历史原因列出了接口名称。这似乎与“别名”接口有关,当您希望在一个接口上有多个地址时,通常会使用“别名”接口。 Linux 现在可以在单个接口上支持多个 IP 地址而无需别名,但过去情况并非如此。为了向后兼容,接口别名仍然存在。
inet6(或 ipv6)不使用该(别名)信息。或者更准确地说,Linux 内核 netlink 接口在查询接口 inet6 地址信息时不会报告接口名称 (IFA_LABEL)。
请注意,我使用与您的问题关联的标签来假设您使用的是 Ubuntu 发行版中的 Linux。该命令ip address show
(或ip a
如您所说)来自ip路由2包裹。该命令通过 netlink 功能从 Linux 内核获取网络接口和网络地址信息。
使用命令man 7 rtnetlink
(或参考https://man7.org/linux/man-pages/man7/rtnetlink.7.html)将提供一些有关 netlink 接口以及 IFA_LABEL 所在位置的信息。
《Understanding Linux Network Internals》一书对 ifa_label 做了如下描述:“一个字符串,主要用于向后兼容 2.0.x 内核,允许使用名称如 eth0:1 的别名接口”。
以下链接(https://www.kernel.org/doc/html/latest/networking/alias.html)还将 Linux ip 别名功能描述为历史悠久的,但为了向后兼容仍然存在。
如果您想更深入地了解细节(这可能更适合 StackOverflow 而不是 UnixLinux),您可以在文件 ip/ipaddress.c 中查找包含“if (rta_tb[IFA_LABEL])”的行“ip地址显示”(iproute2)的源代码。您将看到,如果该命令从内核接收到 IFA_LABEL 信息,那么它会将其打印为命令的输出。
正如其他人所指出的,ip 和 ip-address 的手册页可以为您可以在 inet 和 inet6 之后的输出中看到的其他一些值提供附加信息。
这是我对其工作原理的理解,其他人可能有更多/更好的信息。