2009-02-17 1 views
9

Я ищу пакет, который похож на Net_IPv4 и Net_IPv6, но написан для Java. Он должен быть в состоянии сделать следующее:Сетевые вычисления и валидация IPv4/IPv6 для Java?

  • Проверьте адрес действителен (например, 127.0.0.1 является допустимым, 127.0.0.257 не)
  • Возврат, если адрес находится внутри подсети (например, 127,0 .0.11 в 127.0.0.0/28)
  • Возврат широковещательный адрес для данной подсети (например, для 127.0.0.0/28 это 127.0.0.15)

было бы удивительным, если бы он мог также:

  • Возвращает список адресов для подсети, чтобы
  • Сортировать список адресов

Я мог бы написать пакет, чтобы сделать все это, но если кто-то уже прошли через трудности и, скорее всего, имеет сделал лучшую работу, я все об использовании этого. Кто-нибудь знает о таком пакете или пакетах, которые могли бы все это сделать? Мы расширяемся в IPv6, поэтому ему нужно работать как с IPv4, так и с IPv6, если это возможно.

Я ценю любую помощь.

ответ

5

Это только для IPv4, но SubnetUtils класс, который является частью Commons Net имеет функциональность, которую вы ищете. Исходя из этого, вы можете составить код версии IPv6 и внести свой вклад в проект! :)

5

Возможно, CIDRUtils может вам помочь. Он позволяет конвертировать нотацию CIDR в диапазон IP.

Отказ от ответственности: Я являюсь автором CIDRUtils.

+0

Спасибо за размещение ответ! Обязательно внимательно прочитайте [FAQ по самопомощи] (http://stackoverflow.com/faq#promotion). Также обратите внимание, что * требуется *, что вы публикуете отказ от ответственности каждый раз, когда вы ссылаетесь на свой собственный сайт/продукт. –

+0

@ AndrewBarber Спасибо. Я не знал об этом. Я просто пытался помочь другим, у кого может быть такая же проблема, как у меня. Во всяком случае, я откажусь от ответственности. –

3

Я главный источник commons-ip-math, библиотека Java с открытым исходным кодом, которая предлагает богатый API для работы с наиболее распространенными вычислениями номеров IPv4, IPv6 и AS. Несмотря на то, что он был недавно открыт, он был проверен в течение многих лет внутри RIPE NCC. Посмотрите, как вы можете использовать его ниже.

(Все примеры работают с похожим синтаксисом для номеров IPv6 и AS. Используйте вместо этого классы Ipv6, Ipv6Range, Asn и AsnRange).

  • Verify an address is valid (e.g. 127.0.0.1 is valid, 127.0.0.257 is not)
Ipv4.parse("127.0.0.1");  // IPv4 representation of "127.0.0.1" 
Ipv4.parse("127.0.0.257"); // IllegalArgumentException 
  • Return if an address is contained within a subnet (e.g. 127.0.0.11 is in 127.0.0.0/28)
Ipv4Range.parse("127.0.0.0/28").contains(Ipv4.parse("127.0.0.11")); //true 
  • Return the broadcast address for a given subnet (e.g. for 127.0.0.0/28 it's 127.0.0.15)
Ipv4Range.parse("127.0.0.0/28").start().upperBoundForPrefix(28) // 127.0.0.15 
  • Return a list of addresses for a subnet in order
// Range types are Iterable 
for (Ipv4 ipv4 : Ipv4Range.parse("127.0.0.0/30")) { 
    System.out.println(ipv4); 
} 
// Will print: 
127.0.0.0 
127.0.0.1 
127.0.0.2 
127.0.0.3 
  • Sort a list of addresses

Хотя библиотека сравнительные компараторы для типов диапазонов (например, сравнивая размер подсетей), нет компаратора для одиночных адресов.Однако, это достаточно тривиально, чтобы написать свой собственный, так как IPv4, IPv6 и типы ASN реализовать интерфейс Сопоставимые:

List<Ipv4> list = new ArrayList<Ipv4>(); 
list.add(Ipv4.of("0.0.0.3")); 
list.add(Ipv4.of("0.0.0.4")); 
list.add(Ipv4.of("0.0.0.2")); 
list.add(Ipv4.of("0.0.0.1")); 
Collections.sort(list, new Comparator<Ipv4>() { 
    @Override 
    public int compare(Ipv4 left, Ipv4 right) { 
     return left.compareTo(right); 
    } 
}); 
System.out.println(list); 
// Will print: 
[0.0.0.1, 0.0.0.2, 0.0.0.3, 0.0.0.4] 
+0

Согласно: http://www.helpsystems.com/intermapper/ipv6-address-validation и http://v6decode.com/ «1: 2: 3: 4: 5: 6: 1.2.3.4» является допустимым IPv6, но Ipv6.parse («1: 2: 3: 4: 5: 6: 1.2.3.4») бросает исключение IllegalArgumentException. :/ – Pawel

+0

Для адресов IPv6 со встроенными адресами IPv4, как в вашем примере, библиотека должна соответствовать http://tools.ietf.org/html/rfc4291#section-2.5.5. Таким образом, он либо слишком строг по сравнению с веб-сайтами, либо вы можете найти ошибку. Я буду исследовать. – jgonian

+0

@Pawel Я создал https://github.com/jgonian/commons-ip-math/issues/2, чтобы исследовать – jgonian

2

The IPAddress Java library поддерживает как IPv4, так и IPv6 в полиморфной форме, включая подсеть. Javadoc доступен по ссылке. Отказ от ответственности: Я руководитель проекта.

Все используемые вами варианты использования поддерживаются как для IPv4, так и для Ipv6 прозрачно. Другими словами, он отличается от большинства других утилит в том смысле, что приведенный ниже код работает одинаково с IPv4 или IPv6 в качестве входных строк.

Проверьте, если адрес является действительным

String str = "::1"; 
    IPAddressString addrString = new IPAddressString(str); 
    try { 
     IPAddress addr = addrString.toAddress(); 
     ... 
    } catch(IPAddressStringException e) { 
     //e.getMessage provides validation issue 
    } 

Возврат если адрес содержится в подсети

String str = "1::1"; 
    String subnetStr = "1::/64"; 
    IPAddressString addrString = new IPAddressString(str); 
    IPAddressString subnetString = new IPAddressString(subnetStr); 
    try { 
     IPAddress addr = addrString.toAddress(); 
     IPAddress subnet = subnetString.toAddress(); 
     boolean isContained = subnet.contains(addr); //true in this case 
     ... 
    } catch(IPAddressStringException e) { 
     //e.getMessage provides validation issue 
    } 

Возврат широковещательный адрес для данной подсети

String subnet = "127.0.0.0/28"; 
    IPAddressString subnetString = new IPAddressString(subnet); 
    try { 
     IPAddress subnet = subnetString.toAddress(); 
     IPAddress broadcastAddr = subnet.getHighest(); 
     ... 
    } catch(IPAddressStringException e) { 
     //e.getMessage provides validation issue 
    } 

Возвращает список адресов для подсети в порядке

String subnet = "127.0.0.0/28"; 
    IPAddressString subnetString = new IPAddressString(subnet); 
    try { 
     IPAddress subnet = subnetString.toAddress(); 
     for(IPAddress addr : subnet) { 
      ... 
     } 
    } catch(IPAddressStringException e) { 
     //e.getMessage provides validation issue 
    } 

Сортировка списка адресов

List<IPAddressString> addrs; 
    Collections.sort(addrs); //IPAddressString implements Comparable 

Получить набор подсетей сети и список адресов (ответ на AhmedRana):

IPAddress subnet = new IPAddressString("192.168.0.0/28").getAddress(); 
    IPAddress newSubnets = subnet.setPrefixLength(subnet.getPrefixLength() + 1, false); 
    System.out.println(newSubnets); //192.168.0.0-8/29 
    HashSet<IPAddress> subnetSet = new HashSet<IPAddress>(); 
    ArrayList<IPAddress> addrList = new ArrayList<IPAddress>(); 
    for(IPAddress addr : newSubnets.getIterable()) { 
     subnetSet.add(addr.toPrefixBlock()); 
     addrList.add(addr); 
    } 
    System.out.println(subnetSet);//[192.168.0.0/29, 192.168.0.8/29] 

    System.out.println(addrList); 
       //[192.168.0.0/29, 192.168.0.1/29, 192.168.0.2/29, 
       //192.168.0.3/29, 192.168.0.4/29, 192.168.0.5/29, 
       //192.168.0.6/29, 192.168.0.7/29, 192.168.0.8/29, 
       //192.168.0.9/29, 192.168.0.10/29, 192.168.0.11/29, 
       //192.168.0.12/29, 192.168.0.13/29, 192.168.0.14/29, 
       //192.168.0.15/29] 
+0

Спасибо за блестящую библиотеку. Поддерживает ли ваша библиотека следующее. 1. Вернуть список IP-адресов в подсети 2. Подсеть сети, например. 192.168.0.0/28 подсеть в две сети/29. Можно ли вернуть эти обе сети подсети? – AhmedRana

+0

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

+0

Спасибо, Шон, совместима ли любая версия этой библиотеки с JRE 1.5 (или есть способ сделать ее совместимой с 1.5)? Меня интересует только IPv4. И у меня есть ограничение на то, что он должен быть запущен в системе с Java 5 – AhmedRana