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

  • Что такое бесклассовая маршрутизация и почему устаревшая маршрутизация на основе классов?
  • Если у меня есть сеть, как мне понять, как ее разделить?
  • Если мне дают маску сети, как я узнаю, каков диапазон ее сети?
  • Иногда есть косая черта, за которой следует число; что это за номер?
  • Иногда есть маска подсети, но также маска подстановки. Они кажутся одинаковыми, но они разные?
  • Кто-то упомянул что-то о знании двоичного файла для этого?
  • Что такое NAT (трансляция сетевых адресов)?

Примечания по этому вопросу

В последние несколько лет я задавал довольно много вопросов о подсетях к этому вопросу о сбое сервера. Это их канонический вопрос по IPv4 и подсетям.

К сожалению, я не могу ответить на вопросы VTC о Super User как дубликаты этого вопроса, поскольку технически это другой сайт.

В качестве [временного] решения я копирую этот вопрос / ответ здесь, надеясь, что он станет каноническим вопросом / ответом для Супер пользователя.

Если вы можете улучшить его, пожалуйста, оставьте ответ или оставьте комментарии.

3 ответа3

6

Существуют 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". Когда все эти подсчеты и перестановки будут выполнены, последним числом, которое вы произнесете вслух, будет десятичное представление двоичного числа, с которого начинался одометр.

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

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

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

Начните с подсчета количества бит в двоичном числе. В этом случае их 7. Сделайте 7 делений на листе бумаги (в своем уме, в текстовом файле и т.д.) И начните заполнять их справа налево. В крайнем правом слоте введите число "1", потому что мы всегда будем начинать с "1". В следующем слоте слева введите двойное значение в слоте справа (так, "2" в следующем, "4" в следующем) и продолжайте, пока все слоты не заполнятся. (Вы запомните эти числа, которые являются степенями 2, по мере того, как вы будете делать это все больше и больше. Я в порядке до 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?Msgstr "Если ответ" да ", вычеркните" 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

Написанные бок о бок, вы можете видеть, что точка в маске подсети, где "1" останавливается, "соответствует" точке в 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 1's in subnet mask, remaining bits set to 0
00000000.00000000.00011000.00101001 - Portion of IP address covered by 0's in subnet mask, remaining bits set to 0

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

      10.      13.     192.       0
00001010.00001101.11000000.00000000 - Network ID

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

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

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

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

Больше терминологии

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

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

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

Некоторые устройства используют обозначение, называемое "подстановочные маски". "Маска подстановки" - это не что иное, как маска подсети со всеми 0, где будут 1, и 1, где будут 0. "Маска подстановки" в /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 - интерфейсный маршрутизатор A-Ethernet0
  • Идентификатор сети: 192.168.10.0 (11000000.10101000.00001010.00000000) - маска подсети /24 - интерфейсный маршрутизатор A-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 хочет доставить пакеты в сеть с маской подсети 255.255.255.0 192.168.20.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 прикрепленной к маршрутизатору А наш гипотетический пакету с ПК на 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 не является адресом, который Маршрутизатор А знает, как доставлять пакеты, используя любой из других маршрутов в своей таблице маршрутизации, поэтому такой адрес будет неэффективен в качестве шлюза по умолчанию. Это можно сформулировать кратко: шлюз по умолчанию должен быть настроен на адрес, который уже доступен при использовании другого маршрута в таблице маршрутизации.

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

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

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

Существует три основных причины, по которым вы бы подключили сеть:

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

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

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

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

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

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

Продолжение: https://serverfault.com/questions/49765/how-does-subnetting-work/226445#226445

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

4

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

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

Давайте скажем, что у нас есть сеть 172.18.0.0 /16, и мы хотим разбить ее на более мелкие сети. Для этого нам нужно позаимствовать некоторые биты хоста из данной сети. Прямо сейчас наши биты сети - это 172,18 октета, а биты нашего хоста - в 0,0 октета. В двоичном коде это будет набор из 1 и 0, но чтобы помочь вам визуально увидеть это, я собираюсь использовать N для сети и H для битов хоста.

Мы бы имели nnnnnnnn.nnnnnnnn.hhhhhhhh.hhhhhhhh. Чтобы сделать нашу сеть меньше, нам нужно взять некоторые из этих "h" битов и сделать их "n" битами. Формула для этого 2 ^ n. Тогда это скажет вам, сколько сетей вы можете сделать. Поэтому, если мы просто заимствуем один бит "h", мы бы взяли 2 ^ 1 = 2. Итак, теперь наши октеты будут выглядеть как nnnnnnnn.nnnnnnnn.nhhhhhhh.hhhhhhhh. Поскольку битовые значения октетов идут 128 16 32 16 8 4 2 1, наш новый сетевой бит использует .128. Таким образом, наши сети будут 172.18.0.0 /17 и 172.18.128.0 /17.

Если бы нам дали задачу разбить нашу сеть на 8 небольших сетей, нам просто нужно найти 2 ^ n = 8. Поскольку 2 ^ 3 = 8, мы собираемся заимствовать три хост-бита. Так что теперь наши биты будут выглядеть как nnnnnnnn.nnnnnnnn.nnnhhhhh.hhhhhhhh. Так как наш бит сети теперь использует 32 бита, наши сети будут работать на 32. Таким образом, ваши четыре сети будут 172.18.0.0 /19, 172.18.32.0 /19, 172.18.64.0 /19 и так далее, пока вы не доберетесь до своей последней сети 172.18.224.0/19.

В другом примере, давайте разделим 10.0.0.0 /8 на четыре подсети. Опять же, наши биты будут выглядеть как nnnnnnnn.hhhhhhhh.hhhhhhhh.hhhhhhhh. Теперь нам нужно выяснить 2 ^ n = 4. Поскольку 2 ^ 2 = 4, мы заимствуем два хост-бита и используем их в качестве сетевых битов Таким образом, наш октет теперь будет выглядеть как nnnnnnnn.nnhhhhhh.hhhhhhhh.hhhhhhhh. И наши сети будут 10.0.0.0 /10 и 10.64.0.0 /10.

Теперь, когда мы знаем наши сетевые адреса, найти широковещательный адрес и количество узлов в подсети очень просто. Например, наша первая сеть 172.18.0.0 - это 172.18.0.0 /17, а следующая сеть будет 172.18.32.0 /17. Широковещательный адрес всегда является последним адресом подсети, поэтому для сети 172.18.0.0 это будет 172.18.31.255. Для сети 172.18.32.0 это будет 172.18.63.255.

Чтобы узнать количество узлов, длинный / трудный путь - это 2 ^ ч. H количество битов хостов, которые у вас есть. Таким образом, для сети 172.18.0.0 / 17 у нас есть 15 битов хоста, поэтому мы бы взяли 2 ^ 15 = 32768.

Я не уверен, как у всех обстоят дела с подсетями в целом, но вот несколько ярлыков. Если вы хотите узнать количество подсетей, просто возьмите битовое значение 128 64 32 16 8 4 2 1 и разделите его на 256. В приведенном выше примере нам понадобилось восемь подсетей. Все, что вам нужно сделать, это взять 256/32 = 8. Тогда вы будете считать свои сети на 32, так как вы используете 32-значный бит.

Чтобы узнать количество узлов в сети, вы просто начинаете удваивать числа. A /30 может иметь 4 хоста, 2 из них могут быть использованы. /29 имеет 8, /28 имеет 16 и так далее. Последний октет действительно идет по битовым значениям, поэтому он просто идет 128 64 32 16 8 4 2 1. Это общее количество хостов, если вы минус 2, это будет количество используемых хостов.

Затем, как только вы доберетесь до /23, вы начнете удваиваться от предыдущего октета. A /24 - 256, /23 - 512, /22 1024. Затем просто удваивайте каждый раз, когда вы увеличиваете одно битовое значение.

2

Продолжение с: https://serverfault.com/questions/49765/how-does-subnetting-work/49836#49836

Ваш интернет-провайдер предоставляет диапазон ID сети 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 бит. У нас осталось 19 битов маски подсети в 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). Это делает для симпатичных примеров, но это пустая трата адресного пространства. Как правило, /30 или /31 (подробности о том, как работает /31, см. Http://www.faqs.org/rfcs/rfc3021.html - они точно не входят в рамки этого ответа), сеть используется ссылки, которые являются строго двухточечными между двумя маршрутизаторами.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .