IPv6 - InetAddress.getAllByName返回不一致的范围ID

时间:2014-09-02 07:05:53

标签: java ipv6 inetaddress

我是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。

2 个答案:

答案 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。

所以你得到不同的价值观。