Conversion de la plage IP au masque CIDR

J’ai travaillé sur un algorithme pour convertir une plage d’adresses IP en une liste d’adresses IP dans la notation CIDR (nous les désignerons désormais comme des nuplets). Maintenant, ce qui me rend perplexe, c’est de déterminer quel est le pire scénario pour cette conversion;

Quel est le nombre maximum de nuplets que je peux obtenir pour une plage IPv4? Quel est le nombre maximum de nuplets que je peux obtenir pour une plage IPv6? Comment cela a-t-il été calculé?

J’utilise une version C modifiée (qui n’est pas récursive) du script Python suivant :

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 <> 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 endip) or (((startip>>bits) <> 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) 

Il semble que le nombre maximum de préfixes CIDR dans une plage IPv4 unique soit 62 (32 * 2 – 2) et IPv6 – 254 (128 * 2 – 2).