There is a interesting algorithm, wrt dividing the range of subnet.
I have a subnet,such as 192.168.1.0/24 or 192.168.1.248/22, and so on. And we know that '/24' or '/22' stands for networks and '(32 - 24)' or '(32 -22)' stands for hosts.So Using 192.168.1.0/24, I want to divide the subnet into two ranges, the first is 192.168.1.1 - 192.168.1.127, the second is 192.168.1.128 - 192.168.1.254.
So I need a algorithm to resolve which can divide a given cider subnet into two range by using python.The input is cidr subnet, and the output is two ip ranges.Here is a example:
Input : 192.168.1.0/24
Output: [{'start_address':'192.168.0.1','end_address':'192.168.0.127'},
{'start_address':'192.168.0.128','end_address':'192.168.0.245'}]
So if you have a wonderful algorithm for this, please show it here.
Do you want an algorithm, or do you want a solution?
For a solution, in Python 3, use the ipaddress
module. There is a backport to Python 2 available in PyPI.
If you want the algorithm, you can read the code for the module.
Using the ipaddress
module:
import ipaddress
network = ipaddress.ip_network('192.168.1.0/24')
hosts = list(network.hosts())
subnets = [{'start_address': str(list(subnet.hosts())[0]),'end_address': str(list(subnet.hosts())[-1])}for subnet in network.subnets()]
print(subnets)
Output
[{'start_address': '192.168.1.1', 'end_address': '192.168.1.126'}, {'start_address': '192.168.1.129', 'end_address': '192.168.1.254'}]
Which is pretty close to what you want. Missing is 192.168.1.127 which is the broadcast address for the first subnet, 192.168.1.128 which is the network address for the second subnet, and 192.168.1.255 which is the broadcast address for the second subnet.
To achieve the exact output you can split the hosts list:
hosts = list(network.hosts())
subnets = [{'start_address': str(subnet[0]), 'end_address': str(subnet[-1])} for subnet in (hosts[:len(hosts)//2], hosts[len(hosts)//2:])]
print(subnets)
Output
[{'start_address': '192.168.1.1', 'end_address': '192.168.1.127'}, {'start_address': '192.168.1.128', 'end_address': '192.168.1.254'}]