Назад | Перейти на главную страницу

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

Итак, я столкнулся с затруднением при сортировке адресов IPv4 и не знал, есть ли установленное правило в каком-то малоизвестном сетевом документе. Выполняю ли я прямую сортировку только по необработанному адресу (например, конвертирую IP-адрес в 32-битное число и затем сортирую), учитываю ли я CIDR с помощью какой-либо математической формулы, выполняю ли сортировку только с помощью CIDR (как будто я ' м сравнивая размер сети, а не адреса напрямую)?

То есть, обычная математика, мы бы сделали что-то вроде -1 < 0 < 1 для обозначения порядка приоритета. Учитывая сказать, 10.1.0.0/16, 172.16.0.0/12, 192.168.1.0/24, и 192.168.1.42, каков порядок приоритета?

Вы можете отсортировать IP-адреса с помощью следующей команды:

sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 ips.txt

Что делает это?

Он использует сортировку с -n параметр, который сообщает sort, что мы будем выполнять числовую сортировку.

Но наш номер представлен 4 субномерами (фактическими октетами IP-адреса), разделенными точкой . (-t .). Итак, давайте отсортируем сначала по первому полю и только по первому полю (-k 1,1), затем вторым и только вторым (-k 2,2), и так далее (-k 3,3 -k 4,4).

В последний раз, когда я делал это, я реализовал это примерно так (проверка и проверка ошибок опущены для ясности):

(addressA, maskA) = split('/', a);
(addressB, maskB) = split('/', b);
ipCmp = inet_aton(addressB) - inet_aton(addressA);
if (ipCmp > 0) {
    return -1;
} else if (ipCmp < 0) {
    return 1;
} else {
    if (maskA < maskB) {
        return 1;
    } else if (maskA > maskB) {
        return -1;
    } else {
        return 0;
    }
}

Учитывая входной массив { 10.0.1.0/24, 10.0.0.0/24, 10.0.0.0/8 } это должно произвести { 10.0.0.0/8, 10.0.0.0/24, 10.0.1.0/24 }.

Отредактируйте, чтобы добавить: не существует «общепринятого» метода, о котором я знаю, это просто метод, который был наиболее полезен для задачи, которую я должен был выполнить. Причина использования inet_aton заключается в том, что IP-адреса - это просто целые числа, отформатированные немного иначе. Сравните их как целые числа, и вы получите удобный порядок.

О, хорошо, это твое домашнее задание по CS?

Затем отсортируйте как хотите; нет никаких технических причин предпочитать одну схему сортировки другой. Идея Пейси хороша, но если вы хотите также учитывать маску, я, вероятно, сначала отсортирую по размеру маски, затем воспользуюсь схемой Пейси, чтобы упорядочить адреса с самой большой маской, а затем упорядочить адреса со следующей по величине, вплоть до заказа / 32s. Технического смысла это не имеет, но кажется более обоснованным, чем сортировка по адресам и затем решив, что 192.168.0.64/29 как-то важнее, чем 192.168.0.64/32.