2

当我调用 methodNetworkInterface.getInetAddresses()时,我得到以下字符串:

"fe80:0:0:0:f06c:31b8:cd17:5a44%5"

我想知道%5这里是什么意思?如果没有这个,是否可以使用 IPv6 地址%5

4

3 回答 3

6

它在这里解释:

Inet6Adress - 格式

指定scope_id的一般格式如下:

*IPv6-address%scope_id*

IPv6 地址是如上所述的文字 IPv6 地址。scope_id指的是本地系统上的一个接口,它可以通过两种方式指定。

  1. 作为数字标识符。这必须是一个正整数,用于标识系统理解的特定接口和范围。通常,数值可以通过系统上的管理工具来确定。每个接口可能有多个值,每个范围一个。如果未指定范围,则使用的默认值为零。

  2. 作为一个字符串。这必须是NetworkInterface.getName()针对相关特定接口返回的确切字符串。以这种方式创建 Inet6Address 时,通过查询相关 NetworkInterface 在创建对象时确定数字范围 ID。

另请注意,数字scope_id可以从 NetworkInterface 类返回的 Inet6Address 实例中检索。这可用于找出系统上配置的当前范围 ID。

于 2013-01-28T19:53:05.750 回答
2

5 是区域索引。% 用于分隔它。

一台 Windows 机器将有一个,例如 %1。

一台 Unix 机器会有一个,例如 %eth0。使用接口名称作为区域索引。

于 2013-01-28T19:50:54.267 回答
0

% 符号表示 IPv6 区域或范围 ID。

开源 IPAddress Java 库将验证 IPv6 的所有标准表示。您可以提取区域,如图所示。免责声明:我是那个图书馆的项目经理。

代码示例:

        try {
            IPAddressString str = new IPAddressString("fe80:0:0:0:f06c:31b8:cd17:5a44%5");
            IPAddress addr = str.toAddress();
            if(addr.isIPv6() || addr.isIPv6Convertible()) {
                IPv6Address ipv6Addr = addr.toIPv6();
                String zone = ipv6Addr.getZone();
                IPv6Address noZoneAddr = new IPv6Address(ipv6Addr.getSection());
                System.out.println("zone is " + zone + " for address " + noZoneAddr);
            }
            //use address
        } catch(AddressStringException e) {
            //e.getMessage has validation error
        }

输出:

        zone is 5 for address fe80:0:0:0:f06c:31b8:cd17:5a44
于 2017-12-18T02:11:52.570 回答