
Допустим, у меня есть начальный 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