Классы IP-адресов (A, B, C), определение границы Network ID / Host ID, служебные адреса, таблица маршрутизации и причины неэффективности классовой модели.
К какому классу относится IP-адрес 172.16.5.1?
Какие два адреса зарезервированы в каждой IP-сети и не могут назначаться узлам?
В чём главный недостаток классовой адресации?
Для чего используется маршрут по умолчанию (default route)?
Какая маска подсети по умолчанию соответствует классу A?
Что произойдёт при отправке пакета на широковещательный адрес сети?
Мы с вами сознательно не упомянули о том, где проходит граница между левой и правой частью IP-адреса. Сейчас пришла пора проговорить этот момент.
Замечу сразу, что мы будем говорить про классовую адресацию (classful addressing). То есть про то, что в современном мире вы уже не встретите. Классовая адресация -- это то, как изначально было придумано, а потом поняли, что придумали плохо, и сделали бесклассовую адресацию (classless addressing), которая будет отдельным модулем.
Однако то, что мы сегодня не пользуемся классовой адресацией, не означает, что её не нужно понимать. Дело в том, что протокол создавался исходя из классовой адресации. Все фичи, которые в нём есть, создавались из классовой адресации. А потом просто "костылями" подоткнули, чтобы решить одну большую глобальную проблему, а логика протокола как была классовой, так и осталась.
Каким образом два устройства отправляют друг другу данные?
У нас есть узел, который хочет отправить данные кому-нибудь. Этот узел смотрит, находится ли получатель в одном канале с ним, с отправителем:
Мы говорили, что у каждого узла не должно быть двух интерфейсов, смотрящих в одну и ту же канальную среду. То есть, если у вас есть сеть Ethernet, вы не должны двумя интерфейсами на одной машине смотреть в эту канальную среду. Это будет нарушением правила обработки IP-пакетов. Для корректной работы у вас должен быть один интерфейс, смотрящий в эту среду, на котором есть один основной адрес и, возможно, какие-то запасные.
Как вы определяете, что получатель находится с вами в одном канале?
Вы просто перебираете все свои интерфейсы: первый проверяете, второй проверяете, третий проверяете. Если ни одного общего интерфейса с получателем не нашлось -- отправляете пакет в сторону маршрутизатора.
Вы отправляете пакет, но отправляете его в кадре. Этот кадр должен иметь канальные адреса. Если говорить про Ethernet, там есть MAC-адрес отправителя и получателя. Вы должны правильно заполнить эти MAC-адреса:
Логика здесь одинакова как при классовой, так и при бесклассовой адресации.
Вам нужно знать, где у вашего IP-адреса проходит граница между левой и правой частью. Знать, где эта граница проходит у всех остальных узлов, вам не нужно.
Когда нужно отправить пакет, вы берёте столько бит из IP-адреса соседа, сколько у вас составляет Network ID, и сравниваете со своими битами:
В пределах одной канальной среды у всех узлов левая часть должна быть одинакового размера.
У IP-адреса 32 бита. Чем меньше бит отводится под Host ID, тем меньше хостов можно разместить в этой канальной среде.
Например, если 24 бита под Network ID, то оставшиеся 8 бит под Host ID дают 256 разных значений (2^8).
Все IP-адреса в мире ограничены 4 миллиардами с копейками (2^32). Есть организация IANA (Internet Assigned Numbers Authority), которая распределяет эти адреса и говорит: "Вот эти адреса используешь ты, вот эти -- ты, и больше никто эти адреса использовать не может".
Поскольку адреса -- это ограниченный ресурс, рано или поздно за них возникает конкуренция. Все адреса, которые можно использовать в интернете, вы обязаны покупать. Есть небольшая область адресов, которую можно использовать бесплатно, но в интернет вы с такими адресами не выйдете.
Когда вы покупаете адреса, вы покупаете сразу сеть. Вы покупаете левую часть (Network ID), а правую часть (Host ID) выбираете самостоятельно. Из 32 бит вы покупаете все адреса, у которых определённые левые биты будут одинаковые и фиксированные, а все правые биты перебирают все возможные значения.
Если покупаете слишком большую сетку, которую не используете, -- просто зря тратите деньги.
В каждой сети два адреса использовать нельзя:
| Адрес | Host ID | Назначение |
|---|---|---|
| Первый (самый младший) | Все биты = 0 | Адрес самой сети, нельзя назначать узлам |
| Последний (самый старший) | Все биты = 1 | Широковещательный адрес (broadcast), принимается всеми узлами в сети |
Например, для сети 192.168.1.0/24:
192.168.1.0 -- адрес сети192.168.1.255 -- широковещательный адрес192.168.1.1 ... 192.168.1.254 -- адреса для узлов (254 штуки)Широковещательный адрес работает так: если вы получаете IP-пакет, у которого Network ID совпадает с вашим, а Host ID -- все единички, вы воспринимаете этот адрес как свой собственный. Отправлять IP-пакеты из-под такого адреса нельзя, но принимать IP-пакеты на такой адрес будут все узлы с таким же Network ID.
Первый протокол IP, которым мы стали массово пользоваться -- IPv4, определённый в RFC 791 (Request for Comments), -- определял три возможных размера сетей: класс A, класс B и класс C.
| Параметр | Значение |
|---|---|
| Первый бит | 0 |
| Первый октет | 0 -- 127 |
| Размер Network ID | 8 бит (1 октет) |
| Размер Host ID | 24 бита (3 октета) |
| Количество сетей | 128 (2^7), реально 126 |
| Адресов в сети | 16 777 216 (2^24) |
| Хостов в сети | 16 777 214 |
Сети класса A -- это сети-гиганты. Вы не можете взять сеть класса A и разделить её пополам -- это запрещено. Вы обязаны использовать все адреса в одной канальной среде.
В реальности вы не видели таких сетей никогда и не увидите -- с миллионами узлов. Поэтому сети класса A, конечно, существовали, но их, как правило, выкупали крупные корпорации в надежде когда-нибудь вырасти. Но не выросли. Потом появилась бесклассовая адресация, и вся эта идея пошла прахом. Зато те компании, которые выкупили себе сетки класса A, потом на этом деле хорошо поднялись.
Сети 0.x.x.x и 127.x.x.x зарезервированы под служебные нужды, поэтому реально доступных сетей класса A -- 126.
| Параметр | Значение |
|---|---|
| Первые два бита | 10 |
| Первый октет | 128 -- 191 |
| Размер Network ID | 16 бит (2 октета) |
| Размер Host ID | 16 бит (2 октета) |
| Количество сетей | 16 384 (2^14) |
| Адресов в сети | 65 536 (2^16) |
| Хостов в сети | 65 534 |
Левая половина -- Network ID, правая половина -- Host ID. Если вы не влезали в сеть класса C, то вынуждены были покупать класс B. Но компании, которым реально не хватало бы класса B, представить довольно сложно. Все IP-адреса обязаны использоваться в одном широковещательном домене.
| Параметр | Значение |
|---|---|
| Первые три бита | 110 |
| Первый октет | 192 -- 223 |
| Размер Network ID | 24 бита (3 октета) |
| Размер Host ID | 8 бит (1 октет) |
| Количество сетей | 2 097 152 (2^21) |
| Адресов в сети | 256 (2^8) |
| Хостов в сети | 254 |
Это самая маленькая сеть, которую можно было придумать в рамках RFC 791.
Когда придумывались сети, они придумывались одного из трёх размеров:
Никаких point-to-point сетей не было. Если нужно было соединить два узла прямым проводом, вы обязаны были использовать сеть класса C. Два адреса из 256 вы использовали, а оставшиеся 254 просто покупали и ничего с ними не могли сделать.
Если в канальной среде было 300 узлов -- приходилось покупать класс B (65 000 адресов), а использовать только 300. Остальные лежали мёртвым грузом.
Классовая адресация была потрясающе неэффективной в плане использования IP-адресов. Номинально адресов 4 миллиарда, но использовать вы их толком не могли.
Она очень легко позволяет вычислить Network ID из IP-адреса. Смотрите на IP-адрес, определяете класс по первому октету, и сразу знаете, где граница:
192.168.1.1 -- первый октет 192, класс C, Network ID: 192.168.1, Host ID: 110.1.1.1 -- первый октет 10, класс A, Network ID: 10, Host ID: 1.1.1На практике это не очень полезно -- вам не нужно знать, какой Network ID у соседа. Главное -- знать свой Network ID.
Поэтому классовую адресацию сегодня использовать не нужно, и всё оборудование от этой идеи отошло.
Допустим, у машины есть два интерфейса:
192.168.1.1 (класс C)172.16.1.1 (класс B)Нужно отправить пакет на 172.16.32.0.
Шаг 1. Проверяем интерфейс 1:
192.168.1.1 -- класс C, Network ID = 192.168.1172.16.32192.168.1 и 172.16.32 не совпадают. Не тот канал.Шаг 2. Проверяем интерфейс 2:
172.16.1.1 -- класс B, Network ID = 172.16172.16172.16 = 172.16. Совпадение! Получатель в одном канале.Отправляем пакет через интерфейс 2 напрямую получателю.
Обратите внимание: адрес 172.16.32.0 при классовой адресации -- это адрес хоста, а не адрес сети! Потому что для класса B:
172.16.0.0172.16.255.255172.16.32.0, -- адреса хостовНа одном интерфейсе можно задавать несколько адресов из одной подсети. Если вы это делаете, то должны выбрать, из-под какого адреса отправлять исходящие пакеты. Этот адрес помечается как основной (primary).
Основной адрес нужен только для одного: если система не знает, из-под какого адреса отправить IP-пакет (например, вы набираете telnet 172.16.32.0 без явного указания адреса источника), она берёт основной адрес с интерфейса, через который пойдёт пакет.
Основной адрес ничем не лучше и не хуже остальных -- это обычный адрес. Он нужен только как подсказка: "Если не знаешь, откуда отправлять -- отправляй с этого."
Нельзя, чтобы два физических интерфейса одной машины смотрели в одну и ту же канальную среду с IP-адресами из одной IP-сети. Например, две сетевые карты одного компьютера в один коммутатор с IP-адресами 192.168.1.1 и 192.168.1.2 -- это запрещено. Система будет ругаться, потому что невозможно определить, через какой из двух интерфейсов отправлять данные.
А вот на одном интерфейсе два адреса из одной сети -- пожалуйста, никаких проблем.
Если получатель не находится ни в одной из directly connected сетей, используется таблица маршрутизации. Это полное представление о том, как устроена сеть и как до всего добраться.
Допустим, у маршрутизатора два интерфейса:
192.168.1.1, connected-сеть 192.168.1.0172.16.1.1, connected-сеть 172.16.0.0И в таблице есть записи об удалённых сетях:
| Сеть | Интерфейс | Примечание |
|---|---|---|
10.0.0.0 |
Ethernet 0 | Connected |
192.168.1.0 |
Ethernet 1 | Connected, default |
При поиске маршрута до 10.255.255.254:
10.0.0.0 -- класс A, Network ID = 10. У получателя тоже 10. Совпадение! Отправляем через Ethernet 0.При классовой адресации у вас не может быть такого, что в таблице есть несколько способов добраться до одного и того же IP-адреса. Один IP-адрес всегда принадлежит одной классовой сети, и эта сеть либо присутствует в таблице, либо нет.
Вместо того чтобы перечислять все сети в мире (а это тысячи и десятки тысяч записей), вы помечаете один маршрут как маршрут по умолчанию. Все пакеты, не попавшие под явные маршруты, отправляются по нему.
Это позволяет резко сократить количество записей в таблице маршрутизации. Особенно для конечных узлов и небольших маршрутизаторов.
Есть корпоративная сеть с маршрутизатором, который смотрит в интернет:
10.0.0.0 (класс A) -- за левым маршрутизатором11.0.0.0 (класс A) -- connected12.0.0.0 (класс A) -- connected192.168.1.0 (класс C) -- связь между маршрутизаторами192.168.0.0 (класс C) -- в сторону интернета, defaultШлюз по умолчанию (default gateway) -- это указание для конечного узла: "Вообще все сети доступны за вот этим маршрутизатором." Даже если вы не можете просмотреть таблицу маршрутизации, шлюз по умолчанию вы можете задать.
Например, узел 12.0.0.2:
12, -- в его сети (connected, класс A)Центральный маршрутизатор знает про все connected-сети, про удалённую сеть 10.0.0.0 через соседний маршрутизатор, а всё остальное (интернет) -- через default-маршрут.
Маршрут по умолчанию может быть только один.
Для провайдеров маршрут по умолчанию уже не пройдёт: у провайдерского маршрутизатора слева половина интернета, справа -- другая половина. Там нужно действительно знать про все сети в мире. Но это провайдерское оборудование, и проблемы с нехваткой памяти или процессорной мощности на нём встречаются реже, чем на оборудовании класса SOHO (Small Office, Home Office).
В 2016 году (когда записывался курс) классовой адресацией уже не пользуются. Хотя термины "сеть класса B" и "сеть класса C" всё ещё остались в обиходе, на самом деле имеются в виду бесклассовые сети, которые по размеру соответствуют классовым. Например, когда говорят "сеть класса C 192.168.1.0", имеют в виду бесклассовую сеть с маской /24.
Дальше -- бесклассовая адресация, то, чем мы на самом деле пользуемся в реальном мире.