从IP范围转换为CIDR掩码 [英] Conversion from IP Range to CIDR Mask

查看:941
本文介绍了从IP范围转换为CIDR掩码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在研究一种算法,用于将IP范围转换为CIDR表示法中的列表IP(此后将作为元组提及)。
现在,让我感到困惑的是弄清楚这个转换的最坏情况场景是什么;

I've been working on an algorithm for converting an IP Range to a list IPs in CIDR Notation (will be mentioned as tuples henceforth). Now, what puzzles me is figuring out what is the Worst Case Scenario for this conversion;

IPv4可以获得的最大元组数是多少范围?
我可以获得IPv6范围的最大元组数是多少?
如何计算?erp

What is the maximum number of tuples I can get for an IPv4 Range? What is the maximum number of tuples I can get for an IPv6 Range? How was this calculated?erp

我正在使用修改后的C版本(不是递归的)以下Python脚本

I'm using a modified C version (which is not recursive) of the following Python script:

 1 #!/usr/bin/env python
 2 
 3 import sys
 4 import re
 5 
 6 def ip2int(ip) :
 7         ret = 0
 8         match = re.match("(\d*)\.(\d*)\.(\d*)\.(\d*)", ip)
 9         if not match : return 0
10         for i in xrange(4) : ret = (ret << 8) + int(match.groups()[i])
11         return ret
12 
13 def int2ip(ipnum) :
14         ip1 = ipnum >> 24
15         ip2 = ipnum >> 16 & 0xFF
16         ip3 = ipnum >> 8 & 0xFF
17         ip4 = ipnum & 0xFF
18         return "%d.%d.%d.%d" % (ip1, ip2, ip3, ip4)
19 
20 def printrange(startip, endip) :
21         bits = 1
22         mask = 1
23         while bits < 32 :
24                 newip = startip | mask
25                 if (newip>endip) or (((startip>>bits) << bits) != startip) :
26                         bits = bits - 1
27                         mask = mask >> 1
28                         break
29                 bits = bits + 1
30                 mask = (mask<<1) + 1
31         newip = startip | mask
32         bits = 32 - bits
33         print "%s/%d" % (int2ip(startip), bits)
34         if newip < endip : 
35                 printrange(newip + 1, endip)
36 
37 while 1 :
38         line = sys.stdin.readline().strip()
39         if not line : break
40         chars = line.split(" ")
41         print "#%s - %s" % (chars[0], chars[1])
42         ip1 = ip2int(chars[0])
43         ip2 = ip2int(chars[1])
44         printrange(ip1, ip2)


推荐答案

这只是猜测,但似乎是,单个IPv4范围内CIDR前缀的最大数量是62(32 * 2) - 2),对于IPv6 - 254(128 * 2 - 2)。

It is just guess, but seems to be, that maximum number for CIDR prefixes in single IPv4 range is 62 (32*2 - 2), and for IPv6 - 254 (128*2 - 2).

这篇关于从IP范围转换为CIDR掩码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆