merging of multiple IPv4 address blocks on the basis of their country region

ⅰ亾dé卋堺 提交于 2019-12-11 02:16:08

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!