1

Я ищу умный и короткий способ для расчета суммарных маршрутов. (CIDR, обобщение маршрутов)

Я знаком с предметом суммирования, суперсетями, VLSM, CIDR и т.д., Но я не всегда хочу преобразовать все IP-адреса в двоичный формат, чтобы получить результат.
Я ищу умный способ сэкономить драгоценное время.
Главный вопрос в примере 3

Example1:
Допустим, у нас есть эти два IP-адреса:

  • 172.16.64.0/23
  • 172.16.66.0/23

Я сразу вижу, что итоговый маршрут будет 172.16.64.0/22.
Я вижу, что я использую 2 подсети -> это 1 бит -> я вычитаю 1 бит из /23 = /22

В двоичном формате:
172.16.64.0 - - -> 10101100.00010000.01000000.00000000
172.16.66.0 - - -> 10101100.00010000.01000010.00000000

22 самых левых совпадающих бита = /22
Когда AND-IN эти IP-адреса, результат
172.16.64.0 - - -> 10101100.00010000.01000000.00000000

Вуаля это работает без конвертации :)

Example2:

  • 192.168.4.192/29
  • 192.168.4.200/29
  • 192.168.4.208/29
  • 192.168.4.216/29

Кратко рассмотрим эти IP-адреса, я вижу 4 подсети, которые являются 2 битами (вычтите 2 из /29)
Так что мое предположение 192.168.4.192/27

192.168.4.192 - - -> 10000000.10101000.00000100.11000000
192.168.4.200 - - -> 10000000.10101000.00000100.11001000
192.168.4.208 - - -> 10000000.10101000.00000100.11010000
192.168.4.216 - - -> 10000000.10101000.00000100.11011000

27 самых левых совпадающих битов = /27
Когда AND-IN эти IP-адреса, результат:
192.168.4.192 - - -> 10000000.10101000.00000100.11000000

Вуаля, у нас есть 192.168.4.192/27. Кажется, это работает.

Example3:
(НО) Что если у нас есть подсети с нечетными числами и разными масками (как в примере ниже)
Как я могу сразу получить сводку маршрута? (без преобразования в двоичный файл?)

  • 192.168.6.000/27 (10000000.10101000.00000110.00000000)
  • 192.168.6.064/27 (10000000.10101000.00000110.01000000)
  • 192.168.6.128/26 (10000000.10101000.00000110.10000000)
  • 192.168.6.160/26 (10000000.10101000.00000110.10100000)
  • 192.168.6.192/28 (10000000.10101000.00000110.11000000)
  • 192.168.6.208/28 (10000000.10101000.00000110.11010000)
  • 192.168.6.224/30 (10000000.10101000.00000110.11100000)
  • 192.168.6.228/30 (10000000.10101000.00000110.11100100)
  • 192.168.6.232/30 (10000000.10101000.00000110.11101000)

после преобразования легко увидеть, что это 24 самых левых совпадающих бита = /24
Но есть ли способ, чтобы пропустить конвертацию и сразу найти суммарный маршрут, просто по IP-адресам + маскам?

Пример 4: Этот пример немного подлый, потому что он расходится с моей идеей примера 1:

  • 192.168.1.0/24 - 11000000.10101000.00000001.00000000
  • 192.168.2.0/24 - 11000000.10101000.00000010.00000000

Результат 192.168.0.0/22
Однако я не мог объяснить, почему это больше не работает.

Я надеюсь, что на этом форуме есть умные люди, которые могут помочь мне найти рабочее решение. :)
заранее спасибо

2 ответа2

1

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

Пример 1

192.168.1.160/30

192.168.1.164/29

192.168.1.172/29

192.168.1.180/30

вы начинаете с того, что берете наибольшее и наименьшее число из диапазона, который нужно суммировать.

160, 180.

затем сравните их со значениями битов, начиная слева.

128 64 32 16 8 4 2 1

Поскольку оба числа больше 128, они совпадают в этом бите и имеют значение 1 в этом бите.

128 64 32 16 8 4 2 1

1

затем добавьте значение следующего бита (128+64 = 192) и определите, являются ли оба числа выше или ниже этого значения. поскольку значения 160 и 180 меньше 192, они оба совпадают в этом бите, и оба имеют значение 0 для этого бита.

128 64 32 16 8 4 2 1

1 0

теперь, поскольку оба числа были меньше 192, вы добавляете 128 к следующему значению бита 32 и игнорируете значение бита 64. (128+32 = 160), потому что 160 и 180 выше 160, они оба совпадают на этом бите и оба имеют значение 1 для этого бита.

128 64 32 16 8 4 2 1

1 0 1

Теперь добавьте накопленное значение суммарного адреса к следующему значению бита 16 (128+32 = 160+16 = 176), потому что 160 меньше чем, а 180 больше чем 176, у них есть другое значение для этого бита для этого бита не включен в итоговый адрес.

128 64 32 16 8 4 2 1

1 0 1 ххххх

так что вы можете видеть, что суммарный адрес маршрута для этого примера - 192.168.1.160/27

Я приведу еще один пример, но как только вы освоите его, вы сможете очень быстро определить краткие адреса.

Пример 2

172.16.146.0/24

172.16.147.0/23

172.16.149.0/23

172.16.151.0/24

битовые значения:128 64 32 16 8 4 2 1

Посмотрим на самое высокое и самое низкое число в примере, 146 + 151, они оба выше или ниже, чем первое битовое значение 128. Они оба выше, так что этот бит совпадает со значением 1.

128 64 32 16 8 4 2 1

1

добавление следующего значения бита (128+64 = 192), они оба выше или ниже, чем 192? они оба ниже, поэтому у этого бита совпадающее значение 0 для обоих.

128 64 32 16 8 4 2 1

1 0

добавив значение следующего бита 32 к накопленному итоговому значению 128 (128+32 = 160), вы увидите, что 146 и 151 меньше 160, так что этот бит имеет значение совпадения 0 для обоих битов.

128 64 32 16 8 4 2 1

1 0 0

добавив следующее битовое значение 16 к суммарному итоговому значению 128 (128+ 16 = 144), вы увидите, что оба значения 146 + 151 больше 144, поэтому этот бит имеет значение 1.

128 64 32 16 8 4 2 1

1 0 0 1

добавив следующее значение бита 8 к накопленному итоговому значению 144 (128+16 = 144+8 = 152), вы увидите, что оба числа меньше 152, поэтому оба числа в этом бите по-прежнему совпадают со значением 0.

128 64 32 16 8 4 2 1

1 0 0 1 0

добавив следующее значение бита 4 к накопленному итоговому значению 144 (128+16 = 144+4 = 148), вы можете увидеть, что 146 меньше, а 151 выше 148, поэтому этот бит не совпадает и не является частью Сводный маршрутный адрес.

128 64 32 16 8 4 2 1

1 0 0 1 0 ххх

поэтому ответ для этого примера 172.16.144.0/21

В вашем предыдущем примере (пример 3)

192.168.6.000/27

192.168.6.064/27

192.168.6.128/26

192.168.6.160/26

192.168.6.192/28

192.168.6.208/28

192.168.6.224/30

192.168.6.228/30

192.168.6.232/30

просто посмотрите на самое высокое и самое низкое число 0 + 232, одно из которых больше 128, а другое ниже, потому что вам не нужно искать дальше или вычислять что-либо еще, первый бит со значением 128 не совпадает и не является частью сводного адреса.

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

Aoibheann

0

Ваша проблема в том, что вы хотите сравнить числа на основе их значения, используя то, как они представлены и сгруппированы. Говоря простым языком, вы пытаетесь перевести с немецкого на французский, говоря по-китайски. Хотя для определения одной и той же концепции могут использоваться разные слова, вам все равно нужно сделать перевод напрямую.

Если не использовать какой-либо язык программирования или бинарный калькулятор, вы просто не сможете просто записать номера 10 сетей и всегда видеть четкую схему. Даже в ваших примерах, если вы подумаете об этом, вы сделали простое преобразование в своей голове в двоичную, основываясь на идее, что числовые значения чисел были очень близки, так что их двоичное представление не будет сильно отличаться, что позволяет группировать цифры в вашей голове и идентифицировать идентичные группировки. Но чем больше разница / больше цифр вы сравниваете, тем сложнее сделать это в своей голове.

Однако, если вы перечислите IP-номера в числовом порядке, вы можете начать с сравнения первого со вторым, чтобы получить общий префикс для этих двух чисел. Для каждого дополнительного номера сравнивайте предыдущий префикс со следующим числом, пока вы не сравните их все и не получите окончательный префикс. Но вам все равно придется выполнить двоичное преобразование в своей голове.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .