Назад | Перейти на главную страницу

Как работает подсети IPv4?

Это Канонический вопрос о подсетях IPv4.

Связанный:

Как работает разделение на подсети и как вы это делаете рукой или в твоей голове? Может ли кто-нибудь объяснить концептуально и на нескольких примерах? Server Fault получает множество домашних заданий по подсетям, поэтому мы могли бы использовать ответ, чтобы указать их на сам Server Fault.

IP-подсети существуют, чтобы позволить маршрутизаторам выбирать подходящие места назначения для пакетов. Вы можете использовать IP-подсети для разделения более крупных сетей по логическим причинам (брандмауэр и т. Д.) Или физическим потребностям (небольшие широковещательные домены и т. Д.).

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

Считая до 1

Если вы уже свободно используете двоичную (основание 2) нотацию, вы можете пропустить этот раздел.

Для тех из вас, кто остался: позор вам за то, что вы не владеете двоичной системой счисления!

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

Подсчет в двоичном формате настолько прост, потому что вам нужно только знать, как считать до 1!

Подумайте об «одометре» автомобиля, за исключением того, что в отличие от традиционного одометра каждая цифра может считаться только до 1 от 0. Когда автомобиль только что с завода, одометр показывает «00000000».

Когда вы проехали первую милю, одометр показывает «00000001». Все идет нормально.

Когда вы проехали вторую милю, первая цифра одометра возвращается к «0» (так как ее максимальное значение равно «1»), а вторая цифра одометра переключается на «1», в результате чего одометр показывает « 00000010 ". Это похоже на число 10 в десятичной системе счисления, но на самом деле это 2 (количество миль, которые вы проехали на машине) в двоичной системе счисления.

Когда вы проехали третью милю, одометр показывает «00000011», так как первая цифра одометра снова поворачивается. Число «11» в двоичной системе счисления совпадает с десятичным числом 3.

Наконец, когда вы проехали четвертую милю, обе цифры (которые показывали «1» в конце третьей мили) вернулись в нулевое положение, а третья цифра переместилась в позицию «1», дав нам « 00000100 ". Это двоичное представление десятичного числа 4.

Вы можете запомнить все это, если хотите, но вам нужно только понять как маленький одометр "переворачивается", когда число, которое он считает, становится больше. Это точно так же, как и традиционный десятичный одометр, за исключением того, что каждая цифра может быть только «0» или «1» на нашем вымышленном «двоичном одометре».

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

Поскольку вы понимаете, как одометр движется вперед, вы также поймете, как он катится назад. Чтобы преобразовать двоичное число, отображаемое на одометре, обратно в десятичное, вы можете откатывать одометр на один тик за раз, считая вслух, пока одометр не покажет «00000000». Когда все эти подсчеты и прокатки завершены, последнее число, которое вы произносите вслух, будет десятичным представлением двоичного числа, с которого начал счетчик пробега.

Преобразование значений из двоичного в десятичное таким образом было бы очень утомительно. Вы могли бы это сделать, но это будет не очень эффективно. Легче выучить небольшой алгоритм, чтобы делать это быстрее.

Небольшое отступление: каждая цифра двоичного числа называется «битом». Это «b» от «двоичного» и «оно» от «цифры». Немного - это бне копатьЭто.

Преобразование двоичного числа, например, «1101011», в десятичное - это простой процесс с помощью небольшого удобного алгоритма.

Начните с подсчета количества бит в двоичном числе. В данном случае их 7. Сделайте 7 разделов на листе бумаги (мысленно, в текстовом файле и т. Д.) И начните заполнять их справа налево. В крайнем правом слоте введите цифру «1», потому что мы всегда будем начинать с «1». В следующем слоте слева введите двойное значение в слоте справа (так, «2» в следующем, «4» в следующем) и продолжайте, пока все слоты не будут заполнены. (В конце концов, вы запомните эти числа, которые являются степенями двойки, по мере того, как вы делаете это все чаще и чаще. У меня в голове до 131 072, но после этого мне обычно нужен калькулятор или бумага).

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

 64    |    32    |    16    |    8    |    4    |    2    |    1    |

Расшифруйте биты двоичного числа под слотами, например:

 64    |    32    |    16    |    8    |    4    |    2    |    1    |
  1          1          0         1         0         1         1

Теперь добавьте несколько символов и вычислите ответ на задачу:

 64    |    32    |    16    |    8    |    4    |    2    |    1    |
x 1        x 1        x 0       x 1       x 0       x 1       x 1
---        ---        ---       ---       ---       ---       ---
       +          +          +         +         +         +         =

Произведя все вычисления, вы должны придумать:

 64    |    32    |    16    |    8    |    4    |    2    |    1    |
x 1        x 1        x 0       x 1       x 0       x 1       x 1
---        ---        ---       ---       ---       ---       ---
 64    +    32    +     0    +    8    +    0    +    2    +    1    =   107

Вот и все. «1101011» в десятичной системе счисления равно 107. Это простые шаги и простая математика.

Преобразование десятичного числа в двоичное так же просто и представляет собой тот же базовый алгоритм, работающий в обратном порядке.

Допустим, мы хотим преобразовать число 218 в двоичное. Начиная с правого края листа бумаги, напишите цифру «1». Слева удвойте это значение (так, «2») и продолжайте движение влево от листа, удваивая последнее значение. Если число, которое вы собираетесь записать, больше преобразуемого числа, прекратите запись. в противном случае продолжайте удваивать предыдущее число и писать. (Преобразование большого числа, например 34 157 216 092, в двоичное с помощью этого алгоритма может быть немного утомительным, но, безусловно, возможно.)

Итак, у вас должно быть на бумаге:

 128    |    64    |    32    |    16    |    8    |    4    |    2    |    1    |

Вы перестали записывать числа на 128, потому что удвоение 128, что даст вам 256, будет больше, чем преобразовываемое число (218).

Начиная с крайнего левого числа, напишите над ним «218» (128) и спросите себя: «218 больше или равно 128?» Если ответ положительный, вычеркните цифру «1» ниже «128». Над цифрой «64» запишите результат 218 минус 128 (90).

Глядя на «64», спросите себя: «90 больше или равно 64?» Это так, поэтому вы должны написать «1» под «64», затем вычесть 64 из 90 и написать это над «32» (26).

Однако когда вы дойдете до «32», вы обнаружите, что 32 не больше или равно 26. В этом случае напишите «0» под «32», скопируйте число (26) сверху 32 «сверху». 16 ", а затем задайте себе тот же вопрос с остальными числами.

Когда вы все сделаете, у вас должно быть:

 218         90         26         26        10         2         2         0
 128    |    64    |    32    |    16    |    8    |    4    |    2    |    1    |
   1          1          0          1         1         0         1         0

Цифры вверху - это просто записи, используемые в вычислениях, и не имеют для нас большого значения. Однако внизу вы видите двоичное число «11011010». Разумеется, 218 в двоичном формате - это «11011010».

Следуя этим очень простым процедурам, вы можете преобразовать двоичное в десятичное и обратно без калькулятора. Математика очень проста, а правила можно запомнить, просто потренировавшись.

Разделение адресов

Думайте об IP-маршрутизации как о доставке пиццы.

Когда вас просят доставить пиццу на «123 Main Street», вам, как человеку, очень ясно, что вы хотите пойти в здание под номером «123» на улице под названием «Main Street». Легко понять, что вам нужно перейти к 100-м кварталу на Мейн-стрит, потому что номер здания находится между 100 и 199, а большинство городских кварталов пронумерованы сотнями. Вы «просто знаете», как разбить адрес на части.

Маршрутизаторы доставляют пакеты, а не пиццу. Их работа такая же, как у водителя пиццы: доставить груз (пакеты) как можно ближе к месту назначения. Маршрутизатор подключен к двум или более IP-подсетям (чтобы быть вообще полезным). Маршрутизатор должен проверять IP-адреса назначения пакетов и разбивать эти адреса назначения на их компоненты «название улицы» и «номер здания», как и водитель пиццы, чтобы принять решение о доставке.

Каждый компьютер (или «хост») в IP-сети настроен с уникальным IP-адресом и маской подсети. Этот IP-адрес можно разделить на компонент «номер здания» (например, «123» в приведенном выше примере), называемый «идентификатор хоста», и компонент «название улицы» (например, «Главная улица» в приведенном выше примере), называемый «идентификатор сети». Нашим человеческим глазом легко увидеть, где находятся номер здания и название улицы в «123 Main Street», но труднее увидеть это деление в «10.13.216.41 с маской подсети 255.255.192.0».

IP-маршрутизаторы «просто знают», как разбивать IP-адреса на эти составляющие для принятия решений о маршрутизации. Поскольку понимание того, как маршрутизируются IP-пакеты, зависит от понимания этого процесса, нам также необходимо знать, как разбивать IP-адреса. К счастью, извлечь идентификатор хоста и идентификатор сети из IP-адреса и маски подсети на самом деле довольно просто.

Начните с записи IP-адреса в двоичном формате (используйте калькулятор, если вы еще не научились делать это в уме, но сделайте заметку, узнайте, как это сделать - это действительно очень просто и впечатлит противоположный пол в стороны):

      10.      13.     216.      41
00001010.00001101.11011000.00101001

Также запишите маску подсети в двоичном формате:

     255.     255.     192.       0
11111111.11111111.11000000.00000000

Написанные бок о бок, вы можете видеть, что точка в маске подсети, где «1s» останавливается, совпадает с точкой в ​​IP-адресе. В том-то и дело, что идентификатор сети и идентификатор хоста разделяются. Итак, в этом случае:

      10.      13.     216.      41
00001010.00001101.11011000.00101001 - IP address
11111111.11111111.11000000.00000000 - subnet mask
00001010.00001101.11000000.00000000 - Portion of IP address covered by 1s in subnet mask, remaining bits set to 0
00000000.00000000.00011000.00101001 - Portion of IP address covered by 0s in subnet mask, remaining bits set to 0

Маршрутизаторы используют маску подсети, чтобы «замаскировать» биты, покрытые единицами в IP-адресе (заменяя биты, которые не «замаскированы» нулями) для извлечения идентификатора сети:

      10.      13.     192.       0
00001010.00001101.11000000.00000000 - Network ID

Аналогичным образом, используя маску подсети для «замаскирования» битов, покрытых нулями в IP-адресе (заменяя биты, которые не «замаскированы» снова нулями), маршрутизатор может извлечь идентификатор хоста:

       0.       0.      24.      41
00000000.00000000.00011000.00101001 - Portion of IP address covered by 0s in subnet mask, remaining bits set to 0

Нашему человеческому глазу не так легко увидеть «разрыв» между идентификатором сети и идентификатором хоста, как между «номером здания» и «названием улицы» в физических адресах во время доставки пиццы, но конечный эффект - это тем же.

Теперь, когда вы можете разделить IP-адреса и маски подсети на идентификаторы хоста и идентификаторы сети, вы можете маршрутизировать IP так же, как это делает маршрутизатор.

Дополнительная терминология

Вы увидите, что маски подсети написаны повсюду в Интернете и в остальной части этого ответа как (IP / номер). Эта нотация известна как нотация «Бесклассовая междоменная маршрутизация» (CIDR). «255.255.255.0» состоит из 24 битов единиц в начале, и быстрее записать это как «/ 24», чем как «255.255.255.0». Чтобы преобразовать число CIDR (например, «/ 16») в десятичную маску подсети с точками, просто запишите это число единиц, разделите его на группы по 8 бит и преобразуйте в десятичное. (Например, «/ 16» - это «255.255.0.0».)

В «старые времена» маски подсети не указывались, а определялись путем просмотра определенных битов IP-адреса. Например, IP-адрес, начинающийся с 0–127, имел подразумеваемую маску подсети 255.0.0.0 (называемую IP-адресом «класса A»).

Эти подразумеваемые маски подсети сегодня не используются, и я не рекомендую больше о них узнавать, если только вы не имеете дело с очень старым оборудованием или старыми протоколами (например, RIPv1), которые не поддерживают бесклассовую IP-адресацию. Я не буду далее упоминать эти «классы» адресов, потому что сегодня они неприменимы и могут сбивать с толку.

Некоторые устройства используют обозначение, называемое «подстановочными масками». «Маска подстановки» - это не что иное, как маска подсети со всеми нулями там, где будут единицы, и единицей, где будут нули. Подстановочная маска для / 26:

 11111111.11111111.11111111.11000000 - /26 subnet mask
 00000000.00000000.00000000.00111111 - /26 "wildcard mask"

Обычно вы видите «маски с подстановочными знаками», используемые для сопоставления идентификаторов хостов в списках управления доступом или правилах брандмауэра. Мы не будем их здесь обсуждать.

Как работает роутер

Как я уже сказал ранее, IP-маршрутизаторы выполняют аналогичную работу с драйвером доставки пиццы, поскольку им необходимо доставить свой груз (пакеты) до места назначения. При представлении пакета, привязанного к адресу 192.168.10.2, IP-маршрутизатор должен определить, какой из его сетевых интерфейсов лучше всего доставит этот пакет ближе к месту назначения.

Допустим, вы - IP-маршрутизатор, и у вас есть интерфейсы, подключенные к вам, пронумерованные:

  • Ethernet0 - 192.168.20.1, маска подсети / 24
  • Ethernet1 - 192.168.10.1, маска подсети / 24

Если вы получили пакет для доставки с адресом назначения "192.168.10.2", довольно легко сказать (вашими человеческими глазами), что пакет должен быть отправлен через интерфейс Ethernet1, потому что адрес интерфейса Ethernet1 соответствует адресату пакета. адрес. Все компьютеры, подключенные к интерфейсу Ethernet1, будут иметь IP-адреса, начинающиеся с «192.168.10.», Поскольку сетевой идентификатор IP-адреса, назначенного вашему интерфейсу Ethernet1, равен «192.168.10.0».

Для маршрутизатора этот процесс выбора маршрута выполняется путем построения таблицы маршрутизации и обращения к ней каждый раз, когда пакет должен быть доставлен. Таблица маршрутизации содержит идентификатор сети и имена интерфейсов назначения. Вы уже знаете, как получить сетевой идентификатор из IP-адреса и маски подсети, поэтому вы на пути к созданию таблицы маршрутизации. Вот наша таблица маршрутизации для этого роутера:

  • Идентификатор сети: 192.168.20.0 (11000000.10101000.00010100.00000000) - 24-битная маска подсети - Интерфейс Ethernet0
  • Идентификатор сети: 192.168.10.0 (11000000.10101000.00001010.00000000) - 24-битная маска подсети - Интерфейс Ethernet1

Для нашего входящего пакета, привязанного к «192.168.10.2», нам нужно только преобразовать адрес этого пакета в двоичный (как люди - маршрутизатор получает его как двоичный из сети для начала) и попытаться сопоставить его с каждым адресом в нашей маршрутизации. таблица (до количества бит в маске подсети), пока мы не сопоставим запись.

  • Назначение входящего пакета: 11000000.10101000.00001010.00000010

Сравнивая это с записями в нашей таблице маршрутизации:

11000000.10101000.00001010.00000010 - Destination address for packet
11000000.10101000.00010100.00000000 - Interface Ethernet0
!!!!!!!!.!!!!!!!!.!!!????!.xxxxxxxx - ! indicates matched digits, ? indicates no match, x indicates not checked (beyond subnet mask)

11000000.10101000.00001010.00000010 - Destination address for packet
11000000.10101000.00001010.00000000 - Interface Ethernet1, 24 bit subnet mask
!!!!!!!!.!!!!!!!!.!!!!!!!!.xxxxxxxx - ! indicates matched digits, ? indicates no match, x indicates not checked (beyond subnet mask)

Запись для Ethernet0 точно соответствует первым 19 битам, но затем перестает соответствовать. Это означает, что это неправильный интерфейс назначения. Вы можете видеть, что интерфейс Ethernet1 соответствует 24 битам адреса назначения. Ага! Пакет привязан к интерфейсу Ethernet1.

В реальном маршрутизаторе таблица маршрутизации отсортирована таким образом, что в первую очередь проверяются самые длинные маски подсети на соответствие (т. Е. Наиболее конкретные маршруты), а также численно, чтобы как только совпадение было найдено, пакет можно было маршрутизировать. и дальнейшие попытки сопоставления не требуются (это означает, что 192.168.10.0 будет указан первым, а 192.168.20.0 никогда не будет проверяться). Здесь мы это немного упрощаем. Причудливые структуры данных и алгоритмы делают IP-маршрутизаторы более быстрыми, но простые алгоритмы дают те же результаты.

Статические маршруты

До этого момента мы говорили о нашем гипотетическом маршрутизаторе как о сети, напрямую подключенной к нему. Очевидно, мир устроен не так. В аналогии с вождением пиццы иногда водителю не разрешается входить дальше в здание, кроме стойки регистрации, и он должен передать пиццу кому-то другому для доставки конечному получателю (прекратите свое недоверие и потерпите меня, пока Растягиваю, пожалуйста, аналогию).

Начнем с того, что назовем наш маршрутизатор из предыдущих примеров «Маршрутизатор A». Вы уже знаете таблицу маршрутизации RouterA как:

  • Идентификатор сети: 192.168.20.0 (11000000.10101000.00010100.00000000) - маска подсети / 24 - интерфейс RouterA-Ethernet0
  • Идентификатор сети: 192.168.10.0 (11000000.10101000.00001010.00000000) - маска подсети / 24 - Интерфейс RouterA-Ethernet1

Предположим, что есть другой маршрутизатор, «Маршрутизатор B», с IP-адресами 192.168.10.254/24 и 192.168.30.1/24, назначенными его интерфейсам Ethernet0 и Ethernet1. Он имеет следующую таблицу маршрутизации:

  • Идентификатор сети: 192.168.10.0 (11000000.10101000.00001010.00000000) - маска подсети / 24 - Интерфейс RouterB-Ethernet0
  • Идентификатор сети: 192.168.30.0 (11000000.10101000.00011110.00000000) - маска подсети / 24 - Интерфейс RouterB-Ethernet1

В красивом ASCII-арте сеть выглядит так:

               Interface                      Interface
               Ethernet1                      Ethernet1
               192.168.10.1/24                192.168.30.254/24
     __________  V                  __________  V
    |          | V                 |          | V
----| ROUTER A |------- /// -------| ROUTER B |----
  ^ |__________|                 ^ |__________|
  ^                              ^
Interface                      Interface
Ethernet0                      Ethernet0
192.168.20.1/24                192.168.10.254/24

Вы можете видеть, что маршрутизатор B знает, как «добраться» до сети 192.168.30.0/24, о которой маршрутизатор A ничего не знает.

Предположим, что компьютер с IP-адресом 192.168.20.13, подключенный к сети, подключенной к интерфейсу Ethernet0 маршрутизатора A, отправляет пакет маршрутизатору A для доставки. Наш гипотетический пакет предназначен для IP-адреса 192.168.30.46, который является устройством, подключенным к сети, подключенной к интерфейсу Ethernet1 маршрутизатора B.

В таблице маршрутизации, показанной выше, ни одна запись в таблице маршрутизации маршрутизатора A не соответствует адресу назначения 192.168.30.46, поэтому маршрутизатор A вернет пакет отправляющему ПК с сообщением «Сеть назначения недоступна».

Чтобы маршрутизатор A «знал» о существовании сети 192.168.30.0/24, мы добавляем следующую запись в таблицу маршрутизации на маршрутизаторе A:

  • Идентификатор сети: 192.168.30.0 (11000000.10101000.00011110.00000000) - маска подсети / 24 - Доступен через 192.168.10.254

Таким образом, маршрутизатор A имеет запись в таблице маршрутизации, которая соответствует адресату 192.168.30.46 нашего примерного пакета. Эта запись в таблице маршрутизации фактически говорит: «Если вы получили пакет, привязанный к 192.168.30.0/24, отправьте его на 192.168.10.254, потому что он знает, как с этим бороться». Это аналогичное действие «передать пиццу на стойке регистрации», о котором я упоминал ранее - передача пакета кому-то еще, кто знает, как доставить его ближе к месту назначения.

Добавление записи в таблицу маршрутизации «вручную» известно как добавление «статического маршрута».

Если маршрутизатор B хочет доставлять пакеты в сеть с маской подсети 192.168.20.0 255.255.255.0, ему также потребуется запись в его таблице маршрутизации:

  • Идентификатор сети: 192.168.20.0 (11000000.10101000.00010100.00000000) - маска подсети / 24 - Доступен через: 192.168.10.1 (IP-адрес маршрутизатора A в сети 192.168.10.0)

Это создаст путь для доставки между сетью 192.168.30.0/24 и сетью 192.168.20.0/24 через сеть 192.168.10.0/24 между этими маршрутизаторами.

Вы всегда хотите быть уверены, что маршрутизаторы на обеих сторонах такой «промежуточной сети» имеют запись в таблице маршрутизации для «удаленной» сети. Если на маршрутизаторе B в нашем примере нет записи в таблице маршрутизации для "удаленной" сети 192.168.20.0/24, подключенной к маршрутизатору A, наш гипотетический пакет от ПК по адресу 192.168.20.13 бы добраться до целевого устройства по адресу 192.168.30.46, но любой ответ, который 192.168.30.46 попытался отправить обратно, будет возвращен маршрутизатором B как «Целевая сеть недоступна». Односторонняя связь обычно нежелательна. Всегда думайте о движении транспорта обе направления, когда вы думаете о коммуникации в компьютерных сетях.

Вы можете сэкономить на статических маршрутах. Протоколы динамической маршрутизации, такие как EIGRP, RIP и т. Д., На самом деле являются не чем иным, как способом для маршрутизаторов обмениваться информацией о маршрутизации друг с другом, которая на самом деле может быть настроена со статическими маршрутами. Однако одним большим преимуществом использования протоколов динамической маршрутизации над статическими маршрутами является то, что протоколы динамической маршрутизации могут динамично изменить таблицу маршрутизации в зависимости от условий сети (использование полосы пропускания, «отключение» интерфейса и т. д.), и, таким образом, использование протокола динамической маршрутизации может привести к конфигурации, которая «обходит» сбои или узкие места в сетевой инфраструктуре. (Протоколы динамической маршрутизации ПУТЬ Однако это выходит за рамки этого ответа.)

Вы не можете добраться отсюда

В случае нашего примера с маршрутизатором A, что происходит, когда приходит пакет, привязанный к «172.16.31.92»?

Если посмотреть на таблицу маршрутизации маршрутизатора A, ни интерфейс пункта назначения, ни статический маршрут не соответствуют первым 24 битам 172.18.31.92 (что составляет 10101100.00010000.00011111.01011100, BTW).

Как мы уже знаем, маршрутизатор A вернет пакет отправителю через сообщение «Целевая сеть недоступна».

Допустим, есть еще один маршрутизатор (Маршрутизатор C) по адресу 192.168.20.254. Маршрутизатор C подключен к Интернету!

                              Interface                      Interface                      Interface
                              Ethernet1                      Ethernet1                      Ethernet1
                              192.168.20.254/24              192.168.10.1/24                192.168.30.254/24
                    __________  V                  __________  V                  __________  V
((  heap o  ))     |          | V                 |          | V                 |          | V
(( internet )) ----| ROUTER C |------- /// -------| ROUTER A |------- /// -------| ROUTER B |----
((   w00t!  ))   ^ |__________|                 ^ |__________|                 ^ |__________|
                 ^                              ^                              ^
               Interface                      Interface                      Interface
               Ethernet0                      Ethernet0                      Ethernet0
               10.35.1.1/30                   192.168.20.1/24                192.168.10.254/24

Было бы хорошо, если бы маршрутизатор A мог маршрутизировать пакеты, не соответствующие какому-либо локальному интерфейсу, до маршрутизатора C, чтобы маршрутизатор C мог отправлять их в Интернет. Введите маршрут «шлюз по умолчанию».

Добавьте запись в конце нашей таблицы маршрутизации, например:

  • Идентификатор сети: 0.0.0.0 (00000000.00000000.00000000.00000000) - маска подсети / 0 - целевой маршрутизатор: 192.168.20.254

Когда мы пытаемся сопоставить «172.16.31.92» с каждой записью в таблице маршрутизации, мы попадаем в эту новую запись. Поначалу это немного сбивает с толку. Мы хотим сопоставить нулевые биты адреса назначения с ... подождите ... что? Соответствие нулевым битам? Итак, мы вообще не ищем матча. Эта запись в таблице маршрутизации, по сути, говорит: «Если вы попали сюда, вместо того, чтобы отказываться от доставки, отправьте пакет на маршрутизатор по адресу 192.168.20.254 и позвольте ему обработать его».

192.168.20.254 - это пункт назначения, который мы ДЕЛАТЬ знать, как доставить пакет. Когда мы сталкиваемся с пакетом, привязанным к месту назначения, для которого у нас нет конкретной записи в таблице маршрутизации, эта запись «шлюз по умолчанию» всегда будет совпадать (поскольку она соответствует нулевым битам адреса назначения) и дает нам место «последней надежды», которое мы можем отправлять пакеты на доставку. Иногда вы слышите, что шлюз по умолчанию называется «шлюз последней инстанции».

Чтобы маршрут шлюза по умолчанию был эффективным, он должен относиться к маршрутизатору, доступному с использованием других записей в таблице маршрутизации. Если вы попытаетесь указать шлюз по умолчанию 192.168.50.254 в маршрутизаторе A, например, доставка на такой шлюз по умолчанию не удастся. 192.168.50.254 - это не адрес, по которому маршрутизатор A знает, как доставлять пакеты, используя любой из других маршрутов в своей таблице маршрутизации, поэтому такой адрес будет неэффективным в качестве шлюза по умолчанию. Это можно сформулировать кратко: шлюз по умолчанию должен быть настроен на адрес, уже достижимый с помощью другого маршрута в таблице маршрутизации.

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

Городское планирование и IP-маршрутизация

Разделение IP-подсети на более мелкие IP-подсети похоже на городское планирование. В городском планировании зонирование используется для адаптации к естественным особенностям ландшафта (реки, озера и т. Д.), Для влияния на транспортные потоки между различными частями города и для разделения различных типов землепользования (промышленных, жилых и т. Д.) . IP-подсети действительно очень похожи.

Есть три основных причины, по которым вы должны подсеть сеть:

  • Возможно, вы захотите общаться с помощью разных средств коммуникации. Если у вас есть соединение T1 WAN между двумя зданиями, IP-маршрутизаторы могут быть размещены на концах этих соединений для облегчения связи через T1. Сети на каждом конце (и, возможно, «промежуточная» сеть на самом T1) будут назначены уникальным IP-подсетям, чтобы маршрутизаторы могли принимать решения о том, какой трафик следует отправлять по линии T1.

  • В сети Ethernet вы можете использовать подсети, чтобы ограничить объем широковещательного трафика в определенной части сети. Протоколы прикладного уровня используют широковещательные возможности Ethernet для очень полезных целей. Однако по мере того, как вы получаете все больше и больше хостов, упакованных в одну и ту же сеть Ethernet, процент широковещательного трафика в проводе (или эфире в беспроводном Ethernet) может возрасти до такой степени, что создаст проблемы для доставки не широковещательного трафика. (Раньше широковещательный трафик мог перегружать ЦП хостов, заставляя их проверять каждый широковещательный пакет. Сегодня это менее вероятно.) Избыточный трафик на коммутируемом Ethernet также может иметь форму «лавинной рассылки кадров в неизвестные места назначения». Это состояние вызвано тем, что коммутатор Ethernet не может отслеживать каждое место назначения в сети, и является причиной того, что коммутируемые сети Ethernet не могут масштабироваться до бесконечного числа хостов. Эффект лавинной рассылки кадров неизвестным адресатам аналогичен эффекту избыточного широковещательного трафика для целей разделения на подсети.

  • Вы можете захотеть «контролировать» типы трафика, передаваемого между различными группами хостов. Возможно, у вас есть устройства сервера печати, и вы хотите, чтобы только авторизованные компьютеры сервера очереди печати отправляли им задания. Ограничивая трафик, разрешенный для потока в подсеть устройства сервера печати, пользователи не могут настроить свои ПК для непосредственного взаимодействия с устройствами сервера печати, чтобы обойти учет печати. Вы можете поместить устройства сервера печати в отдельную подсеть и создать правило в маршрутизаторе или брандмауэре, подключенном к этой подсети, для управления списком хостов, которым разрешено отправлять трафик на устройства сервера печати. (Как маршрутизаторы, так и брандмауэры обычно могут принимать решения о том, как или следует ли доставлять пакет, на основе адресов источника и назначения пакета. Брандмауэры обычно являются подвидом маршрутизаторов с навязчивой индивидуальностью. Они могут быть очень, очень обеспокоены полезная нагрузка пакетов, тогда как маршрутизаторы обычно игнорируют полезную нагрузку и просто доставляют пакеты.)

При планировании города вы можете спланировать пересечение улиц друг с другом, а также использовать улицы с поворотом, односторонним движением и тупиковые улицы, чтобы влиять на транспортные потоки. Вы можете захотеть, чтобы Мэйн-стрит была длиной 30 кварталов, каждый из которых имел до 99 зданий. Довольно легко спланировать нумерацию улиц так, чтобы в каждом блоке на главной улице был диапазон номеров улиц, увеличивающийся на 100 для каждого блока. Очень легко узнать, каким должен быть «начальный номер» в каждом последующем блоке.

При планировании IP-подсетей вы должны создать правильное количество подсетей (улиц) с нужным количеством доступных идентификаторов хоста (номера зданий) и использовать маршрутизаторы для соединения подсетей друг с другом (пересечения). Правила о разрешенных адресах источника и назначения, указанные в маршрутизаторах, могут дополнительно управлять потоком трафика. Межсетевые экраны могут действовать как навязчивые гаишники.

Для целей этого ответа создание наших подсетей - наша единственная главная задача. Вместо того, чтобы работать с десятичными числами, как при городском планировании, вы работаете в двоичном формате для описания границ каждой подсети.

Продолжение: Как работает подсети IPv4?

(Да ... мы достигли максимального размера ответа (30000 знаков).)

Продолжение: Как работает подсети IPv4?

Ваш интернет-провайдер предоставляет диапазону идентификаторов сети 192.168.40.0/24 (11000000.10101000.00101000.00000000). Вы знаете, что хотите использовать брандмауэр / маршрутизатор, чтобы ограничить связь между различными частями вашей сети (серверами, клиентскими компьютерами, сетевым оборудованием), и, следовательно, вы хотите разбить эти различные части вашей сети. в IP-подсети (между которыми затем может маршрутизировать брандмауэр / маршрутизатор).

У тебя есть:

  • 12 серверных компьютеров, но вы можете получить на 50% больше
  • 9 переключателей
  • 97 клиентских компьютеров, но вы можете получить больше

Как хорошо разбить 192.168.40.0/24 на эти части?

Размышляя даже о степени двойки и работая с большим количеством возможных устройств, вы можете придумать:

  • 18 серверных компьютеров - следующая по величине степень двойки - 32
  • 9 переключателей - следующая по величине мощность двух - 16
  • 97 клиентских компьютеров - следующая по величине степень двойки - 128

В данной IP-подсети зарезервированы два адреса, которые нельзя использовать в качестве действительных IP-адресов устройств: адрес со всеми нулями в части идентификатора хоста и адрес со всеми единицами в части идентификатора хоста. Таким образом, для любой данной IP-подсети количество доступных адресов узлов равно двум в степени 32 минус количество битов в маске подсети минус 2. Таким образом, в случае 192.168.40.0/24 мы видно, что маска подсети имеет 24 бита. Таким образом, для идентификаторов хоста остается 8 бит. Мы знаем, что степень от 2 до 8 равна 256 - это означает, что 256 возможных комбинаций битов помещаются в слот шириной 8 бит. Поскольку комбинации «11111111» и «00000000» этих 8 бит недопустимы для идентификаторов хоста, это оставляет нам 254 возможных хоста, которые могут быть назначены в сети 192.168.40.0/24.

Похоже, из этих 254 хостов мы можем разместить в этом пространстве клиентские компьютеры, коммутаторы и серверы, верно? Давай попробуем.

У вас есть 8 бит маски подсети, с которой можно «поиграть» (оставшиеся 8 бит IP-адреса 192.168.40.0/24 не покрываются маской подсети, предоставленной вашим интернет-провайдером). Мы должны разработать способ использования этих 8 битов для создания ряда уникальных сетевых идентификаторов, которые могут поддерживать указанные выше устройства.

Начнем с самой большой сети - клиентских компьютеров. Вы знаете, что следующая большая степень двойки из числа возможных устройств равна 128. Число 128 в двоичном формате - это «10000000». К счастью для нас, он умещается в 8-битный слот, который у нас есть бесплатно (если бы его не было, это означало бы, что наша начальная подсеть слишком мала для размещения всех наших устройств).

Давайте возьмем идентификатор нашей сети, предоставленный нашим интернет-провайдером, и добавим к нему один бит маски подсети, разделив его на две сети:

11000000.10101000.00101000.00000000 - 192.168.40.0 network ID
11111111.11111111.11111111.00000000 - Old subnet mask (/24)

11000000.10101000.00101000.00000000 - 192.168.40.0 network ID
11111111.11111111.11111111.10000000 - New subnet mask (/25)

11000000.10101000.00101000.10000000 - 192.168.40.128 network ID
11111111.11111111.11111111.10000000 - New subnet mask (/25)

Просматривайте это, пока в нем не появится смысл. Мы увеличили длину маски подсети на один бит, в результате чего идентификатор сети покрыл один бит, который использовался бы для идентификатора хоста. Поскольку этот один бит может быть либо нулем, либо единицей, мы фактически разделили нашу сеть 192.168.40.0 на две сети. Первый действительный IP-адрес в сети 192.168.40.0/25 будет первым идентификатором хоста с цифрой «1» в крайнем правом бите:

11000000.10101000.00101000.00000001 - 192.168.40.1 - First valid host in the 192.168.40.0/25 network

Точно так же первый действующий хост в сети 192.168.40.128 будет первым идентификатором хоста с "1" в крайнем правом бите:

11000000.10101000.00101000.10000001 - 192.168.40.129 - First valid host in the 192.168.40.128/25 network

Последний действительный хост в каждой сети будет идентификатором хоста с каждым битом. Кроме крайний правый бит установлен в "1":

11000000.10101000.00101000.01111110 - 192.168.40.126 - Last valid host in the 192.168.40.0/25 network
11000000.10101000.00101000.11111110 - 192.168.40.254 - Last valid host in the 192.168.40.128/25 network

Таким образом, мы создали сеть, достаточно большую, чтобы вместить наши клиентские компьютеры, и вторую сеть, которую мы затем можем применить тот же принцип, чтобы разбить на еще более мелкие сети. Отметим:

  • Клиентские компьютеры - 192.168.40.0/25 - Действительные IP-адреса: 192.168.40.1 - 192.168.40.126

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

У нас есть 12 серверных компьютеров, но мы можем купить еще 6. Давайте возьмем 18, в результате чего следующая по величине степень 2 будет равна 32. В двоичном формате 32 равно «100000», что составляет 6 битов. У нас осталось 7 бит маски подсети в 192.168.40.128/25, так что у нас достаточно битов для продолжения "игры". Добавление еще одного бита маски подсети дает нам еще две сети:

11000000.10101000.00101000.10000000 - 192.168.40.128 network ID
11111111.11111111.11111111.10000000 - Old subnet mask (/25)

11000000.10101000.00101000.10000000 - 192.168.40.128 network ID
11111111.11111111.11111111.11000000 - New subnet mask (/26)
11000000.10101000.00101000.10000001 - 192.168.40.129 - First valid host in the 192.168.40.128/26 network
11000000.10101000.00101000.10111110 - 192.168.40.190 - Last valid host in the 192.168.40.128/26 network

11000000.10101000.00101000.11000000 - 192.168.40.192 network ID
11111111.11111111.11111111.11000000 - New subnet mask (/26)
11000000.10101000.00101000.11000001 - 192.168.40.193 - First valid host in the 192.168.40.192/26 network
11000000.10101000.00101000.11111110 - 192.168.40.254 - Last valid host in the 192.168.40.192/26 network

Итак, теперь мы разделили 192.168.40.128/25 на еще две сети, каждая из которых имеет 26 бит маски подсети, или всего 62 возможных идентификатора хоста - 2 ^ (32-26) - 2.

Это означает, что в обеих этих сетях достаточно адресов для наших серверов и коммутаторов! Сделаем заметки:

  • Серверы - 192.168.40.128/26 - Действительные IP-адреса: 192.168.40.129 - 192.168.40.190
  • Коммутаторы - 192.168.40.192/26 - Действительные IP-адреса: 192.168.40.193 - 192.168.40.254

Этот метод называется маскированием подсети переменной длины (VLSM) и при правильном применении приводит к тому, что «основные маршрутизаторы» имеют меньшие таблицы маршрутизации (посредством процесса, называемого «суммирование маршрута»). В случае с нашим интернет-провайдером в этом примере они могут совершенно не знать, как мы разбили 192.168.40.0/24 на подсети. Если их маршрутизатор имеет пакет, привязанный к 192.168.40.206 (один из наших коммутаторов), им нужно только знать, чтобы передать его нашему маршрутизатору (поскольку 192.168.40.206 соответствует идентификатору сети и маске подсети 192.168.40.0/24 в таблице маршрутизации их маршрутизатора. ) и наш роутер доставит его до места назначения. Благодаря этому маршруты нашей подсети не попадают в их таблицы маршрутизации. (Я здесь упрощаю, но идею вы поняли.)

Таким же образом можно спланировать очень большие географически сети. Пока вы делаете правильное «городское планирование» заранее (прогнозируя количество хостов в каждой подсети с некоторой точностью и с учетом будущего), вы можете создать большую иерархию маршрутизации, которая на основных маршрутизаторах »резюмируется «на очень небольшое количество маршрутов. Как мы видели выше, чем больше маршрутов находится в таблице маршрутизации маршрутизатора, тем медленнее он выполняет свою работу. Проектирование IP-сети с использованием VLSM и сохранение небольшого размера таблиц маршрутизации - это хорошее дело (tm).

Нереалистичность примеров

Вымышленный мир в этом ответе, очевидно, вымышленный. Обычно в современных коммутируемых сетях Ethernet можно создать подсети с более чем 254 хостами (в зависимости от профиля трафика). Как было указано в комментариях, использование сетей / 24 между маршрутизаторами несовместимо с Real Life (tm). Это неплохие примеры, но это пустая трата адресного пространства. Обычно a / 30 или a / 31 (см. http://www.faqs.org/rfcs/rfc3021.html для получения подробной информации о том, как работает / 31 - они наверняка выходят за рамки этого ответа) сеть используется на ссылках, которые строго являются двухточечными между двумя маршрутизаторами.

Суб-сеть

Подсеть не сложно, но может напугать. Итак, начнем с самого простого шага. Учимся считать в двоичном формате.

Двоичный

Двоичная - это система счета с основанием 2. Состоит всего из двух чисел (1 и 0). Подсчет происходит таким же образом.

1 = 001 ( 0 + 0 + 1 = 1)
2 = 010 ( 0 + 2 + 0 = 2)
3 = 011 ( 0 + 2 + 1 = 3)
4 = 100 ( 4 + 0 + 0 = 4)
5 = 101 ( 4 + 0 + 1 = 5)

Итак, если вы просто представите, что каждая единица является заполнителем для значения (все двоичные значения являются степенями двойки)

1     1     1     1     1 = 31
16  + 8  +  4  +  2  +  1 = 31

Итак ... 100000 = 32. И 10000000 = 128. И 11111111 = 255.

Когда я говорю: «У меня маска подсети 255.255.255.0», я на самом деле имею в виду «У меня маска подсети 11111111.11111111.11111111.00000000». Мы используем подсети как сокращение.

Точки в адресе разделяют каждые 8 ​​двоичных цифр (октет). Вот почему IPv4 известен как 32-битное (8 * 4) адресное пространство.

Почему подсеть?

Адреса IPv4 (192.168.1.1) в дефиците. Подсети дают нам возможность увеличить количество доступных сетей (или хостов). Это по административным и техническим причинам.

Каждый IP-адрес разбит на две отдельные части: сеть и хост. По умолчанию адрес класса C (192.168.1.1) использует первые 3 октета (192.168.1) для сетевой части адреса. и 4-й октет (.1) как часть хоста.

По умолчанию IP-адрес и маска подсети для адреса класса C выглядят следующим образом

IP     192.168.1.1 
Subnet 255.255.255.0

В двоичном виде

IP     11000000.10101000.00000001.00000001
Subnet 11111111.11111111.11111111.00000000

Посмотрите еще раз на двоичный пример. Обратите внимание, как я сказал, что первые три октета используются для сети? Обратите внимание, как сетевая часть состоит из всех единиц? Вот и все, что есть в подсети. Давайте расширимся.

Учитывая, что у меня есть один октет для моей части хоста (в приведенном выше примере). У меня может быть ТОЛЬКО 256 хостов (256 - максимальное значение октета, считая от 0). Но есть еще одна небольшая хитрость: вам нужно вычесть 2 адреса хоста из доступных (сейчас 256). Первый адрес в диапазоне будет для сети (192.168.1.0), а последний адрес в диапазоне будет широковещательным (192.168.1.255). Таким образом, у вас действительно есть 254 доступных адреса для хостов в одной сети.

Пример из практики

Допустим, я дал вам следующий лист бумаги.

Create 4 networks with 192.168.1.0/24.

Давайте посмотрим на это. / 24 называется нотацией CIDR. Вместо того, чтобы ссылаться на 255.255.255.0, мы просто ссылаемся на биты, которые нам нужны для сети. В этом случае нам нужно 24 бита (3 * 8) с 32-битного адреса. Записываем это в двоичном формате

11111111.11111111.11111111.00000000 = 255.255.255.0
8bits   + 8bits  + 8bits  + 0bits   = 24bits

Затем мы знаем, что нам нужно выяснить, сколько подсетей нам нужно. Похоже на 4. Поскольку нам нужно создать больше сетей (в настоящее время у нас есть только одна), давайте изменим некоторые биты.

11111111.11111111.11111111.00000000 = 255.255.255.0   = 1 Network OR /24
11111111.11111111.11111111.10000000 = 255.255.255.128 = 2 Networks OR /25
11111111.11111111.11111111.11000000 = 255.255.255.192 = 4 Networks (remember powers of 2!) OR /26

Теперь, когда мы определились с / 26, давайте приступим к распределению хостов. Маленькая простая математика:

32(bits) - 26(bits) = 6(bits) for host addresses.

У нас есть 6 бит, которые нужно выделить в каждой сети для хостов. Помня, что нам нужно вычесть 2 для каждой сети.

h = host bits    
2^h - 2 = hosts available

2^6 - 2 = 62 hosts 

Finally we have 62 hosts in 4 networks, 192.168.1.0/26

Теперь нам нужно выяснить, куда идут хосты. Вернемся к двоичному файлу!

11111111.11111111.11111111.00,000000 [the comma is the new network/hosts division]

Begin to calculate:

11000000.10101000.00000001.00,000000 = 192.168.1.0 [First IP = Network Adress]
11000000.10101000.00000001.00,000001 = 192.168.1.1 [First Host IP]
11000000.10101000.00000001.00,000010 = 192.168.1.2 [Second Host IP]
11000000.10101000.00000001.00,000011 = 192.168.1.3 [Third Host IP]

And so on ... until ...

11000000.10101000.00000001.00,111110 = 192.168.1.62 [Sixty Second Host IP]
11000000.10101000.00000001.00,111111 = 192.168.1.63 [Last IP = Broadcast Address]

So ... On to the NEXT network ....

11000000.10101000.00000001.01,000000 = 192.168.1.64 [First IP = Network Address]
11000000.10101000.00000001.01,000001 = 192.168.1.65 [First Host IP]
11000000.10101000.00000001.01,000010 = 192.168.1.66 [Second Host IP]

And so on ... until ...

11000000.10101000.00000001.01,111110 = 192.168.1.126 [Sixty Second Host IP]
11000000.10101000.00000001.01,111111 = 192.168.1.127 [Last IP = Broadcast Address]

So ... On to the NEXT network ....

11000000.10101000.00000001.10,000000 = 192.168.1.128 [First IP = Network Address]
11000000.10101000.00000001.10,000001 = 192.168.1.129 [First Host IP]

Etc ...

Таким образом вы можете рассчитать всю подсеть.

Wild Cards Подстановочная маска - это инвертированная маска подсети.

11111111.11111111.11111111.11000000 = 255.255.255.192 [Subnet]
00000000.00000000.00000000.00111111 = 0.0.0.63 [Wild Card]

Дальше

Google для терминов «супер-сеть» и «VLSM (маска подсети переменной длины)» для более сложных тем.

Теперь я вижу, что слишком долго отвечал ... вздох

Краткий урок истории: изначально одноадресные IPv4-адреса были разделены на 3 класса, каждый со связанной длиной маски по умолчанию (называемой классовой маской подсети)

  • Класс A: все, что находится в диапазоне 1.0.0.0 -> 127.255.255.255. Классовая маска подсети 255.0.0.0 (/ 8 в нотации CIDR)
  • Класс B: все, что находится в диапазоне 128.0.0.0 -> 191.255.255.255. Классовая маска подсети 255.255.0.0 (/ 16 в нотации CIDR)
  • Класс C: все, что находится в диапазоне 192.0.0.0 -> 223.255.255.255. Классовая маска подсети 255.255.255.0 (/ 24 в нотации CIDR)

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

Однако по мере роста IP-сетей стало ясно, что у этого подхода есть свои проблемы. Назову лишь три:

В классическом мире все подсети было иметь маску / 8, / 16 или / 24. Это означало, что самой маленькой подсетью, которую можно было настроить, была / 24, что позволяло использовать 254 адреса хоста (.0 и .255 зарезервированы как сетевой и широковещательный адреса соответственно). Это было чрезвычайно расточительно, особенно для соединений точка-точка, к которым подключено всего два маршрутизатора.

Даже после того, как это ограничение было снято, более ранние протоколы маршрутизации (например, RIPv1) не объявляла длину маски, связанную с префиксом IP. В отсутствие конкретной маски он будет использовать либо маску напрямую подключенного интерфейса в той же классовой сети, либо вернуться к использованию классовой маски. Например, если вы хотите использовать сеть 172.16.0.0 для соединений между маршрутизаторами с масками / 30, все подсети от 172.16.0.0 до 172.16.255.255 должны иметь маску / 30 (16384 подсети, каждая с двумя используемыми IP-адресами).

Таблицы маршрутизации интернет-маршрутизаторов стали занимать все больше и больше памяти; это было / известно как «взрыв таблицы маршрутизации». Например, если бы у провайдера было 16 смежных / 24 сетей, ему нужно было бы анонсировать все 16 префиксов, а не единую сводку, охватывающую весь диапазон.

Два связанные уточнения позволили нам выйти за рамки вышеуказанных ограничений.

  1. Маски подсети переменной длины (VLSM)
  2. CIDR (бесклассовая междоменная маршрутизация)

VLSM относится к способности протокола маршрутизации поддерживать разные маски подсети в одной и той же классовой сети. Например:

192.168.1.0/24

Может быть разделен на:

192.168.1.0/25
192.168.1.128/26
192.168.1.192/27
192.168.1.224/27

Что позволило гораздо более эффективно использовать адресное пространство; подсети могут иметь правильный размер для количества хостов / маршрутизаторов, которые будут к ним подключены.

CIDR берет VLSM и расширяет его в другую сторону; Помимо разделения одной классовой сети на более мелкие подсети, CIDR позволяет агрегировать несколько классовых сетей в единую сводку. Например, следующие сети класса B (/ 16):

172.16.0.0/16
172.17.0.0/16
172.18.0.0/16
172.19.0.0/16

Можно агрегировать / суммировать с помощью одного префикса:

172.16.0.0/14

Что касается подсетей: маска подсети имеет длину 32 бита. Длина маски указывает, сколько бит идентифицирует сетевую часть адреса. Например:

10.1.1.0/24
  • Классовая маска подсети / 8
  • Фактическая маска подсети / 24
  • 16 бит (24-8) были «заимствованы» для использования подсетей.

Это означает, что при условии, что вся сеть 10.0.0.0/8 разделена на подсети / 24, в этом диапазоне будет 65536 (2 ^ 16) подсетей. (Предполагается, что используемая вами платформа поддерживает номера подсетей от 0 до 255. См. IP-подсеть Cisco-ноль).

В «части хоста» адреса осталось 8 бит. Это означает, что имеется 256 доступных IP-адресов (2 ^ 8), из которых 2 зарезервированы (10.1.1.0 - сетевой адрес, 10.1.1.255 - направленный широковещательный адрес подсети). В этой подсети остается 254 используемых IP-адреса. ((2 ^ 8) - 2)

Сетевые диапазоны: сети всегда обозначаются двумя номерами: одно для определения сети, а другое для определения того, какой компьютер (или хост) находится в этой сети. Поскольку каждый адрес в сети состоит из 32 бита, оба числа должны уместиться в этих 32 бита.

Нумерация сети важна, поскольку ее выдает ICANN, когда вы запрашиваете диапазон IP-адресов сети. Если бы у нас его не было, никто бы не смог отличить мою сеть от AT&T. Таким образом, хотя эти номера должны быть уникальными, никто другой не хочет назначать номера хостам в моей сети. Отсюда и разделение - первая часть управляется людьми, работающими в сети, вторая часть принадлежит мне и я могу передать их любым машинам, которые я хочу.

Номер сети не фиксируется на определенном количестве бит - например, если бы у меня было только 200 машин, которыми я управлял, я был бы полностью доволен сетевым номером, который использует 24 бита, оставляя мне только 8 бит для себя. - чего хватит на 255 хостов. Поскольку номер сети состоит из 24 бита, их может быть много, а это значит, что многие люди могут иметь свои собственные сети.

В прошлом это называлось сетью класса C. (класс B использовал 16 бит для номера сети, а класс A использовал 8 бит, поэтому существует только несколько сетей класса A).

В настоящее время такое соглашение об именах вышло из моды. Он был заменен концепцией под названием CIDR. CIDR явно помещает количество бит для ваших хостов после косой черты. Итак, мой пример выше (класс C) теперь называется CIDR / 24.

Это дает нам немного больше гибкости, раньше, если бы у меня было 300 хостов для управления, мне нужна была бы сеть класса B! Теперь я могу просто получить / 23 CIDR, поэтому у меня есть 9 бит для меня и 23 бита для номера сети. ICANN может не иметь таких сетей, но если у меня есть внутренняя или я арендую частичную сеть у провайдера, это упрощает управление - тем более, что всем их клиентам можно дать / 29 (оставив меня. . 3 бита или максимум 8 машин), что позволяет большему количеству людей иметь свой собственный небольшой кусок доступных IP-адресов. Пока мы не получим IPv6, это очень важно.


Однако ... хотя я знаю, что / 24 CIDR является эквивалентом старой сети класса C, а / 16 - это класс B, а / 8 - класс A ... Я все еще в тупике, пытаясь вычислить / 22 в моя голова. К счастью, есть инструменты, которые делают это за меня :)

Однако - если вы знаете, что / 24 - это 8 бит для хостов (и 24 бита для сети), то я знаю, что / 23 дает мне дополнительный бит, который удваивает количество хостов.

Попутно я задам несколько связанных вопросов и отвечу на них:

  • Почему ты видишь 255.255.255.0 так часто?
  • Зачем 192.168.0.1?
  • Зачем 127.0.0.1?

Почему такие странные числа - 255, 192, 168, 127?


8 + 8 + 8 + 8-битный десятичный разделитель

Интернет-адреса, например 194.60.38.10 использовать десятичная запись с разделительными точками чтобы разбить 32 бита на 8 + 8 + 8 + 8 бит. Пунктирно-десятичный означает преобразование каждое число в двоичную систему, затем заполняя его слева 0S.

Например .60. → 60 = 32 + 16 + 8 + 4 → 111100.00111100..

Итак, 194.60.38.10 является десятичным с точками для 4 × 8 = 32-битного адреса. 11000010.00111100.00100110.00001010, так как 38 → 100110, 10 → 1010, и так далее. 194 требует всех 8 бит; остальные мягкие.

Если вы подумаете о 255, 192 и 127 в 8-битном двоичном формате, вы сможете легче понять, почему некоторые десятичные числа так распространены:

  • 255 = 11111111
  • 192 = 11000000
  • 127 = _1111111
  • 128 = 10000000

Эти десятичные числа представляют собой визуально удобные 8-битные блоки, такие как ■■■■■■■■, ■ □□□□□□□ и □ ■■■■■■■. Таким образом, вы никогда не видели 256 = 2⁹ из-за 8-битного ограничения, а 127 = 128−1 = 2⁸ − 1 - это переворот степени двойки, а степени двойки равны 10………00000В двоичном формате.

  • 168 = 10101000

Маски подсети: что мое - мое + то, что ваше, - ваше

Маски подсети затем разбейте каждый 32-битный интернет-адрес на идентификатор сети и идентификатор хоста. В то время как интернет-адреса могут содержать любую комбинацию единиц и нулей, маски подсети начинаются только с единиц и заканчиваются только нулями.

■■□□□□■□|□□■■■■□□|□□■□□■■□|□□□□■□■□ IP
■■■■■■■■|■■■■■■■■|■■■■■■■■|□□□□□□□□ subnet

Вычеркнув первые 8 + 8 + 8 = 24 бита и вычеркнув последние 8 бит, можно разделить IP-адрес. ■■ □□□□ ■ □ | □□ ■■■■ □□ | □□ ■ □□ ■ ■ □ | □□□□ ■ □ ■ □ на две части:

■■□□□□■□|□□■■■■□□|□□■□□■■□          network
                             □□□□■□■□ host

Если владелец подсети (скажем, OmniCorp) хотели больше внутренних IP-адресов, они могли бы скупить больше (скажем, 8 + 8 = 16 бит) правой стороны сети, например:

■■□□□□■□|□□■■■■□□|□□■□□■■□|□□□□■□■□ IP
■■■■■■■■|■■■■■■■■|□□□□□□□□|□□□□□□□□ subnet
■■□□□□■□ □□■■■■□□                    network
                   □□■□□■■□ □□□□■□■□ host

Ясно, что в адресном пространстве 32-бит = 2³² = 4 294 967 296 вариантов есть компромисс: если вы покупаете больше идентификаторов сети (левая сторона), ваша внутренняя сеть будет иметь больше идентификаторов хоста (правая сторона) для назначения.

Поэтому у дешевых людей маска подсети

255.255.255.0 = ■■■■■■■■ | ■■■■■■■■ | ■■■■■■■■ | □□□□□□□□□.

Даже у более дешевых людей есть

255.255.255.128 = ■■■■■■■■ | ■■■■■■■■ | ■■■■■■■■ | ■ □□□□□□□□

или 255.255.255.192 = ■■■■■■■■ | ■■■■■■■■ | ■■■■■■■■ | ■■ □□□□□□.

Согласно фольклору, на самом деле это был не Роджер Миллер, а скромный системный администратор с маской 255.255.255.254, который первоначально написал Король дороги, заменив «У меня нет большой подсети» на «У меня нет сигарет».

(Почему маски простых людей заполнены такими большими числами? Потому что, как рассказчик Миллера, маски подсети учитывают все, что вы не иметь.)


Что означает косая черта после IP? (например, 194.60.38.10/24)

Поскольку маски подсети (которые отделяют «свои» от «наших») всегда начинаются с 1И поскольку мы ненавидим суммировать степени двойки даже больше, чем вообще ненавидим вычислять степень двойки, кто-то изобрел CIDR (косая черта после IP).

194.60.38.10/24 означает «в подмаске 24 единицы, остальные - нули», поэтому

■■■■■■■■ | ■■■■■■■■ | ■■■■■■■■ | □□□□□□□□ с 8 + 8 + 8 бит, принадлежащих «им» и 8 бит принадлежащие «нам».

Перевернув гимн бродяги выше,

  • /31 автор песен
  • /24 средний класс (255.255.255.0 = ■■■■■■■■ | ■■■■■■■■ | ■■■■■■■■ | □□□□□□□□
  • /16 богатый ■■■■■■■■ | ■■■■■■■■ | □□□□□□□□ | □□□□□□□□
  • /8 супербогатый ■■■■■■■■ | □□□□□□□□ | □□□□□□□□ | □□□□□□□□
  • /1 или /0 будет IANA или что-то в этом роде.





† Использование bc -l; obase=10; 60 например.

Хотя приведенное выше верно (извините, TL; DR), вычисление подсетей по-прежнему вызывает у многих сетевых администраторов много горя. На самом деле существует очень простой способ вычисления подсети, вы можете сделать большую часть этого в уме, и вам очень мало нужно запоминать. Для большинства приложений даже не обязательно понимать двоичное представление, хотя это полезно для полного понимания разбиения на подсети. Здесь я буду обсуждать только IPv4; IPv6 выходит за рамки этого обсуждения.

Помните это:

Следует помнить о трех ключевых моментах: все подсети основаны на степени двойки, и есть два ключевых числа: 256 и 32. Подробнее об этом позже.

Во-первых, давайте посмотрим на таблицу, содержащую степени двойки:

2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64
2^7 = 128
2^8 = 256

Вычислить степени двойки легко: каждое целое увеличение степени удваивает результат. 1 + 1 = 2, 2 + 2 = 4, 4 + 4 = 8, 8 + 8 = 16 и т. Д. Общее количество адресов в подсети всегда должно быть степенью двойки..

Поскольку каждый октет подсети IPv4 увеличивается до 256, 256 это очень важный номер и формирует основу для остальной части математики.

Определение размера подсети

Начнем с простого вопроса: "сколько адресов в подсети, если маска 255.255.255.248?" Мы пока проигнорируем первые три октета и посмотрим на последний. Вот как это просто: вычтите 248 из 256. 256 минус 248 равно 8. Доступно 8 адресов (включая сетевой и широковещательный). Обратное также работает: «если я хочу иметь подсеть с 16 адресами, какой будет маска подсети?» 256 минус 16 равно 240. Маска подсети будет 255.255.255.240.

Теперь, если мы хотим выйти за пределы 256 адресов (исторически «класс C»), это становится немного сложнее: если наш последний октет равен 0, а наш третий октет, скажем, 240, (255.255.240.0), то мы производим вычисления с третьим октетом и обнаруживаем, что будет 16 адресов. Итак, мы умножаем 16 на 256 (количество адресов в последнем октете), чтобы получить 4096. Если оба последних октета равны 0 (например, 255.240.0.0), тогда мы берем результат вычитания из второго октета (мы скажем, что это снова 16), умножаем, но 256 (адреса в третьем октете), снова умножаем на 256 (адреса в последнем октете), чтобы получить 1 048 576 адресов. Как это просто! (Хорошо, обратное немного сложнее. Если нам нужна подсеть с 1 048 576 адресами, нам придется пару раз разделить это число на 256, чтобы получить число, которое мы можем вычесть из 256.)

Сетевой адрес

Теперь, когда мы знаем, как рассчитать маску подсети, как определить сетевой адрес? Это просто: оно всегда кратно количеству адресов в нашей подсети. Итак, если у нас есть 16 адресов в нашей подсети, возможные сетевые адреса будут 0, 16, 32, 48, 64 и так далее до 240. (Обратите внимание, что 0 является допустимым кратным любому числу, так как любое число, умноженное на 0 равно 0.)

И, конечно же, широковещательный адрес будет последним адресом в области. Итак, если у нас есть 16 адресов в нашей подсети, и мы выбрали сетевой адрес 10.3.54.64, широковещательный адрес будет (64 + 16-1 = 79) 10.3.54.79.

Обозначение CIDR

Так как насчет нотации CIDR? Как преобразовать это в маску подсети в стиле IPv4 и обратно?

Помните наши силы двойки? Что ж, теперь у нас есть еще один ключевой номер, который нужно запомнить, помимо 256: 32. Помните, что нотация CIDR описывает количество значащих битов в IPv4-адресе, а в IPv4-адресе 32 бита, по 8 на каждый октет. Итак, если у нас есть маска подсети 255.255.255.240, это 16 адресов. Если мы посмотрим на нашу таблицу «степеней двойки» выше, мы увидим, что 16 равно двум в четвертой степени (2 ^ 4). Таким образом, мы вычитаем это число степени - 4 - из 32 и получаем 28. Наша нотация CIDR для маски подсети 255.255.255.240, наша нотация CIDR - / 28.

И если нам дан CIDR, равный / 28, мы вычитаем это (28) из 32, чтобы получить 4; возвести 2 в эту (4-ю) степень (2 ^ 4), чтобы получить 16; затем вычтите это (16) из 256, чтобы получить 240; или 255.255.255.240.

Я также считаю, что следует хотя бы упомянуть NAT, потому что они так часто используются в современных сетях вместо подсетей из-за исчерпания адресов IPv4, среди прочего. (Кроме того, когда я впервые узнал о подсетях, я был очень смущен тем, как разделение на подсети связано с сетями, созданными маршрутизаторами WiFi).

NAT (преобразование сетевых адресов) - это метод (обычно), используемый для создания частных сетей путем сопоставления одного адресного пространства (IP: порт) с другим. В основном это используется для создания частной сети из нескольких частных IP-адресов за одним общедоступным адресом, например, в маршрутизаторах Wi-Fi, организациями (такими как университет или корпорация), а иногда и интернет-провайдерами.

Фактический перевод адреса выполнен прозрачно в узлах с поддержкой NAT, обычно в маршрутизаторах. Это может быть множество форм: полный конус, ограничение адреса, ограничение порта и т. Д. Или их комбинация, которая определяет, как могут быть инициированы соединения через узел.

Полную информацию можно найти на Википедия, но, например, рассмотрим Wi-Fi-роутер с двумя подключенными к нему устройствами. Публичный IP-адрес маршрутизатора 10.9.20.21/24, а IP-адреса устройств (частные IP-адреса) A: 192.168.0.2, B: 192.168.0.3 а маршрутизатор R: 192.168.0.1. Таким образом, если A хочет подключиться к серверу S: 10.9.24.5/24, (который на самом деле находится в другой подсети относительно маршрутизатора):

  1. A отправляет IP-пакет в R(который будет шлюзом по умолчанию) с исходным IP 192.168.0.2, порт src (скажем) 14567, и IP-адрес назначения: 10.9.24.5 (Хотя порт фактически является частью заголовка TCP).
  2. Маршрутизатор (который поддерживает NAT) отображает порт 14567 к устройству A и меняет источник IP-пакета на 10.9.20.21(который является общедоступным IP-адресом маршрутизатора). В отличие от описанного выше разделения на подсети, где IP-пакеты фактически никогда не меняются.
  3. S получает серию TCP-пакетов (с src IP: 10.9.20.21, порт src: 14567) и отправьте ответные пакеты с этими значениями в полях назначения.
  4. R проверяет порт назначения, который 14567 и пересылает пакет в A.
  5. A получает ответный пакет.

В приведенной выше ситуации, если B пытался открыть соединение на том же исходном порту (14567), он будет отображен на другой порт с помощью R(и порт в исходящем пакете изменился) перед отправкой на S. То есть также была бы трансляция портов, а не только IP.

Здесь следует отметить две вещи:

  1. Из-за такой трансляции адресов часто невозможно инициировать соединение с устройствами в частной сети без использования некоторых специальных методов.
  2. Ограничение на общее количество TCP-соединений от одного и того же устройства к серверу (65536 = 2 ^ 16) теперь применяется коллективно ко всем устройствам за NAT в форме NAT, использованной выше.