2016-12-25 8 views
0

NetworkInterface 개체가 실제 NIC인지, NIC의 소프트웨어/에뮬레이션인지 여부를 어떻게 식별 할 수 있습니까?NetworkInterface 객체가 실제 NIC인지 여부를 식별하는 방법

이론적으로 이것이 실제 인터페이스인지 여부를 알려주는 NetworkInterface#isVirtualNetworkInterface#getParent과 같은 메서드가 있다는 것을 알고 있습니다.

하지만이 방법을 사용하면 분명히 나에게 맞는 답변을 줄 수 없으며 127.0.0.1은 루프백 소프트웨어 인터페이스입니다.

내가 누락 된 항목이 있습니까?

코드 :

Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); 
    for (NetworkInterface netIf : Collections.list(nets)) { 
     System.out.printf("Display name: %s\n", netIf.getDisplayName()); 
     System.out.printf("Name: %s\n", netIf.getName()); 
     System.out.printf("Up? %s\n", netIf.isUp()); 
     System.out.printf("Loopback? %s\n", netIf.isLoopback()); 
     System.out.printf("PointToPoint? %s\n", netIf.isPointToPoint()); 
     System.out.printf("Supports multicast? %s\n", netIf.supportsMulticast()); 
     System.out.printf("Virtual? %s\n", netIf.isVirtual()); 
     System.out.printf("Hardware address: %s\n", Arrays.toString(netIf.getHardwareAddress())); 
     System.out.printf("MTU: %s\n", netIf.getMTU()); 
     System.out.printf("Parent: %s\n", netIf.getParent()); 
     System.out.println("InetAddress:"); 
     Enumeration<InetAddress> inetAddresses = netIf.getInetAddresses(); 
     int count = 1; 
     for(InetAddress inetAddress : Collections.list(inetAddresses)){ 
      System.out.println("\tInetAddress #" + count); 
      printInetAddressInfo(inetAddress, "\t\t"); 
      count++; 
     } 
     System.out.println("SubInterfaces:"); 
     displaySubInterfaces(netIf); 
     netIf = null; 
     System.out.printf("\n"); 
    } 

결과 :

Display name: Software Loopback Interface 1 
Name: lo 
Up? true 
Loopback? true 
PointToPoint? false 
Supports multicast? true 
Virtual? false 
Hardware address: null 
MTU: -1 
Parent: null 
InetAddress: 
    InetAddress #1 
     inetAddress: /127.0.0.1 
    InetAddress #2 
     inetAddress: /0:0:0:0:0:0:0:1 
SubInterfaces: 

답변

1

나는 뭔가를 놓치고 있습니까?

나는이 문제가 사용자가 isVirtual을 잘못 해석하고 있다고 생각합니다. Javadoc가 말한다 :이 인터페이스가 가상 인터페이스 (도 서브 인터페이스라고) 인

public boolean isVirtual()

반환 여부를 지정합니다. 가상 인터페이스는 일부 시스템에서는 물리적 인 인터페이스의 하위로 생성되고 다른 설정 (예 : 주소 또는 MTU)이 주어진 인터페이스입니다. 일반적으로 인터페이스의 이름은 하나의 물리적 인터페이스에 여러 개의 가상 인터페이스가 연결될 수 있으므로 콜론 (:)과 자식을 식별하는 숫자 뒤에 부모 이름이옵니다.

"javadoc"은 "가상 인터페이스"를 사용하여 "하위 인터페이스"와 동일한 의미를 나타냅니다. 즉 NIC와 관련된 제 2 IP 주소를 포함한다. 이는 비 물리적 인터페이스와 동일하지 않습니다.

127.0.0.1은 실제로 소프트웨어 루프백 장치의 기본 IP 주소입니다. 이것은 분명히 비 물리적 장치이지만 물리적 또는 가상의 다른 기본 인터페이스의 하위 인터페이스는 아닙니다.

이것은 다소 혼란 스럽지만 "가상"이라는 단어는 IT 관련 문맥에서 고무적입니다.

레코드의 경우이 "하위 인터페이스 == 가상 인터페이스"명명법도 표준이 아닙니다. 시스코는 "가상 인터페이스"를 사용하여 을 의미합니다. "루프백 인터페이스, 널 인터페이스, 서브 인터페이스 또는 터널 인터페이스"; 예 : http://www.cisco.com/c/en/us/td/docs/ios/12_4/interface/configuration/guide/inb_virt.html#wp1027188

+0

감사합니다. 그렇다면 주어진 인터페이스가 물리적 NIC인지 여부를 식별 할 수있는 API가 있습니까? – hagrawal

+0

AFAIK, no. 비록 isLoopback()과 isVirtual()을 함께 사용할 수는 있지만. (하나의 문제는 운영 체제 자체가 NIC가 진정으로 물리적 인 지 (예 : 가상화 된 플랫폼인지) 모르겠다는 것입니다.하지만 NIC가 "물리적"인지 알아야하는 이유는 무엇입니까? –

+0

테스트 환경이 있습니다. 서버 (리눅스 박스)에서, 그것은 2 개의 FQDN을 사용하여 도달 할 수 있습니다 -'abc-sit.xyz.ca'와'abc-sit2.xyz '라고합시다.ca'라고 말하면서, 그 시스템이 2 개의 NIC를 가지고 있는지 아니면 하나만 가지고 있는지, 다른 하나는 단순히 소프트웨어 인터페이스인지를 알고 싶었습니다. – hagrawal