2014-09-02 2 views
0

IPv6에 익숙하지 않습니다. 아래 예제 프로그램처럼 호스트의 IP 주소를 가져와 인쇄하는 간단한 코드 조각이 있습니다.IPv6 - InetAddress.getAllByName이 일치하지 않는 범위 ID를 반환합니다.

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(); 
    } 
    } 
} 

출력에는 범위 ID가있는 IPv4 및 IPv6 주소도 있습니다.

이 범위 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

Windows 버전인가요? 그렇다면 범위 ID가 "ipconfig"에있는 범위 ID의 출력과 일치합니까? –

+0

@JeremyVisser 저는 리눅스를 사용하고 있습니다. 언급했듯이 "ip addr"명령과 일치합니다. 내 대답에 업데이트했습니다. – vijayashankard

답변

0

자바 문서에서 나는 각 인터페이스가 서로 다른 scope_id 값을 가질 수 있다고 말할 수 있습니다.

그는 IPv6 주소가 위에서 설명한대로 리터럴 IPv6 주소입니다. scope_id는 로컬 시스템의 인터페이스를 참조하며 두 가지 방법으로 지정할 수 있습니다.

숫자 식별자입니다. 이것은 시스템이 이해할 수있는 특정 인터페이스와 범위를 식별하는 양의 정수 여야합니다. 대개 숫자 값은 시스템의 관리 도구를 통해 결정할 수 있습니다. 각 인터페이스는 각 범위에 대해 하나씩 여러 값을 가질 수 있습니다. 범위가 지정되지 않은 경우 사용 된 기본값은 0입니다.

문자열입니다. 이것은 특정 인터페이스에 대해 NetworkInterface.getName()에 의해 반환되는 정확한 문자열이어야합니다. 이 방법으로 Inet6Address를 만들면 관련 NetworkInterface를 쿼리하여 개체를 만들 때 숫자 scope-id가 결정됩니다.

숫자 scope_id는 NetworkInterface 클래스에서 반환 된 Inet6Address 인스턴스에서 검색 할 수 있습니다. 이것은 시스템에 구성된 현재 범위 ID를 찾는 데 사용할 수 있습니다.

다른 값을 얻습니다.

1

조금 파고 들자,이 scope_id를 가져 오는 방법을 알아 냈습니다. 이것은 시스템에서 사용 가능한 네트워크 인터페이스에 할당 된 정수 ID입니다. 이 인터페이스 ID는 "ip addr"또는 "ip link"명령을 사용하여 찾을 수 있습니다.

나는 ip addr 출력이 아래와 같은 시스템을 가지고있다.

동일한 시스템에서
[[email protected] 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 

나는 위의 프로그램 runthe 경우, 나는

[[email protected]]# 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 요지"및 프로그램 출력

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 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 프로그램 출력의 ipv6 주소와 함께 scope_id로 제공됩니다.

관련 문제