问题
I have IPv4 blocks in the CIDR notation form. These blocks are divided on the basis of city I want to merge them one level up I mean till region level e.g
12.17.230.48|12.178.230.63|US|Texas|Temple
12.178.230.64|12.178.230.95|US|Texas|Abilene
12.178.230.96|12.178.230.111|US|Texas|Jayton
12.178.230.112|12.178.230.119|US|Texas|Wichita Falls
12.178.230.120|12.178.230.127|US|Texas|Mansfield
12.178.230.128|12.178.230.159|US|Texas|Waco (Bellmead)
12.178.230.160|12.178.230.167|US|Texas|Irving
12.178.230.168|12.178.230.175|US|Texas|Fort Worth
12.178.230.176|12.178.230.183|US|Texas|Alvarado
12.178.230.184|12.178.230.191|US|Texas|Weatherford
12.178.230.192|12.178.230.199|US|Texas|Haltom City
12.178.230.200|12.178.230.207|US|Texas|Fort Worth (Diamond Hill - Jarvis)
12.178.230.208|12.178.230.223|US|Texas|Fort Worth
12.178.230.224|12.178.230.231|US|Texas|Coppell
12.178.230.232|12.178.230.239|US|Texas|Lubbock
here All goes to Texas so I want to merge all those blocks in to one like this
start_ip_of_first_range|end_ip_of_last_range_of_same_region|US|Texas
Though I tried to this but looks like I was even violating IPv4 addresses fundamental rule
Please suggest any formula ?
回答1:
Well all you need is the lowest and highest IP subnet to determine the 'supernet'.
12.178.230.48|12.178.230.63|US|Texas|Temple
12.178.230.232|12.178.230.239|US|Texas|Lubbock
So to group them you'd need to find a subnet mask that includes those ranges. The only subnet mask you can use is /24. A /25 would only provide you a 'supernet' that ranges from 12.178.230.0-12.178.230.127
or 12.178.230.128-12.178.230.255
.
A /24 subnet mask offers you the following range: 12.178.230.0-12.178.230.255
Extra: supernet might not be the correct naming convention, but it gives you a general idea that this is the global IP range for all your results.
回答2:
Well Its late to write here , But I found a simple and lengthy way to achieve this objective.
1. First convert all the ranges in the form of network_address|subnet_mask
2. sort whole the file in descending IP address
3. Now check if two lines fulfill following conditions
a. Same subnet mast &&
b. Re-Check network IP if the position of first set bit from right is greater than host bit length &&
c. Network IP of the line = network ip of next line + 2^(number of host bit) +1 &&
d. First set bit from right in first line should be equal and less than the first set bit in next line's IP. &&
e. Both line should have same location &&
4. In that case remove the next line and decrease the subnet mask length by one.
5. Now the resultant range will serve exactly same IP addresses as much the initial two ranges were serving neither more or less .
6. To make more merging keep repeating step 2 to 5
I did this using a C program and bash utilities . Though I am not pasting program here If someone needs it I will try to put here the exact solution.
This might be solution of famous problem http://www.perlmonks.org/?node_id=118346
来源:https://stackoverflow.com/questions/28358851/merging-of-multiple-ipv4-address-blocks-on-the-basis-of-their-country-region