Как определить наибольший cidr в диапазоне IP-адресов

Как определить наибольший cidr в диапазоне IP-адресов

Допустим, у меня есть начальный ip и конечный ip. Какой самый простой способ узнать наибольший cidr, который я могу выделить из этого диапазона, чтобы уменьшить фрагментацию?

Например, у меня диапазон 10.10.1.0 - 10.10.2.128.

Я запрашиваю /25. Самый простой алгоритм дал бы мне 10.10.1.0/25 и покончил бы с этим, но тогда это фрагментирует /24 и не выделяет /25 (10.10.2.0/25). Я хотел бы видеть выделение 10.10.2.0/25 и оставить 10.10.1.0-10.10.1.255 нетронутыми.

Буду рад любым идеям. Ломаю голову над этим уже некоторое время.

решение1

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

Шаг 1: Преобразуйте имеющийся у вас диапазон в серию блоков CIDR максимально возможного размера, не пересекая границу диапазона и не перекрывая другой блок.

Шаг 2: Учитывая распределение, которое вы пытаетесь подогнать, найдите наименьший возможный блок, который ему подойдет. В идеале это будет точно соответствовать, но если нет, вы разделите наименьший найденный блок (потенциально рекурсивно), пока не достигнете блока нужного размера.

Моя формулировка не особенно элегантна, но я надеюсь, вы уловили идею.

решение2

Не существует CIDR, ограниченного диапазоном 10.10.1.0 - 10.10.2.128.

10.10.1.0 /22 это 10.10.0.0 - 10.10.3.255

10.10.1.0 /23 это 10.10.0.0 - 10.10.1.255

10.10.1.0 /24 это 10.10.1.0 - 10.10.1.255

У вас может быть две отдельные сети:

10.10.1.0 /24 это 10.10.1.0 - 10.10.1.255

10.10.2.0 /25 это 10.10.2.0 - 10.10.2.127

Связанный контент