2016-12-25 3 views
0

NetworkInterfaceオブジェクトが物理NICであり、NICのソフトウェア/エミュレーションではないことを特定する方法を教えてください。NetworkInterfaceオブジェクトが物理NICであるかどうかを確認するには

理論的にはこれが物理インターフェイスかどうかを伝える方法があることはわかっていますが、NetworkInterface#isVirtualNetworkInterface#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は「仮想インターフェイス」を使用して「サブインターフェイス」と同じことを意味しています。すなわち、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()'を一緒に使うことができます。 (ここでの1つの問題は、OS自体が、NICが本当に物理的なものかどうか、例えば仮想化されたプラットフォーム上にあるのかどうかを知りません。)しかし、なぜNICが「物理的」なのかを知る必要があります。 –

+0

私はテスト環境を持っています。サーバー(Linuxボックス)では、2つのFQDNを使用してアクセスできます。つまり、 'abc-sit.xyz.ca'と' abc-sit2.xyz 'としましょう。そのシステムが2つのNICを持っているのか1つだけあるのか、もう1つは単なるソフトウェアインタフェースであるのかを知りたかったのです。 – hagrawal

関連する問題