как работает подсеть ipv4?

<blockquote> <p>это <a href="http://meta.serverfault.com/questions/1986">канонический вопрос</a> о подсетях ipv4.</p> <p>связанные с:</p> <ul> <li> <a href="https://serverfault.com/questions/426183">как работает подсеть ipv6 и чем она отличается от подсети ipv4?</a> </li> </ul> </blockquote><p><strong> как работает подсеть и как вы это делаете <em> от руки</em> или у вас в голове? </strong> может кто-то объяснить оба концептуально а с несколькими примерами? сбой сервера получает множество вопросов домашней работы по подсетям, поэтому мы могли бы использовать ответ, чтобы указать на сам сбой сервера.</p><ul> <li>если у меня есть сеть, как мне понять, как ее разделить?</li> <li>если мне дают маску сети, как мне узнать, какой диапазон сети для него?</li> <li>иногда после косой черты следует число, что это за число?</li> <li>иногда есть маска подсети, но также маска подстановочного знака, они кажутся одинаковыми, но они разные?</li> <li>кто-то упомянул что-то о знании двоичного файла для этого?</li> </ul>

<p>существуют ip-подсети, позволяющие маршрутизаторам выбирать подходящие места назначения для пакетов. вы можете использовать ip-подсети, чтобы разбить большие сети по логическим причинам (брандмауэр и т.д.) или по физической необходимости (небольшие широковещательные домены и т.д.).</p><p>проще говоря, ip-маршрутизаторы используют ваши ip-подсети для принятия решений о маршрутизации. понять, как эти решения работают, и вы сможете понять, как планировать ip-подсети.</p><h2>считать до 1</h2><p>если вы уже свободно знакомы с двоичной системой счисления (база 2), вы можете пропустить этот раздел.</p><p>для тех из вас, кто остался: позор вам за то, что вы не владеете двоичными данными!</p><p>да, это может быть немного резким. это действительно, очень легко научиться считать в двоичном виде, а также научиться использовать быстрые клавиши для преобразования двоичного числа в десятичное и обратно. вы действительно должны знать, как это сделать.</p><p>считать в двоичном виде так просто, потому что вам нужно знать только 1!</p><p>подумайте о "одометре" автомобиля, за исключением того, что, в отличие от традиционного одометра, каждая цифра может считаться только от 1 до 0. когда автомобиль только что с завода, одометр показывает "00000000".</p><p>когда вы проехали свою первую милю, на одометре появится надпись "00000001". все идет нормально.</p><p>когда вы проехали вторую милю, первая цифра одометра возвращается к "0" (так как его максимальное значение равно "1"), а вторая цифра одометра возвращается к "1", делая показания одометра " 00000010" . это похоже на число 10 в десятичной записи, но на самом деле это 2 (количество миль, которые вы проехали до сих пор) в двоичной записи.</p><p>когда вы проехали третью милю, на одометре появится надпись "00000011", поскольку первая цифра одометра снова поворачивается. число "11" в двоичной записи совпадает с десятичным числом 3.</p><p>наконец, когда вы проехали свою четвертую милю, обе цифры (которые читались как "1" в конце третьей мили) возвращаются в нулевую позицию, а третья цифра сворачивается в позицию "1", давая нам " 00000100" . это двоичное представление десятичного числа 4.</p><p>вы можете запомнить все это, если хотите, но вам действительно нужно понять <em> как </em> маленький одометр "переворачивается", когда число, которое он считает, становится больше , это то же самое, что и традиционная десятичная операция одометра, за исключением того, что каждая цифра может быть только "0" или "1" на нашем вымышленном "двоичном одометре".</p><p>чтобы преобразовать десятичное число в двоичное, вы можете повернуть одометр вперед, отметив галочкой, считая вслух, пока вы не свернули его число, равное десятичному числу, которое вы хотите преобразовать в двоичное. все, что будет отображаться на одометре после всего этого, будет двоичным представлением десятичного числа, которое вы посчитали.</p><p>поскольку вы понимаете, как одометр катится вперед, вы также поймете, как он катится назад. чтобы преобразовать двоичное число, отображаемое на спидометре, в десятичное, вы можете повернуть спидометр на одну отметку за раз, считая вслух, пока на спидометре не появится "00000000". когда все эти подсчеты и перестановки будут выполнены, последним числом, которое вы произнесете вслух, будет десятичное представление двоичного числа, с которого начинался одометр.</p><p>преобразование значений между двоичными и десятичными этим способом было бы <em> очень </em> утомительным. вы могли бы сделать это, но это было бы не очень эффективно. легче выучить небольшой алгоритм, чтобы сделать это быстрее.</p><p>небольшое отступление: каждая цифра в двоичном числе называется "бит". это "б" от "двоичного" и "это" от "цифры". бит - это двоичная цифра.</p><p>преобразование двоичного числа, например, "1101011", в десятичное - это простой процесс с небольшим удобным алгоритмом.</p><p>начните с подсчета количества бит в двоичном числе. в этом случае есть 7. сделайте 7 делений на листе бумаги (в вашем уме, в текстовом файле и т.д.) и начните заполнять их справа налево. в крайнем правом слоте введите число "1", потому что мы всегда будем начинать с "1". в следующем слоте слева введите двойное значение в слоте справа (так, "2" в следующем, "4" в следующем) и продолжайте, пока все слоты не заполнятся. (в итоге вы запомните эти числа, которые являются степенями 2, так как вы делаете это все больше и больше. у меня все в порядке до 131 072 в голове, но после этого мне обычно нужен калькулятор или бумага).</p><p>итак, у вас должно быть следующее на вашей бумаге в ваших маленьких слотах.</p><pre><code> 64 | 32 | 16 | 8 | 4 | 2 | 1 | </code></pre><p>переписать биты из двоичного числа под слотами, вот так:</p><pre><code> 64 | 32 | 16 | 8 | 4 | 2 | 1 | 1 1 0 1 0 1 1 </code></pre><p>теперь добавьте несколько символов и вычислите ответ на задачу:</p><pre><code> 64 | 32 | 16 | 8 | 4 | 2 | 1 | x 1 x 1 x 0 x 1 x 0 x 1 x 1 --- --- --- --- --- --- --- + + + + + + = </code></pre><p>делая всю математику, вы должны придумать:</p><pre><code> 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 </code></pre><p>вот и все. "1101011" в десятичном виде - 107. это просто простые шаги и простая математика.</p><p>преобразование десятичного числа в двоичное такое же простое и является тем же базовым алгоритмом, работающим в обратном порядке.</p><p>скажем, мы хотим преобразовать число 218 в двоичное. начиная справа от листа бумаги, напишите число "1". слева, удвойте это значение (так, "2") и продолжайте двигаться влево от бумаги, удваивая последнее значение. если число, которое вы собираетесь написать, больше, чем преобразуемое число, прекратите запись. в противном случае продолжайте удваивать предыдущий номер и писать. (преобразование большого числа, такого как 34 157 216 092, в двоичное с использованием этого алгоритма может быть немного утомительным, но, безусловно, возможно.)</p><p>итак, вы должны иметь на бумаге:</p><pre><code> 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | </code></pre><p>вы перестали писать числа на 128, потому что удвоение 128, которое даст вам 256, будет больше, чем число, которое преобразуется (218).</p><p>начиная с крайнего левого числа, напишите "218" над ним (128) и спросите себя: "218 больше или равно 128?" если ответ "да", вычеркните "1" ниже "128". выше "64" напишите результат 218 минус 128 (90).</p><p>глядя на "64", спросите себя: "90 больше или равно 64?" таким образом, вы должны написать "1" ниже "64", затем вычесть 64 из 90 и записать это выше "32" (26).</p><p>когда вы добираетесь до "32", вы обнаруживаете, что 32 не больше или не равно 26. в этом случае напишите "0" ниже "32", скопируйте число (26) сверху 32 "выше" 16 ", а затем продолжайте задавать себе тот же вопрос с остальными числами.</p><p>когда вы все закончите, вы должны иметь:</p><pre><code> 218 90 26 26 10 2 2 0 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | 1 1 0 1 1 0 1 0 </code></pre><p>числа в верхней части - это просто заметки, используемые в вычислениях, и они мало что значат для нас. однако внизу вы видите двоичное число "11011010". конечно, 218, преобразованный в двоичный файл, равен "11011010".</p><p>следуя этим очень простым процедурам, вы можете конвертировать двоичные числа в десятичные и обратно без калькулятора. математика очень проста, и правила могут быть запомнены с небольшой практикой.</p><h2>разделение адресов</h2><p>думайте о ip-маршрутизации как о доставке пиццы.</p><p>когда вас попросят доставить пиццу на "123 main street", вам, как человеку, очень ясно, что вы хотите пойти в здание с номером "123" на улице с названием "main street". легко понять, что вам нужно перейти на 100-квартал мейн-стрит, потому что номер здания составляет от 100 до 199, а большинство городских кварталов исчисляются сотнями. вы "просто знаете", как разделить адрес.</p><p>маршрутизаторы доставляют пакеты, а не пиццу. их работа такая же, как и у водителя пиццы: доставить груз (пакеты) как можно ближе к месту назначения. маршрутизатор подключен к двум или более ip-подсетям (чтобы быть полезным). маршрутизатор должен проверить ip-адреса назначения пакетов и разбить эти адреса назначения на их компоненты "название улицы" и "номер здания", так же как и драйвер пиццы, чтобы принять решение о доставке.</p><p>каждый компьютер (или "хост") в ip-сети настроен с уникальным ip-адресом и маской подсети. этот ip-адрес можно разделить на компонент "номер здания" (например, "123" в приведенном выше примере), называемый "идентификатор хоста" и компонент "название улицы" (например, "главная улица" в приведенном выше примере), называемый "идентификатор сети". нашим человеческим глазом легко увидеть, где находится номер здания и название улицы в "123 main street", но сложнее увидеть это разделение в "10.13.216.41 с маской подсети 255.255.192.0".</p><p>ip-маршрутизаторы "просто знают", как разделить ip-адреса на эти составные части, чтобы принимать решения о маршрутизации. поскольку понимание того, как маршрутизируются ip-пакеты, зависит от понимания этого процесса, нам также необходимо знать, как разбивать ip-адреса. к счастью, извлечь идентификатор хоста и идентификатор сети из ip-адреса и маски подсети на самом деле довольно просто.</p><p>начните с записи ip-адреса в двоичном формате (используйте калькулятор, если вы еще не научились делать это в своей голове, но запишите, как это сделать - это действительно очень просто и впечатляет противоположный пол в стороны):</p><pre><code> 10. 13. 216. 41 00001010.00001101.11011000.00101001 </code></pre><p>также запишите маску подсети в двоичном виде:</p><pre><code> 255. 255. 192. 0 11111111.11111111.11000000.00000000 </code></pre><p>написанные бок о бок, вы можете видеть, что точка в маске подсети, где "1" останавливается, "выстраивается" до точки в ip-адресе. в том-то и дело, что идентификатор сети и идентификатор хоста разделились. итак, в этом случае:</p><pre><code> 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 </code></pre><p>маршрутизаторы используют маску подсети, чтобы "замаскировать" биты, покрытые 1, в ip-адресе (заменяя биты, которые не "замаскированы", на 0), чтобы извлечь идентификатор сети:</p><pre><code> 10. 13. 192. 0 00001010.00001101.11000000.00000000 - network id </code></pre><p>аналогично, используя маску подсети для "маскировки" битов, покрываемых нулями в ip-адресе (заменяя биты, которые не "маскируются", снова на 0), маршрутизатор может извлечь идентификатор хоста:</p><pre><code> 0. 0. 24. 41 00000000.00000000.00011000.00101001 - portion of ip address covered by 0's in subnet mask, remaining bits set to 0 </code></pre><p>нашим человеческим глазом не так легко увидеть "разрыв" между идентификатором сети и идентификатором хоста, как между "номером здания" и "названием улицы" в физических адресах при доставке пиццы, но конечный эффект - это одни и те же.</p><p>теперь, когда вы можете разделить ip-адреса и маски подсетей на идентификаторы хоста и сети, вы можете маршрутизировать ip так же, как это делает маршрутизатор.</p><h2>больше терминологии</h2><p>вы увидите маски подсетей, написанные по всему интернету и в остальной части этого ответа как (ip/номер). эта нотация называется нотацией бесклассовой междоменной маршрутизации (cidr). "255.255.255.0" в начале состоит из 24 битов единиц, и записать его как "/ 24" быстрее, чем как "255.255.255.0". чтобы преобразовать число cidr (например, "/ 16") в десятичную маску подсети с точками, просто запишите это число 1, разделите его на группы по 8 бит и преобразуйте в десятичное число. (например, "/ 16" - это "255.255.0.0".)</p><p>еще в "старые времена" маски подсетей не указывались, а были получены путем просмотра определенных бит ip-адреса. например, ip-адрес, начинающийся с 0–127, имел скрытую маску подсети 255.0.0.0 (называемую ip-адресом "класса a").</p><p>эти подразумеваемые маски подсетей сегодня не используются, и я не рекомендую больше о них узнавать, если только у вас нет неудачи иметь дело с очень старым оборудованием или старыми протоколами (такими как ripv1), которые не поддерживают бесклассовую ip-адресацию. я не буду больше упоминать эти "классы" адресов, потому что сегодня они неприменимы и могут сбивать с толку.</p><p>некоторые устройства используют обозначение, называемое "подстановочные маски". "маска подстановки" - это не более чем маска подсети со всеми 0, где будут 1, и 1, где будут 0. "маска подстановки" в/26:</p><pre><code> 11111111.11111111.11111111.11000000 - /26 subnet mask 00000000.00000000.00000000.00111111 - /26 "wildcard mask" </code></pre><p>обычно вы видите "маски", используемые для соответствия идентификаторам хоста в списках контроля доступа или правилах брандмауэра. мы не будем обсуждать их здесь дальше.</p><h2>как работает роутер</h2><p>как я уже говорил ранее, ip-маршрутизаторы работают аналогично водителю доставки пиццы в том, что им нужно доставить груз (пакеты) к месту назначения. при представлении пакета, привязанного к адресу 192.168.10.2, ip-маршрутизатору необходимо определить, какой из его сетевых интерфейсов лучше всего приблизит этот пакет к месту назначения.</p><p>допустим, вы являетесь ip-маршрутизатором, и у вас есть номера подключенных интерфейсов:</p><ul> <li>ethernet0 - 192.168.20.1, маска подсети/24</li> <li>ethernet1 - 192.168.10.1, маска подсети/24</li> </ul><p>если вы получаете пакет для доставки с адресом назначения "192.168.10.2", довольно легко сказать (вашими человеческими глазами), что пакет должен быть отправлен через интерфейс ethernet1, поскольку адрес интерфейса ethernet1 соответствует месту назначения пакета адрес. все компьютеры, подключенные к интерфейсу ethernet1, будут иметь ip-адреса, начинающиеся с "192.168.10.", поскольку сетевой идентификатор ip-адреса, назначенного вашему интерфейсу ethernet1, - "192.168.10.0".</p><p>для маршрутизатора этот процесс выбора маршрута выполняется путем построения таблицы маршрутизации и обращения к таблице каждый раз при доставке пакета. таблица маршрутизации содержит идентификатор сети и имена интерфейса назначения. вы уже знаете, как получить идентификатор сети по ip-адресу и маске подсети, и вы уже на пути к созданию таблицы маршрутизации. вот наша таблица маршрутизации для этого маршрутизатора:</p><ul> <li>идентификатор сети: 192.168.20.0 (11000000.10101000.00010100.00000000) - 24-битная маска подсети - интерфейс ethernet0</li> <li>идентификатор сети: 192.168.10.0 (11000000.10101000.00001010.00000000) - 24-битная маска подсети - интерфейс ethernet1</li> </ul><p>для нашего входящего пакета, привязанного к "192.168.10.2", нам нужно только преобразовать адрес этого пакета в двоичный (как люди - маршрутизатор получает его как двоичный файл по проводам) и попытаться сопоставить его с каждым адресом в нашей маршрутизации таблица (до количества бит в маске подсети), пока мы не сопоставим запись.</p><ul> <li>пункт назначения входящего пакета: 11000000.10101000.00001010.00000010</li> </ul><p>сравнивая это с записями в нашей таблице маршрутизации:</p><pre><code>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) </code></pre><p>запись для ethernet0 точно соответствует первым 19 битам, но затем останавливается. это означает, что это не правильный интерфейс назначения. вы можете видеть, что интерфейс ethernet1 соответствует 24 битам адреса назначения. ах, ха! пакет связан для интерфейса ethernet1.</p><p>в реальном маршрутизаторе таблица маршрутизации сортируется таким образом, что самые длинные маски подсети проверяются сначала на совпадения (т. е. на наиболее конкретные маршруты) и численно, так что, как только совпадение найдено, пакет может быть маршрутизирован и дальнейшие попытки сопоставления не требуются (это означает, что 192.168.10.0 будет указан первым, а 192.168.20.0 никогда не будет проверен). здесь мы немного упрощаем это. причудливые структуры данных и алгоритмы делают ip-маршрутизаторы быстрее, но простые алгоритмы дают те же результаты.</p><h2>статические маршруты</h2><p>до этого момента мы говорили о нашем гипотетическом маршрутизаторе как о сети, напрямую подключенной к нему. очевидно, это не так, как устроен мир. по аналогии с вождением пиццы, иногда водителю не разрешается заходить в здание дальше, чем на стойке регистрации, и он должен передать пиццу кому-то другому для доставки конечному получателю (приостановить свое неверие и терпеть меня, пока я протягиваю свою аналогию, пожалуйста).</p><p>давайте начнем с вызова нашего маршрутизатора из предыдущих примеров "маршрутизатор a". вы уже знаете таблицу маршрутизации routera как:</p><ul> <li>идентификатор сети: 192.168.20.0 (11000000.10101000.00010100.00000000) - маска подсети/24 - интерфейсный маршрутизатор a-ethernet0</li> <li>идентификатор сети: 192.168.10.0 (11000000.10101000.00001010.00000000) - маска подсети/24 - интерфейсный маршрутизатор a-ethernet1</li> </ul><p>предположим, что есть еще один маршрутизатор, "маршрутизатор b", с ip-адресами 192.168.10.254/24 и 192.168.30.1/24, назначенными его интерфейсам ethernet0 и ethernet1. он имеет следующую таблицу маршрутизации:</p><ul> <li>идентификатор сети: 192.168.10.0 (11000000.10101000.00001010.00000000) - маска подсети/24 - интерфейс routerb-ethernet0</li> <li>идентификатор сети: 192.168.30.0 (11000000.10101000.00011110.00000000) - маска подсети/24 - интерфейс routerb-ethernet1</li> </ul><p>в симпатичном искусстве ascii) сеть выглядит так:</p><pre><code> 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 </code></pre><p>вы можете видеть, что маршрутизатор b знает, как "добраться до" сети, 192.168.30.0/24, о которой маршрутизатор a ничего не знает.</p><p>предположим, что пк с ip-адресом 192.168.20.13, подключенным к сети, подключенной к интерфейсу ethernet0 маршрутизатора a, отправляет пакет маршрутизатору a для доставки. наш гипотетический пакет предназначен для ip-адреса 192.168.30.46, который является устройством, подключенным к сети, подключенной к интерфейсу ethernet1 маршрутизатора b.</p><p>с таблицей маршрутизации, показанной выше, ни одна из записей в таблице маршрутизации маршрутизатора a не соответствует назначению 192.168.30.46, поэтому маршрутизатор a вернет пакет отправляющему пк с сообщением "сеть назначения недоступна".</p><p>чтобы маршрутизатор a "знал" о существовании сети 192.168.30.0/24, мы добавляем следующую запись в таблицу маршрутизации на маршрутизаторе a:</p><ul> <li>идентификатор сети: 192.168.30.0 (11000000.10101000.00011110.00000000) - маска подсети/24 - доступ через 192.168.10.254</li> </ul><p>таким образом, маршрутизатор a имеет запись в таблице маршрутизации, которая соответствует назначению 192.168.30.46 нашего примера пакета. эта запись в таблице маршрутизации фактически гласит: "если вы получите пакет, привязанный к 192.168.30.0/24, отправьте его на 192.168.10.254, потому что он знает, как с ним работать". это аналогичное действие "передай пиццу на стойке регистрации", о котором я упоминал ранее - передача пакета кому-то еще, кто знает, как доставить его ближе к месту назначения.</p><p>добавление записи в таблицу маршрутизации "вручную" называется добавлением "статического маршрута".</p><p>если маршрутизатор b хочет доставить пакеты в сеть с маской подсети 255.255.255.0 192.168.20.0, ему также потребуется запись в его таблице маршрутизации:</p><ul> <li>идентификатор сети: 192.168.20.0 (11000000.10101000.00010100.00000000) - маска подсети/24 - доступен через: 192.168.10.1 (ip-адрес маршрутизатора a в сети 192.168.10.0)</li> </ul><p>это создаст путь для доставки между сетью 192.168.30.0/24 и сетью 192.168.20.0/24 через сеть 192.168.10.0/24 между этими маршрутизаторами.</p><p>вы всегда хотите быть уверены, что маршрутизаторы на обеих сторонах такой "промежуточной сети" имеют запись таблицы маршрутизации для сети "дальнего конца". если в нашем примере маршрутизатор b не имеет записи в таблице маршрутизации для сети "дальнего конца" 192.168.20.0/24, подключенной к маршрутизатору a, то наш гипотетический пакет с пк по адресу 192.168.20.13 <em> будет </em> добраться до устройства назначения в 192.168.30.46, но любой ответ, который 192.168.30.46 попытался отправить обратно, будет возвращен маршрутизатором b как "сеть назначения недоступна". одностороннее общение обычно нежелательно. всегда думайте о трафике, проходящем в <em> обоих </em> направлениях, когда вы думаете о связи в компьютерных сетях.</p><p>вы можете получить много пробега из статических маршрутов. протоколы динамической маршрутизации, такие как eigrp, rip и т.д., на самом деле представляют собой не что иное, как способ для маршрутизаторов обмениваться друг с другом информацией о маршрутизации, которая фактически может быть настроена со статическими маршрутами. однако одно большое преимущество использования протоколов динамической маршрутизации над статическими маршрутами состоит в том, что протоколы динамической маршрутизации могут <em> динамически </em> изменять таблицу маршрутизации в зависимости от условий сети (использование полосы пропускания). интерфейс "отключается" и т. д.) и, следовательно, использование протокола динамической маршрутизации может привести к конфигурации, которая "обходит" сбои или узкие места в сетевой инфраструктуре. (протоколы динамической маршрутизации <em> [~ # ~] выходят [~ # ~] </em> за пределы этого ответа.)</p><h2>вы не можете добраться туда отсюда</h2><p>в случае нашего примера маршрутизатора a, что происходит, когда приходит пакет, связанный с "172.16.31.92"?</p><p>глядя на таблицу маршрутизации a, ни интерфейс назначения, ни статический маршрут не соответствуют первым 24 битам 172.18.31.92 (т. е. 10101100.00010000.00011111.01011100, btw).</p><p>как мы уже знаем, маршрутизатор a будет возвращать пакет отправителю с помощью сообщения "сеть недоступна".</p><p>скажите, что есть другой маршрутизатор (маршрутизатор c), сидящий по адресу "192.168.20.254". маршрутизатор c имеет подключение к интернету!</p><pre><code> 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 </code></pre><p>было бы хорошо, если бы маршрутизатор a мог маршрутизировать пакеты, которые не соответствуют ни одному локальному интерфейсу, до маршрутизатора c, чтобы маршрутизатор c мог отправлять их в интернет. введите маршрут "шлюз по умолчанию".</p><p>добавьте запись в конце нашей таблицы маршрутизации следующим образом:</p><ul> <li>идентификатор сети: 0.0.0.0 (00000000.00000000.00000000.00000000) - маска подсети/0 - маршрутизатор назначения: 192.168.20.254</li> </ul><p>когда мы пытаемся сопоставить "172.16.31.92" с каждой записью в таблице маршрутизации, мы заканчиваем тем, что нажимаем эту новую запись. сначала это немного сбивает с толку. мы ищем, чтобы сопоставить ноль бит адреса назначения с ... подождать ... что? соответствие нулевым битам? итак, мы вообще не ищем совпадений. эта запись в таблице маршрутизации в основном говорит: "если вы доберетесь сюда, вместо того чтобы отказаться от доставки, отправьте пакет на маршрутизатор в 192.168.20.254 и дайте ему справиться с этим".</p><p>192.168.20.254 - это пункт назначения, который мы <em> [~ # ~] делаем [~ # ~] </em> знаем, как доставить пакет. когда мы сталкиваемся с пакетом, привязанным к пункту назначения, для которого у нас нет конкретной записи в таблице маршрутизации, эта запись "шлюз по умолчанию" всегда будет совпадать (поскольку она соответствует нулевым битам адреса назначения) и дает нам место "последнего средства", которое мы можем отправлять пакеты для доставки. иногда вы будете слышать шлюз по умолчанию, который называется "шлюз последней инстанции".</p><p>чтобы маршрут шлюза по умолчанию был эффективным, он должен ссылаться на маршрутизатор, который доступен с использованием других записей в таблице маршрутизации. например, если вы попытались указать шлюз по умолчанию 192.168.50.254 в маршрутизаторе a, доставка к такому шлюзу по умолчанию не удалась бы. 192.168.50.254 не является адресом, который маршрутизатор а знает, как доставлять пакеты, используя любой из других маршрутов в своей таблице маршрутизации, поэтому такой адрес был бы неэффективен в качестве шлюза по умолчанию. это можно сформулировать кратко: шлюз по умолчанию должен быть настроен на адрес, который уже доступен при использовании другого маршрута в таблице маршрутизации.</p><p>реальные маршрутизаторы обычно хранят шлюз по умолчанию как последний маршрут в своей таблице маршрутизации, так что он сопоставляет пакеты после того, как им не удалось сопоставить все остальные записи в таблице.</p><h2>городское планирование и ip-маршрутизация</h2><p>разделение ip-подсети на более мелкие ip-подсети - это городское планирование. в городском планировании зонирование используется для адаптации к природным особенностям ландшафта (реки, озера и т.д.), для влияния на транспортные потоки между различными частями города и для разделения различных видов землепользования (промышленное, жилое и т.д.) , ip-подсеть действительно одинакова.</p><p>есть три основные причины, по которым вы бы подключили сеть:</p><ul> <li> <p>вы можете хотеть общаться через различные в отличие от средств коммуникации. если у вас есть соединение t1 wan между двумя зданиями, на концах этих соединений могут быть размещены ip-маршрутизаторы, чтобы облегчить связь через t1. сети на каждом конце (и, возможно, "промежуточная" сеть). на самом t1) будет назначаться уникальным ip-подсетям, чтобы маршрутизаторы могли принимать решения о том, какой трафик должен передаваться по линии t1.</p> </li> <li> <p>в сети ethernet вы можете использовать подсети, чтобы ограничить объем широковещательного трафика в данной части сети. протоколы прикладного уровня используют широковещательную способность ethernet для очень полезных целей. однако по мере того, как все больше и больше хостов упаковываются в одну и ту же сеть ethernet, процент широковещательного трафика по проводам (или по беспроводной сети, в беспроводной сети ethernet) может возрасти до такой степени, что создаст проблемы для доставки не вещательного трафика. (в прежние времена широковещательный трафик мог перегружать цп хостов, заставляя их проверять каждый широковещательный пакет. сегодня это менее вероятно.) чрезмерный трафик в коммутируемом ethernet также может проявляться в виде "переполнения кадров в неизвестные места назначения". это условие вызвано тем, что коммутатор ethernet не может отслеживать каждый пункт назначения в сети, и является причиной, по которой коммутируемые сети ethernet не могут масштабироваться до бесконечного числа хостов. эффект переполнения кадров в неизвестные места назначения аналогичен эффекту избыточного широковещательного трафика для целей подсетей.</p> </li> <li> <p>возможно, вы захотите "контролировать" типы трафика, проходящего между различными группами хостов. возможно, у вас есть устройства сервера печати, и вы хотите, чтобы только авторизованные серверы сервера очереди печати отправляли им задания. ограничивая трафик, разрешенный для потоковой передачи на подсеть устройства сервера печати, пользователи не могут настроить свои пк на прямой обмен данными с устройствами сервера печати для обхода учета печати. вы можете поместить устройства сервера печати в подсеть самостоятельно и создать правило в маршрутизаторе или брандмауэре, подключенном к этой подсети, для управления списком хостов, которым разрешено отправлять трафик на устройства сервера печати. (как маршрутизаторы, так и брандмауэры обычно могут принимать решения о том, как или следует ли доставлять пакет, на основе адресов источника и назначения пакета. брандмауэры, как правило, являются подвидом маршрутизатора с одержимой индивидуальностью. они могут быть очень, очень обеспокоены полезная нагрузка пакетов, тогда как маршрутизаторы обычно игнорируют полезную нагрузку и просто доставляют пакеты.)</p> </li> </ul><p>планируя город, вы можете планировать, как улицы пересекаются друг с другом, и использовать улицы с односторонним движением и тупиковые улицы для влияния на транспортные потоки. вы могли бы хотеть, чтобы главная улица была 30 блоков длиной, с каждым блоком, имеющим до 99 зданий каждый. довольно просто спланировать нумерацию улиц таким образом, чтобы в каждом квартале на мэйн-стрит диапазон номеров улиц увеличивался на 100 для каждого блока. очень легко узнать, каким должен быть "начальный номер" в каждом последующем блоке.</p><p>при планировании ip-подсетей вам необходимо создать правильное количество подсетей (улиц) с правильным количеством доступных идентификаторов хоста (номера зданий) и использовать маршрутизаторы для соединения подсетей друг с другом (пересечения). правила о разрешенных адресах источника и назначения, указанных в маршрутизаторах, могут дополнительно контролировать поток трафика. межсетевые экраны могут действовать как навязчивые гаишники.</p><p>для целей этого ответа построение наших подсетей - наша единственная главная задача. вместо того чтобы работать в десятичном формате, как в случае с городским планированием, вы работаете в двоичном формате, чтобы описать границы каждой подсети.</p><p>продолжение: <a href="https://serverfault.com/questions/49765/how-does-subnetting-work/226445#226445">как работает подсеть ipv4?</a> </p><p>(да ... мы достигли максимального размера ответа (30000 символов).)</p>

<p>продолжение с: <a href="https://serverfault.com/questions/49765/how-does-subnetting-work/49836#49836">как работает подсеть ipv4?</a> </p><p>ваш интернет-провайдер предоставляет диапазон id сети 192.168.40.0/24 (11000000.10101000.00101000.00000000). вы знаете, что хотели бы использовать устройство брандмауэра/маршрутизатора для ограничения связи между различными частями вашей сети (серверами, клиентскими компьютерами, сетевым оборудованием) и, как таковые, вы хотели бы разбить эти различные части вашей сети в ip-подсети (которые затем может маршрутизировать межсетевой экран/маршрутизатор).</p><p>у тебя есть:</p><ul> <li>12 серверных компьютеров, но вы можете получить до 50% больше</li> <li>9 переключателей</li> <li>97 клиентских компьютеров, но вы можете получить больше</li> </ul><p>какой хороший способ разбить 192.168.40.0/24 на эти части?</p><p>думая о четных степенях двух и работая с большим количеством возможных устройств, вы можете придумать:</p><ul> <li>18 серверных компьютеров - следующая по величине мощность двух - 32</li> <li>9 переключателей - следующая по величине мощность двух - 16</li> <li>97 клиентских компьютеров - следующая по величине мощность двух - 128</li> </ul><p>в данной 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.</p><p>похоже, что из этих 254 хостов мы можем разместить клиентские компьютеры, коммутаторы и серверные компьютеры в этом пространстве, верно? давай попробуем.</p><p>у вас есть 8 бит маски подсети для "игры" (остальные 8 бит ip-адреса 192.168.40.0/24 не покрываются маской подсети, предоставленной вашим провайдером). нам нужно найти способ использовать эти 8 битов для создания ряда уникальных идентификаторов сети, которые могут вместить устройства, указанные выше.</p><p>начните с самой большой сети - клиентских компьютеров. вы знаете, что следующая большая степень двух из числа возможных устройств - 128. число 128 в двоичном виде - "10000000". к счастью для нас, это вписывается в свободный 8-битный слот (если этого не произойдет, это будет признаком того, что наша начальная подсеть слишком мала для размещения всех наших устройств).</p><p>давайте возьмем наш сетевой идентификатор, предоставленный нашим провайдером, и добавим к нему один бит маски подсети, разбив его на две сети:</p><pre><code>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) </code></pre><p>посмотрите на это, пока это не имеет смысла. мы увеличили маску подсети на один бит в длину, в результате чего идентификатор сети покрывал один бит, который использовался бы для идентификатора хоста. поскольку этот один бит может быть либо нулем, либо единицей, мы фактически разделили нашу сеть 192.168.40.0 на две сети. первый действительный ip-адрес в сети 192.168.40.0/25 будет первым идентификатором хоста с "1" в крайнем правом бите:</p><pre><code>11000000.10101000.00101000.00000001 - 192.168.40.1 - first valid host in the 192.168.40.0/25 network </code></pre><p>первый действительный узел в сети 192.168.40.128 также будет первым идентификатором узла с "1" в крайнем правом бите:</p><pre><code>11000000.10101000.00101000.10000001 - 192.168.40.129 - first valid host in the 192.168.40.128/25 network </code></pre><p>последним действительным хостом в каждой сети будет идентификатор хоста с каждым битом <em>, кроме </em> самого правого бита, установленного в "1":</p><pre><code>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 </code></pre><p>таким образом, мы создали сеть, достаточно большую для размещения наших клиентских компьютеров, и вторую сеть, в которой мы можем применить тот же принцип, чтобы разбить ее на еще более мелкие сети. давайте сделаем заметку:</p><ul> <li>клиентские компьютеры - 192.168.40.0/25 - действительные ip-адреса: 192.168.40.1 - 192.168.40.126</li> </ul><p>теперь, чтобы сломать вторую сеть для наших серверов и коммутаторов, мы делаем то же самое.</p><p>у нас 12 серверных компьютеров, но мы можем купить еще 6. давайте планируем 18, что оставляет нам следующую наивысшую степень 2 как 32. в двоичном виде 32 - это "100000", что составляет 6 бит. в 192.168.40.128/25 у нас осталось 7 битов маски подсети, поэтому у нас достаточно битов, чтобы продолжить "игру". добавление еще одного бита маски подсети дает нам еще две сети:</p><pre><code>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 </code></pre><p>итак, теперь мы разбили 192.168.40.128/25 еще на две сети, каждая из которых имеет 26 бит маски подсети или в общей сложности 62 возможных идентификатора хоста - 2 ^ (32 - 26) - 2.</p><p>это означает, что в обеих этих сетях достаточно адресов для наших серверов и коммутаторов! давайте сделаем заметки:</p><ul> <li>серверы - 192.168.40.128/26 - действительные ip-адреса: 192.168.40.129 - 192.168.40.190</li> <li>коммутаторы - 192.168.40.192/26 - действительные ip-адреса: 192.168.40.193 - 192.168.40.254</li> </ul><p>этот метод называется маскированием подсети переменной длины (vlsm) и при правильном применении приводит к тому, что у "основных маршрутизаторов" появляются меньшие таблицы маршрутизации (посредством процесса, называемого "суммирование маршрута"). в случае нашего провайдера в этом примере они могут не знать, как мы подсетили 192.168.40.0/24. если их маршрутизатор имеет пакет, привязанный к 192.168.40.206 (один из наших коммутаторов), им нужно только знать, чтобы передать его нашему маршрутизатору (поскольку 192.168.40.206 соответствует идентификатору сети и маске подсети 192.168.40.0/24 в таблице маршрутизации их маршрутизатора ) и наш роутер доставит его к месту назначения. это удерживает маршруты нашей подсети от их таблиц маршрутизации. (я упрощаю здесь, но вы поняли.)</p><p>таким же образом вы можете планировать очень географически большие сети. пока вы делаете правильное "городское планирование" заранее (предвосхищая количество хостов в каждой подсети с некоторой точностью и взглядом в будущее), вы можете создать большую иерархию маршрутизации, которая на основных маршрутизаторах обобщает " "на очень небольшое количество маршрутов. как мы видели выше, чем больше маршрутов в таблице маршрутизации маршрутизатора, тем медленнее он выполняет свою работу. проектирование ip-сети с использованием vlsm и сохранение небольших таблиц маршрутизации - это хорошая идея (tm).</p><h2>нереализм примеров</h2><p>вымышленный мир в этом ответе, очевидно, вымышлен. как правило, вы можете создавать подсети в современном коммутируемом ethernet с большим количеством хостов, чем 254 (зависит от профиля трафика). как было отмечено в комментариях, использование/24 сетей между маршрутизаторами не согласуется с real life (tm). это делает для симпатичных примеров, но это пустая трата адресного пространства. как правило,/30 или/31 (см. <a href="http://www.faqs.org/rfcs/rfc3021.html">http://www.faqs.org/rfcs/rfc3021.html</a> для получения подробной информации о том, как работает/31 - они выходят за рамки этого ответа наверняка) сеть используется на линиях связи, которые являются строго двухточечными между двумя маршрутизаторами.</p>

<h1>sub-сетчатые</h1><p>сетка нетрудно, но может пугать. итак, начнем с самого простого шага. учимся считать в двоичном виде.</p><p><strong>binary</strong></p><p>двоичный код - это система счисления с основанием 2. состоит только из двух чисел (1 и 0). подсчет продолжается таким образом.</p><pre><code>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) </code></pre><p>так что, если вы просто представляете, что каждый 1 является заполнителем для значения (все двоичные значения являются степенями двух)</p><pre><code>1 1 1 1 1 = 31 16 + 8 + 4 + 2 + 1 = 31 </code></pre><p>итак ... 100000 = 32. и 10000000 = 128. и 11111111 = 255.</p><p>когда я говорю: "у меня есть маска подсети 255.255.255.0", я действительно имею в виду: "у меня есть маска подсети 11111111.11111111.11111111.00000000". мы используем подсети как короткую руку.</p><p>точки в адресе разделяются каждые 8 двоичных цифр (октет). вот почему ipv4 известен как 32-битное (8 * 4) адресное пространство.</p><p><strong>почему подсеть?</strong></p><p>адреса ipv4 (192.168.1.1) в дефиците. подсеть дает нам возможность увеличить количество доступных сетей (или хостов). это по административным и техническим причинам.</p><p>каждый ip-адрес разбит на две отдельные части: сеть и хост. по умолчанию адрес класса c (192.168.1.1) использует первые 3 октета (192.168.1) для сетевой части адреса. и 4-й октет (.1) в качестве части хоста.</p><p>по умолчанию ip-адрес и маска подсети для адреса класса c выглядит следующим образом</p><pre><code>ip 192.168.1.1 subnet 255.255.255.0 </code></pre><p>в двоичном виде, как это</p><pre><code>ip 11000000.10101000.00000001.00000001 subnet 11111111.11111111.11111111.00000000 </code></pre><p>посмотрите на бинарный пример еще раз. обратите внимание, как я сказал, что первые три октета используются для сети? заметьте, как сетевая часть - все единицы? это все подсеть есть. давайте расширяться.</p><p>учитывая, что у меня есть один октет для моей части host (в приведенном выше примере). я могу иметь только 256 узлов (256 - максимальное значение октета, считая от 0). но есть еще одна небольшая хитрость: вам нужно вычесть 2 адреса хоста из доступных (в настоящее время 256). первый адрес в диапазоне будет для сети (192.168.1.0), а последний адрес в диапазоне будет широковещательным (192.168.1.255). таким образом, у вас действительно есть 254 доступных адреса для хостов в одной сети.</p><p><strong>пример из практики</strong></p><p>допустим, я дал вам следующий лист бумаги.</p><pre><code>create 4 networks with 192.168.1.0/24. </code></pre><p>давайте посмотрим на это./24 называется нотацией cidr. вместо ссылки на 255.255.255.0 мы просто ссылаемся на биты, которые нам нужны для сети. в этом случае нам нужно 24 бита (3 * 8) от 32-битного адреса. записать это в двоичном</p><pre><code>11111111.11111111.11111111.00000000 = 255.255.255.0 8bits + 8bits + 8bits + 0bits = 24bits </code></pre><p>далее мы знаем, что нам нужно выяснить, сколько подсетей нам нужно. выглядит как 4. поскольку нам нужно создать больше сетей (в настоящее время у нас есть только одна), давайте перевернем несколько битов</p><pre><code>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 </code></pre><p>теперь, когда мы определились с/26, давайте начнем выделять хосты. немного простой математики:</p><pre><code>32(bits) - 26(bits) = 6(bits) for host addresses. </code></pre><p>у нас есть 6 бит для размещения в каждой сети для хостов. помня, что нам нужно вычесть 2 для каждой сети.</p><pre><code>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 </code></pre><p>теперь нам нужно выяснить, куда ходят хозяева. вернуться в двоичный файл!</p><pre><code>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 ... </code></pre><p>таким образом, вы можете рассчитать всю подсеть.</p><p><strong>подстановочные знаки</strong> подстановочная маска - это инвертированная маска подсети.</p><pre><code>11111111.11111111.11111111.11000000 = 255.255.255.192 [subnet] 00000000.00000000.00000000.00111111 = 0.0.0.63 [wild card] </code></pre><p><strong>далее</strong></p><p>google для терминов "суперсеть" и "vlsm (маска подсети переменной длины)" для более сложных тем.</p><p>теперь я вижу, что я слишком долго отвечал ... <strong>вздох</strong></p>

<p>краткий урок истории: изначально одноадресные ipv4-адреса были разделены на 3 класса, каждый из которых имел соответствующую длину маски "по умолчанию" (называемую классной маской подсети).</p><ul> <li>класс a: все в диапазоне 1.0.0.0 -> 127.255.255.255. классная маска подсети 255.0.0.0 (/ 8 в нотации cidr)</li> <li>класс b: все в диапазоне 128.0.0.0 -> 191.255.255.255. классная маска подсети 255.255.0.0 (/ 16 в нотации cidr)</li> <li>класс c: все в диапазоне 192.0.0.0 -> 223.255.255.255. классная маска подсети 255.255.255.0 (/ 24 в нотации cidr)</li> </ul><p>идея заключалась в том, что организациям разных размеров можно было бы назначать разные классы ip-адресов, чтобы эффективно использовать пространство ip-адресов.</p><p>однако по мере роста ip-сетей стало ясно, что у этого подхода есть свои проблемы. чтобы назвать только три:</p><p>в классовом мире все подсети <strong> имели </strong> маску/8,/16 или/24. это означало, что наименьшей подсетью, которую можно было настроить, была/24, в которой было разрешено 254 адреса хоста (.0 и .255 зарезервированы в качестве сетевых и широковещательных адресов соответственно). это было чрезвычайно расточительно, особенно в двухточечных каналах, к которым подключены только два маршрутизатора.</p><p>даже после того, как это ограничение было ослаблено, более ранние протоколы маршрутизации (например, <a href="http://en.wikipedia.org/wiki/routing\_information\_protocol#rip\_version\_1">ripv1</a> ) не объявляли длину маски, связанную с префиксом ip. в отсутствие определенной маски она будет использовать либо маску напрямую подключенного интерфейса в той же классовой сети, либо использовать классную маску. например, если вы хотите использовать сеть 172.16.0.0 для соединений между маршрутизаторами с масками/30, <strong> все </strong> подсети с 172.16.0.0 - 172.16. 255.255 должен был бы иметь маску/30 (16384 подсети, каждая из которых имеет 2 используемых ip-адреса).</p><p>таблицы маршрутизации интернет-маршрутизаторов начали занимать все больше памяти; это было/известно как "взрыв таблицы маршрутизации". например, если у провайдера было 16 смежных/24 сетей, ему нужно было бы объявить все 16 префиксов, а не одно резюме, охватывающее весь диапазон.</p><p>два <a href="http://en.wikipedia.org/wiki/cidr">связанные уточнения</a> позволили нам выйти за пределы вышеуказанных ограничений.</p><ol> <li>маски подсети переменной длины (vlsm)</li> <li>cidr (бесклассовая междоменная маршрутизация)</li> </ol><p>vlsm относится к способности протокола маршрутизации поддерживать разные маски подсети в одной и той же классовой сети. например:</p><pre><code>192.168.1.0/24 </code></pre><p>может быть разделен на:</p><pre><code>192.168.1.0/25 192.168.1.128/26 192.168.1.192/27 192.168.1.224/27 </code></pre><p>что позволило гораздо более эффективно использовать адресное пространство; подсети могут иметь правильный размер для количества хостов/маршрутизаторов, которые будут подключены к ним.</p><p>cidr принимает vlsm и расширяет его другим способом; помимо разделения одной классной сети на более мелкие подсети, cidr позволяет объединять несколько классных сетей в одну сводку. например, следующие сети класса b (/ 16):</p><pre><code>172.16.0.0/16 172.17.0.0/16 172.18.0.0/16 172.19.0.0/16 </code></pre><p>может быть объединено/суммировано с одним префиксом:</p><pre><code>172.16.0.0/14 </code></pre><p>с точки зрения подсетей: маска подсети имеет длину 32 бита. длина маски обозначает, сколько битов идентифицирует сетевую часть адреса. например:</p><pre><code>10.1.1.0/24 </code></pre><ul> <li>классовая маска подсети/8</li> <li>фактическая маска подсети/24</li> <li>16 бит (24-8) были заимствованы для использования в подсетях.</li> </ul><p>это означает, что при условии, что вся сеть 10.0.0.0/8 находится в подсетях/24 с, в этом диапазоне будет 65536 (2 ^ 16) подсетей. (это предполагает, что используемая платформа поддерживает номера подсетей от 0 до 255. см. ip subnet-zero cisco).</p><p>в "части хоста" адреса осталось 8 бит. это означает, что имеется 256 доступных ip-адресов (2 ^ 8), из которых 2 зарезервированы (10.1.1.0 - сетевой адрес, 10.1.1.255 - адрес широковещательной рассылки, направленной на подсеть). это оставляет 254 используемых ip-адреса в этой подсети. ((2 ^ 8) - 2)</p>

<p>диапазоны сети: на сеть всегда ссылаются 2 числа: одно для определения сети, а другое для определения того, какой компьютер (или хост) находится в этой сети. поскольку каждый адрес нервной системы имеет длину 32 бита, оба числа должны вписываться в эти 32 бита.</p><p>нумерация сети важна, так как именно ее раздает icann, когда вы запрашиваете диапазон ip-адресов сети. если бы у нас его не было, никто бы не смог определить разницу между моей сетью и at & ts. поэтому, хотя эти номера должны быть уникальными, никто больше не хочет назначать номера хостам, которые находятся в моей сети. отсюда и разделение: первая часть управляется сетевыми людьми, а вторая часть целиком и полностью отдана моим машинам.</p><p>номер сети не фиксирован с определенным количеством битов - например, если бы у меня было только 200 машин для управления собой, я был бы совершенно счастлив с номером сети, который использовал 24 бита, оставляя мне только 8 битов для себя - этого достаточно для 255 хостов. поскольку номер сети использует 24 бита, их может быть много, а значит, у многих людей могут быть свои собственные сети.</p><p>в прошлом это упоминалось как сеть класса c. (класс b использовал 16 битов для номера сети, а класс a использовал 8 битов, поэтому существует только несколько сетей класса a).</p><p>в настоящее время это соглашение об именах вышло из моды. это было заменено понятием, названным cidr. cidr явно ставит количество бит для ваших хостов после косой черты. так что мой пример выше (класс c) теперь называется cidr/24.</p><p>это дает нам немного больше гибкости, прежде чем, если бы у меня было 300 хостов для управления, мне понадобилась бы сеть класса b! теперь я могу получить/23 cidr, поэтому у меня есть 9 бит для меня и 23 бита для номера сети. icann может не иметь таких сетей, но если у меня есть внутренняя сеть или я арендую частичную сеть у интернет-провайдера, это облегчает управление, особенно потому, что всем их клиентам можно дать/29 (оставив меня. 3 бита или максимум 8 машин), что позволяет большему количеству людей иметь собственный небольшой кусочек доступных ip-адресов. пока мы не получим ipv6, это очень важно.</p><hr><p>однако ... хотя я знаю, что/24 cidr является эквивалентом старой сети класса c, а/16 - это класс b, а/8 - это класс a ... я все еще в тупике, пытаясь вычислить/22 в моя голова. к счастью, есть инструменты, которые делают это для меня :)</p><p>однако - если вы знаете, что/24 - это 8 бит для хостов (и 24 бита для сети), то я знаю, что/23 дает мне дополнительный бит, который удваивает количество хостов.</p>

<p>по пути я задам и отвечу на несколько связанных вопросов:</p><ul> <li>почему вы видите <code>255.255.255.0</code> так часто?</li> <li>почему <code>192.168.0.1</code>?</li> <li>почему <code>127.0.0.1</code>?</li> </ul><p>почему такие странные цифры - 255, 192, 168, 127?</p><hr><h2>8 + 8 + 8 + 8-разрядный десятичный пунктир</h2><p>интернет-адреса, такие как <a href="https://www.theguardian.com/news/datablog/2014/jul/18/wikipedia-pages-edited-most-from-inside-houses-parliament">194.60.38.1</a> использовать <strong> десятично-десятичную запись </strong>, чтобы разбить 32 бита на 8 + 8 + 8 + 8 бит , точечно-десятичный означает преобразование<sup>†</sup> каждое число в двоичном виде затем заполняет его слева <code>0</code>"s.</p><p>например <code>.60.</code> → 60 = 32 + 16 + 8 + 4 → <code>111100</code> → <code>.00111100.</code>.</p><p>таким образом, 194.60.38.10 является десятичным с точками для 4 × 8 = 32-битного адреса <code>11000010.00111100.00100110.00001010</code>, так как 38 → <code>100110</code>, 10 → <code>1010</code>, и так далее. 194 требует все 8 бит; остальные дополнены.</p><p><img src="https://i.pinimg.com/474x/96/46/1a/96461a3bfc3e5288223bd671940f4536--s-makeup-s-style.jpg" alt="padded"></p><p>когда вы подумаете о 255, 192 и 127 в 8-битном двоичном коде, вы сможете легче понять, почему некоторые десятичные числа так распространены:</p><ul> <li>255 = <code>11111111</code></li> <li>192 = <code>11000000</code></li> <li>127 = <code>\_1111111</code></li> <li>128 = <code>10000000</code></li> </ul><p>эти десятичные числа представляют визуально удобные 8-битные блоки, такие как ,   и  . таким образом, вы никогда не видели 256 = 2⁹ из-за 8-битного предела, а 127 = 128−1 = 2⁸ − 1 - это переворот степени два, а степени два равны <code>10………00000</code> 'в двоичном.</p><ul> <li>168 = <code>10101000</code></li> </ul><hr><h2>маски подсетей: что мое, то мое + что твое, то твое</h2><p><strong> маски подсети </strong> затем разбивают каждый 32-битный интернет-адрес на идентификатор сети и идентификатор хоста. в то время как интернет-адреса могут иметь любое сочетание 1 и 0, маски подсетей начинаются только с 1 и заканчиваются только 0.</p><pre><code>||| ip ||| subnet </code></pre><p>выделение первых 8 + 8 + 8 = 24 битов и отбеливание последних 8 битов - это способ разделения ip-адреса.     |    |       |      на две части:</p><pre><code>|| network  host </code></pre><p>если владелец подсети (скажем, <a href="https://www.theonion.com/just-six-corporations-remain-1819564741">omnicorp</a> ) хочет больше внутренних ip-адресов, он может скупить больше (скажем, 8 + 8 = 16 бит) правой части сети, например:</p><pre><code>||| ip ||| subnet   network   host </code></pre><p>очевидно, что в 32-битном = 2³² = 4 294 967 296 опциональном адресном пространстве есть компромисс: если вы покупаете больше идентификаторов сети (слева), ваша внутренняя сеть имеет больше идентификаторов хостов (справа) для назначения.</p><p>поэтому дешевые люди имеют маску подсети</p><p>255.255.255.0 =  |  |  | .</p><p>даже дешевле люди</p><p>255.255.255.128 =  |  |  |  </p><p>или 255.255.255.192 =  |  |  |  .</p><p>согласно фольклору, на самом деле это был не роджер миллер, а непритязательный сисадмин с маской 255.255.255.254, который первоначально написал <em> король дороги</em>, заменив "у меня нет большой подсети" для "у меня нет сигарет".</p><p><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/chicago\_hobo.jpg/800px-chicago\_hobo.jpg" alt="i smoke my cigarettes down to the butt"></p><p>(почему маски с таким низким числом заполнены? потому что, как и рассказчик миллера, маски подсетей подсчитывают все, что у вас <em> нет</em>.)</p><hr><h2>что означает косая черта после ip? (например, 194.60.38.10/24)</h2><p>поскольку маски подсетей (которые разделяют "их" от "наших") всегда начинаются с <code>1</code> 's, и так как мы ненавидим суммировать полномочия двух даже больше, чем мы ненавидим сначала вычислять полномочия двух, кто-то изобрел cidr (косая черта после ip).</p><p>194.60.38.10/24 означает "в подмаске 24 единицы, а остальные - нули", поэтому</p><p> |  |  |  с 8 + 8 + 8 битами, принадлежащими "им" и 8 битами принадлежность к "нам".</p><p>поменяв гимн бродяги наверху,</p><ul> <li><code>/31</code> это автор песен</li> <li><code>/24</code> относится к среднему классу (<code>255.255.255.0</code> =  |  |  | </li> <li><code>/16</code> богато  |  |  | </li> <li><code>/8</code> очень богатый  |  |  | </li> <li><code>/1</code> или <code>/0</code> будет iana или что-то в этом роде.</li> </ul><p><br> <br> <br></p><hr><p>† используйте <code>bc -l; obase=10; 60</code> например.</p>

<p>хотя вышеприведенное верно (извините, tl; dr), расчет подсетей по-прежнему вызывает у многих сетевых администраторов много горя. на самом деле существует очень простой способ подсчета подсетей, вы можете сделать большую часть этого в своей голове, и вам нужно запомнить очень мало. для большинства приложений даже не нужно понимать двоичное представление, хотя это полезно для полного понимания подсетей. здесь я буду обсуждать только ipv4; ipv6 выходит за рамки этого обсуждения.</p><h2>запомните это:</h2><p>следует помнить три ключевых момента: все подсети основаны на степенях двух, и есть два ключевых числа: 256 и 32. подробнее об этом позже.</p><p>во-первых, давайте посмотрим на таблицу, содержащую полномочия 2:</p><pre><code>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 </code></pre><p>вычислить степени 2 легко: каждое целое увеличение степени удваивает результат. 1 + 1 = 2, 2 + 2 = 4, 4 + 4 = 8, 8 + 8 = 16 и т.д. <em> общее количество адресов в подсети всегда должно быть степенью 2 </em>.</p><p>поскольку каждый октет подсети ipv4 достигает 256, <strong><em> 256 </em></strong> <em> очень важный номер </em> и составляет основу для остальной математики.</p><h2>определение размера подсети</h2><p>начнем с простого вопроса: <em> "сколько адресов в подсети, если маска 255.255.255.248?"</em> мы проигнорируем первые три октета а пока посмотрим на последнее. вот как это просто: вычтите 248 из 256. 256 минус 248 равно 8. доступно 8 адресов (включая адрес сети и широковещательный адрес). обратное также работает: "если я хочу иметь подсеть с 16 адресами, какой будет маска подсети?" 256 минус 16 равно 240. маска подсети будет 255.255.255.248.</p><p>теперь, если мы хотим расширить за пределы 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.)</p><h2>сетевой адрес</h2><p>теперь, когда мы знаем, как рассчитать маску подсети, как мы выясним, что такое сетевой адрес? это легко: это всегда кратно количеству адресов в нашей подсети. поэтому, если в нашей подсети 16 адресов, возможные сетевые адреса будут 0, 16, 32, 48, 64 и т.д. до 240. (обратите внимание, что 0 является допустимым кратным любому числу, так как любое число умножается на 0 равно 0.)</p><p>и, конечно же, широковещательный адрес будет последним адресом в области. поэтому, если в нашей подсети 16 адресов, и мы выбрали сетевой адрес 10.3.54.64, широковещательный адрес будет (64 + 16-1 = 79) 10.3.54.79.</p><h2>нотация cidr</h2><p>так как насчет нотации cidr? как перевести это в и из маски подсети в стиле ipv4?</p><p>помните наши силы двоих? что ж, теперь у нас есть еще один ключевой номер, который нужно запомнить, кроме 256: 32. помните, что нотация cidr описывает количество значащих бит в адресе ipv4, и в адресе ipv4 есть 32 бита, по 8 на каждый октет. таким образом, если у нас есть маска подсети 255.255.255.240, то это 16 адресов. если мы посмотрим на нашу таблицу "степеней 2" выше, то увидим, что 16 - это степень от четвертого до четвертого (2 ^ 4). таким образом, мы вычитаем это число - 4 - из 32 и получаем 28. наша запись cidr для маски подсети 255.255.255.240, наша запись cidr -/28.</p><p>и если нам дается cidr/28, мы вычитаем, что (28) из 32, чтобы получить 4; увеличьте 2 до этой (4-й) степени (2 ^ 4), чтобы получить 16; затем вычтите это (16) из 256, чтобы получить 240; или 255.255.255.240.</p>

<p>я также чувствую, что следует хотя бы упомянуть о nat, потому что они так часто используются в современных сетях вместо подсетей, среди прочего, из-за исчерпания ipv4-адресов. (кроме того, когда я впервые узнал о подсетях, я был очень озадачен тем, как подсети связаны с сетями, созданными маршрутизаторами wifi).</p><p>nat (преобразование сетевых адресов) - это метод (обычно), используемый для создания частных сетей путем сопоставления одного адресного пространства (ip: порт) с другим. в основном это используется для создания частной сети с несколькими частными ip-адресами за одним общедоступным адресом, например, в маршрутизаторах wi-fi, организациями (например, университетом или корпорацией) или иногда интернет-провайдерами.</p><p>фактическая трансляция адресов выполняется <strong> прозрачно </strong> в nat способных узлах, обычно маршрутизаторах. это может быть разных форм, full конус, адрес ограничен, порт ограничен и т.д. или их комбинация, которая определяет, как могут быть инициированы соединения через узел.</p><p>полную информацию можно найти на <a href="https://en.wikipedia.org/wiki/network\_address\_translation">wikipedia</a> , но, например, рассмотрим маршрутизатор wifi с 2 подключенными к нему устройствами. общедоступный ip-адрес маршрутизатора: <code>10.9.20.21/24</code>, а ip-адреса устройств (частные ip-адреса): <code>a: 192.168.0.2</code>, <code>b: 192.168.0.3</code> а у роутера это <code>r: 192.168.0.1</code>. таким образом, если <code>a</code> хочет подключиться к серверу <code>s: 10.9.24.5/24</code>, (который на самом деле находится в другой подсети с маршрутизатором здесь):</p><ol> <li>a отправляет ip-пакет на <code>r</code> (который будет шлюзом по умолчанию) с исходным ip-адресом <code>192.168.0.2</code>, src port (скажем) <code>14567</code> и ip-адрес назначения: <code>10.9.24.5</code> (хотя порт на самом деле является частью tcp заголовок).</li> <li>маршрутизатор (который поддерживает nat)) сопоставляет порт <code>14567</code> на устройство <code>a</code> и изменяет источник ip-пакета на <code>10.9.20.21</code> (который является публичным ip-адресом маршрутизатора). это в отличие от подсетей, описанных выше, <strong>, где ip-пакеты фактически никогда не меняются </strong>.</li> <li><code>s</code> получает серию пакетов tcp) (с src ip: <code>10.9.20.21</code>, src порт: <code>14567</code>) и отправлять ответные пакеты с этими значениями в полях назначения.</li> <li><code>r</code> проверяет порт назначения, который является <code>14567</code> и пересылает пакет в <code>a</code>.</li> <li><code>a</code> получает ответный пакет.</li> </ol><p>в описанной выше ситуации, если <code>b</code> попытался открыть соединение с тем же портом источника (<code>14567</code>), он будет сопоставлен с другим портом <code>r</code> (и порт в исходящем пакете изменился) перед отправкой в <code>s</code>. то есть будет также трансляция портов вместо просто ip.</p><p>здесь следует отметить две вещи:</p><ol> <li>из-за этой трансляции адресов часто невозможно установить соединение с устройствами в частной сети без использования некоторых специальных методов.</li> <li>ограничение на общее количество tcp подключений от одного устройства к серверу (65536 = 2 ^ 16) теперь применяется коллективно ко всем устройствам за nat, в nat = форма используется выше.</li> </ol>