我是IPv6新手。 我有一个非常简单的代码片段,如下面的示例程序,用于获取和打印主机的IP地址。
public class networkinterfacetest {
public static void main(String...args) {
String host="BGL-351L";
try {
InetAddress[] a = InetAddress.getAllByName(host);
for(InetAddress ip:a) {
System.out.println("ip all:" + ip);
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出还有IPv4和IPv6地址,范围ID也是。
我想知道如何分配此范围ID。因为它总是不一致。它不断变化。
昨天当我运行程序时,我得到了如下输出,范围ID为"%2"。
ip all:BGL-351L/10.10.64.86
ip all:BGL-351L/fe80:0:0:0:5e26:aff:fe77:e4fd%2
ip all:BGL-351L/fcff:3:10:64:5e26:aff:fe77:e4fd%2
今天如果运行相同的程序,那么我得到"%3"作为范围ID。
ip all:BGL-351L/10.10.64.86
ip all:BGL-351L/fe80:0:0:0:5e26:aff:fe77:e4fd%3
ip all:BGL-351L/fcff:3:10:64:5e26:aff:fe77:e4fd%3
有人可以帮助我了解如何分配此范围ID。
答案 0 :(得分:1)
在挖掘了一点之后,我发现了这个scope_id是如何获取的。这是分配给系统中可用的网络接口的整数id。可以使用“ip addr”或“ip link”命令找到此接口ID。
我有一个系统,其中ip addr输出如下所示。
[user@BGL-351L tch]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 08:11:96:09:04:04 brd ff:ff:ff:ff:ff:ff
3: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 5c:26:0a:77:e4:fd brd ff:ff:ff:ff:ff:ff
inet 10.10.64.86/22 brd 10.10.67.255 scope global em1
inet6 fcff:3:10:64:5e26:aff:fe77:e4fd/64 scope global dynamic
valid_lft 2591601sec preferred_lft 604401sec
inet6 fe80::5e26:aff:fe77:e4fd/64 scope link
valid_lft forever preferred_lft forever
在同一台机器上如果我在上面的程序中,我得到了输出
ip all:BGL-351L/10.10.64.86
ip all:BGL-351L/fe80:0:0:0:5e26:aff:fe77:e4fd%3
ip all:BGL-351L/fcff:3:10:64:5e26:aff:fe77:e4fd%3
在另一台机器中,“ip addr”和程序输出如下
[user@BGL-341L]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:64:61:4a brd ff:ff:ff:ff:ff:ff
inet 10.10.68.24/22 brd 10.10.71.255 scope global eth0
inet6 3002::20c:29ff:fe64:614a/64 scope global dynamic
valid_lft 2591981sec preferred_lft 604781sec
inet6 fe80::20c:29ff:fe64:614a/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 9a:ee:72:78:fc:cc brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
节目输出:
ip all:BGL-341L/fe80:0:0:0:20c:29ff:fe64:614a%2
ip all:BGL-341L/3002:0:0:0:20c:29ff:fe64:614a%2
ip all:BGL-341L/10.10.68.24
因此,在上述两种情况下,分配给em1或eth0的id在java程序输出中都带有scope_id和ipv6地址。
答案 1 :(得分:0)
从java文档我得到的是基于我可以说每个接口可以配置不同的scope_id值。
IPv6-address是如上所述的文字IPv6地址。 scope_id是指本地系统上的接口,可以通过两种方式指定。
作为数字标识符。这必须是一个正整数,用于标识系统所理解的特定接口和范围。通常,数值可以通过系统上的管理工具确定。 每个接口可能有多个值,每个范围一个。如果未指定范围,则使用的默认值为零。
作为一个字符串。这必须是NetworkInterface.getName()为相关特定接口返回的确切字符串。以这种方式创建Inet6Address时,通过查询相关的NetworkInterface在创建对象时确定数字scope-id。
另请注意,可以从NetworkInterface类返回的Inet6Address实例中检索数字scope_id。这可用于查找系统上配置的当前范围ID。
所以你得到不同的价值观。