2016-12-25 7 views
0

Как определить, является ли объект NetworkInterface физическим сетевым адаптером, а не программным обеспечением/эмуляцией сетевого адаптера.Как определить, имеет ли объект NetworkInterface физический сетевой адаптер

Я знаю, что существуют такие методы, как NetworkInterface#isVirtual и NetworkInterface#getParent, которые теоретически говорят, является ли это физическим интерфейсом.

Но это явно не дает мне правильного ответа, потому что я получаю ниже o/p, когда использую эти методы, а 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 использует «виртуальный интерфейс» для обозначения того же самого, что и «subinterface»; т.е. второй IP-адрес, связанный с сетевым адаптером. Это не то же самое, что и любой нефизический интерфейс.

127.0.0.1 фактически является основным IP-адресом программного обеспечения loopback-устройства. Это явно нефизическое устройство, но оно не является дополнительным интерфейсом для какого-либо другого первичного интерфейса, физического или виртуального.

Это немного запутанно, но тогда слово «виртуальный» является эластичным во многих контекстах, связанных с ИТ.

Для записи эта номенклатура этого «подинтерфейса == виртуальный интерфейс» также не является стандартной. Cisco использует «виртуальный интерфейс» для обозначения «Интерфейсы Loopback, интерфейсы Null, интерфейсы Subinterfaces или Tunnel»; например http://www.cisco.com/c/en/us/td/docs/ios/12_4/interface/configuration/guide/inb_virt.html#wp1027188

+0

Благодарим за подробную информацию. Итак, есть ли какой-либо API, с помощью которого я могу определить, является ли данный интерфейс физическим NIC или нет? – hagrawal

+0

AFAIK, no. Хотя вы можете использовать 'isLoopback()' и 'isVirtual()' вместе. (Одна из проблем заключается в том, что сама ОС может не знать, действительно ли NIC является физически физической, например, на виртуализованной платформе.) Но почему вам нужно знать, является ли NIC «физическим» ... что это значит? –

+0

У меня есть тест env. server (Linux box), его можно получить, используя 2 FQDN - скажем, 'abc-sit.xyz.ca' и' abc-sit2.xyz.ca', я хотел понять, имеет ли эта система 2 NIC или один, а другой - просто программный интерфейс. – hagrawal

 Смежные вопросы

  • Нет связанных вопросов^_^