2010-07-19 4 views
2

Я работаю с таблицей BGP в Интернете (огромный файл). Однако обобщение маршрута может быть проблемой. Моя основная проблема заключается в том, что иногда объявляются большие куски пространства IPv4 (т. Е. 172.16.0.0/16), но также объявляются более конкретные и более мелкие маршруты (т. Е. 172.16.64.0/18). Таким образом, в таблице BGP есть две избыточные записи.C# Как узнать, является ли подсеть частью более крупной сети.

Я хотел бы выяснить, как получить список не избыточных IP-адресов, просто большие куски. Я думаю о том, чтобы сравнить их все и сохранить в списке. Есть ли способ на C#, чтобы узнать, является ли IP-адрес частью более широкого IP-адреса? Как и в:

172.16.64.0/18 является частью 172.16.0.0/16 // истинные

Большое спасибо за вашу помощь!

alemangui

ответ

3

Использовать простую математику.

IP-адрес - 4 байта, в котором содержится 32-разрядное целое число. Маска подсети точно такая же.

Учитывая это, вы можете использовать арифметику И, чтобы определить, находится ли она внутри или вне определенной сети.

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 

Для ответа на вопрос о том, существует ли одна чистая работа в другом, вы можете использовать тот же подход, но сдвиг вправо оба числа с размером «» самой большой подсети.

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

Рассмотрим битовые шаблоны:

172.16.64.0 

10101100.00010000.01000000.00000000 

172.16.0.0 

10101100.00010000.00000000.00000000 

Обратите внимание, что набор битов в более специфичного адреса являются набор битов в общем более-адрес, а также некоторые более , Поэтому, если мы выполняем побитовое И по двум адресам, результат будет равен более общему.

Всегда ли это правильный тест? Ну, если у нас есть два адреса, которые имеют , а не имеют отношение сдерживания, ANDing бит явно даст результат, который имеет хотя бы один бит, отличный от предлагаемого родителя, так что это тест, который мы хотим.

Если вы знаете, какой из ваших двух адресов является предлагаемым родителем, а какой является предлагаемым ребенком, тогда мы можем просто И биты и сравнить с предлагаемым родителем. Если они могут быть в любом порядке, И они и сравниваются с обоими входами отдельно.

Чтобы получить на фактические биты, если у вас уже есть IPAddress, использовать GetAddressBytes получить byte[], используйте BitConverter, чтобы получить unit, а затем просто использовать & для побитового И.

Смежные вопросы