Запросите кэш ARP для получения MAC ID

13
задан Brian Agnew 7 August 2009 в 00:54
поделиться

5 ответов

. Java не предоставляет прямого способа запросить MAC-адрес хост в вашей сети, поскольку он абстрагируется библиотеками сокетов Java.

В некотором смысле это имеет смысл, потому что MAC-адрес хоста на самом деле говорит очень мало. Не существует такого понятия, как «MAC-адрес хоста».

  • Многие хосты будут иметь несколько сетевых адаптеров, все с отдельным MAC-адресом, с помощью которых они могут подключаться к сети. Компьютер, на котором я сейчас использую, имеет проводной адаптер Ethernet, адаптер WiFi и адаптер Firewire, и все они имеют свой собственный MAC-адрес. Это означает, что для хоста нет окончательного MAC-адреса.
  • Если хост находится в другой подсети, ARP фактически предоставит вам MAC-адрес последнего маршрутизатора, через который прошел ваш пакет, вместо MAC-адреса хоста. вы сканируете.

Сложите обе эти проблемы вместе, и это означает, что один хост может иметь много разных MAC-адресов (если у него более одной сетевой карты), а один MAC-адрес может представлять множество разных хостов (если трафик проходит через маршрутизатор).

Предполагая, что вы все это знаете и вам все еще нужно получить MAC-адрес хоста, единственный способ сделать это в Java - "перейти на собственный":

  • Собственный для клиента, который работает ваша программа:
    • Вы можете запустить инструмент командной строки ARP и проанализировать его вывод.
    • Вы можете использовать своего рода вызов JNI. Однако я не слишком знаком с JNI, поэтому не могу вам с этим помочь.
    • Напишите отдельное небольшое собственное приложение, к которому вы можете получить доступ из Java через Telnet или какой-либо другой протокол, и которое будет запускать ARP команда для вас.
  • Собственно хост, который вы хотите просканировать:
    • Вы можете использовать SNMP, как предлагают некоторые другие ответы на эту тему. Я полагаюсь на эти ответы, чтобы заставить их работать на вас. SNMP - отличный протокол, но имейте в виду, что идентификаторы OID SNMP могут зависеть как от платформы, так и от производителя. OID, которые работают в Windows, не всегда работают в Linux и наоборот.
    • Если вы знаете, что ваш хост работает под Windows, вы можете использовать WMI . Класс Win32_NetworkAdapter содержит нужную вам информацию, но имейте в виду, что он возвращает все сетевых адаптеров хоста, даже те, которые созданы Windows. Кроме того, для сканируемого хоста требуются учетные данные администратора. Google расскажет вам, как подключиться к WMI из Java.
    • Если вы знаете, что ваш хост работает под управлением OS X, вы можете подключиться к машине по SSH и проанализировать вывод команды system_profile .
    • Для Linux, вероятно, существует инструмент, похожий на OS X system_profile .
10
ответ дан 1 December 2019 в 20:01
поделиться

ARP - это способ сопоставления IP-адресов с MAC-адресами. Вот как это делает стек IP.

Я не уверен, что существует переносимый способ получить эту информацию, поскольку он обычно важен только для разработчиков ядра и системных администраторов.

Из-за большого количества поисков в Интернете кажется, что можно получить таблица ARP маршрутизатора с использованием SNMP, но я не нашел много конкретной информации о том, как это сделать. Я нашел бесплатную библиотеку Java для SNMP здесь . Некоторое изучение там может оказаться продуктивным.

4
ответ дан 1 December 2019 в 20:01
поделиться

Вы можете получить свой собственный MAC-адрес через:

Enumeration<NetworkInterface> it = NetworkInterface.getNetworkInterfaces();
while ( it.hasMoreElements() ) {
    byte[] macAddress = it.nextElement().getHardwareAddress();
}

Определенно нет способа получить MAC-адрес другого хоста с помощью vanilla java. Для этого вам придется использовать выполнение процесса или собственную библиотеку.

Если вы управляете другими машинами, вы можете позволить им запрашивать свой собственный MAC и отправлять его обратно по каналу TCP / IP, но я предполагаю это не то, что вы хотите. Для получения дополнительных сведений см. Ответ jqno.

4
ответ дан 1 December 2019 в 20:01
поделиться

Кэш arp является стандартным в наборе доступных данных SNMP. Вы можете использовать SNMP4J , чтобы написать тривиальный агент для запроса этих данных.

например, из набора инструментов SNMP

snmpwalk ${hostname} 1.3.6.1.2.1.4.22.1.2

командной строки (эта огромная строка, разделенная точками, является OID или идентификатором ARP кэш в терминах SNMP. Это будет работать для всех реализаций SNMP)

4
ответ дан 1 December 2019 в 20:01
поделиться

Возможно, эта проблема не решается в контексте Java (поскольку она не зависит от платформы), но вы также должны подумать, можете ли вы получить MAC-адреса через системную службу. Вероятно, существуют ситуации, когда вы не можете надежно найти MAC-адрес через ARP, это зависит от того, зачем вам нужен MAC-адрес.

2
ответ дан 1 December 2019 в 20:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: