2010-07-19 15 views
2

Je travaille avec une table BGP d'Internet (un énorme fichier). Cependant, la synthèse d'itinéraire peut être un problème. Mon problème principal est que, parfois, de gros morceaux d'espace IPv4 sont annoncés (c'est-à-dire, 172.16.0.0/16), mais aussi des routes plus spécifiques et plus petites sont annoncées aussi (c'est-à-dire, 172.16.64.0/18). Il y a donc deux entrées redondantes dans la table BGP.C# Comment savoir si un sous-réseau fait partie d'un plus grand réseau

Je voudrais trouver un moyen de finir avec une liste d'adresses IP non redondantes, juste les gros morceaux. Je pense à peut-être les comparer tous et les stocker dans une liste. Y a-t-il une méthode en C# pour savoir si une adresse IP fait partie d'une adresse IP plus large? Comme dans:

172.16.64.0/18 fait partie 172.16.0.0/16 // true

Merci beaucoup pour votre aide!

alemangui

Répondre

3

Utilisez des maths simples.

L'adresse IP est de 4 octets, avec un entier de 32 bits. Le masque de sous-réseau est exactement le même. Par conséquent, vous pouvez utiliser une arithmétique ET pour déterminer si elle se trouve à l'intérieur ou à l'extérieur du réseau défini.

EG:

IP: 192.168.0.1  = C0 . A8 . 00 . 01 
Subnet: 192.168.0.0 = C0 . A8 . 00 . 00 

Is in subnet? 
Thus 0xC0A80001 & 0xC0A80000 == 0xC0A80000 => true 

Pour répondre à la question de savoir si un travail net existe dans un autre, vous pouvez utiliser la même approche, mais décalage à droite les deux chiffres avec la taille du sous-réseau « plus grand ».

EG:

Net A: 172.16.64.0/18 -> AC 10 40 00 
Net B: 172.16.0.0/16 -> AC 10 00 00 

Thus right shift both with 16 and apply previous op. 

AC 10 & AC 10 == AC 10 -> true 
0

Tenez compte des modèles binaires:

172.16.64.0 

10101100.00010000.01000000.00000000 

172.16.0.0 

10101100.00010000.00000000.00000000 

Notez que les bits définis dans l'adresse plus spécifiques sont les bits définis dans l'adresse plus général, plus un peu plus . Donc, si nous effectuons un AND binaire sur les deux adresses, le résultat sera égal au plus général.

Est-ce toujours un bon test? Eh bien, si nous avons deux adresses qui ont pas ont une relation de confinement, ET les bits donnera clairement un résultat qui a au moins un bit différent du parent proposé, c'est donc le test que nous voulons.

Si vous savez laquelle de vos deux adresses est le parent proposé, et quel est l'enfant proposé, alors nous pouvons simplement ET les bits et comparer au parent proposé. Si elles peuvent être dans l'un ou l'autre ordre, ET les et comparer aux deux entrées séparément.

Pour obtenir les bits réels, si vous avez déjà un IPAddress, utilisez GetAddressBytes pour obtenir un byte[], utilisez BitConverter pour obtenir un unit, puis il suffit d'utiliser & pour le niveau du bit.