Отличия вайфай сети от эзернета я пока рассматривать не буду, просто пока примем, что вайфай в таймкапсуле работает в режиме точки доступа, который эмулирует эзернет. Эзернет на схеме показан как труба, к которой подключены маршрутизатор и пылесос, так в схемах сетей обозначают разные шинные топологии.
Итак что же произошло при получении пылесосом настроек сети? Сетевой интерфейс пылесоса произвел автонастройку параметров, необходимых для полноценной передачи данных в соответствии с информацией, полученной от dhcp сервера таймкапсуля. Предположим он получил от домашнего маршрутизатора (таймкапсуля)
1. IP адрес - 192.168.0.100
2. Маску сети - 255.255.255.0
3. Шлюз по умолчанию - 192.168.0.1
4. IP адреса ДНС серверов - 192.168.0.1, 8.8.8.8
Итак зачем все это нужно.
IP адрес - идентификатор хоста в IP сети, уникальное в сети 32хбитное число, представляемое для удобства человека чаще всего как набор из 4х 8мибитных десятичных чисел (байтов или октетов). Октет это восьмиразрядное двоичное число, например 11111111. В большинстве случаев сейчас байт тоже восьмиразрядное двоичное число, поэтому в данном контексте они тождественны.
192.168.0.100 - 11000000101010000000000001100100 или 3232235620 (в десятичной системе), или 11000000.10101000.00000000.01100100 с разделением октетов точками.
Тут нужно опять сделать отступление. Представьте, что вам нужно перемножить 2 числа -
LXXVIII * CXI, для многих задача покажется невыполнимой, потому что я привел числа, записанные римскими цифрами, а данная система записи чисел - непозиционная.
В то врtмя как мы привыкли использовать арабские цифры и позиционную систему записи чисел с основанием в 10.
LXXVIII * CXI = 78 * 111 = 78*100+78*10+78*1 = 7800+780+78 = 7000+800+700+80+70+8 =
= 7000+1500+150+8=8658, ну или в столбик. Эти все итерации в примере возможны потому, что каждая цифра может обозначать разные числа, находясь в разных позициях, позиции определяют соответствующие степени основания системы счисления (для нас привычно степени 10ти - 10^0 - единицы, 10^1 - десятки, 10^2 -сотни и т.д.), а цифра в позиции определяет их количество. То есть 111 = 1 единица + 1 десятка + 1 сотня.
Эти же принципы используются в системах счисления с другим основанием (двоичной, восьмеричной, шестнадцатиричной), нас будет интересовать двоичная система.
В двоичной системе основание не 10, а 10, шутка, а нет, не шутка - основание 2 то есть в двоичной записи - 10, цифр соответственно не 10 (0-9), а 2 (0,1), переход в числа в следующую позицию осуществляется при исчерпании цифр в текущей позиции. То есть как в десятичной системе, пока можно увеличивать число изменяя цифру в позиции, количество позиций не изменяется. Например число будет одноразрядным, пока для единиц хватает цифр - 1, 2, 3, 4, 5, 6, 7, 8, 9, а вот цифры закончились, дальше для увеличения числа нужно изменять разряд. 10,11,12..99, опять закончились цифры уже в десятках, опять добавляем разряд, и следующее число - 100.
Еще раз в двоичной системе цифр только 2 (0,1), поэтому натуральный ряд чисел выглядит так - 1, 10, 11, 100, 101, 110, 111 и т. д. Его не трудно перевести на человеческий (десятичный), это соответственно 1, 2, 3, 4, 5, 6, 7.
Еще раз:
1-1
2-10
3-11 (почти 99)
4-100
5-101 (дальше как с 909)
6-110 (а тут как с 990)
7-111 (а это похоже на 999).
Теперь попробуем подвести это к IP адресам, то есть к их частям - октетам. Возьмем последние октеты наших устройств (таймкапсуль-маршрутизатор - 192.168.0.1, пылесос - 192.168.0.100), то есть 1 и 100, и переведем их в двоичную систему с сохранением количества цифр в октете.
1 - 00000001 (1)
100 - 01100100 (1100100)
Чтобы количество цифр сохранялось равным 8ми (это важно), в части чисел нужны лидирующие нули.
Далее нужно понять зачем все это. А все это для маршрутизации.
У каждого компьютера, оборудованного сетевым интерфейсом с настроенным IP есть таблица маршрутизации, которая создается после настройки IP адреса на интерфейсе и некоторых дополнительных параметров.
Посмотрим как выглядит такая таблица у пылесоса, после настройки сети.
После добавления IP адреса 192.168.0.100 и маски сети 255.255.255.0 к интерфейсу в таблицу маршрутизации добавилось 2 записи:
1. - 192.168.0.100 255.255.255.255 - локальный адрес
2. - 192.168.0.0 255.255.255.0 - сеть непосредственно подключена к интерфейсу
После добавления шлюза по умолчанию - 192.168.0.1 в таблицу маршрутизации добавилась 1 запись:
3. - 0.0.0.0 0.0.0.0 - через шлюз 192.168.0.1.
Итого, еще раз, в таблице маршрутизации пылесоса появилось 3 записи:
1. - 192.168.0.100 255.255.255.255 - локальный адрес
2. - 192.168.0.0 255.255.255.0 - сеть непосредственно подключена к интерфейсу
3. - 0.0.0.0 0.0.0.0 - через шлюз 192.168.0.1.
Записи обычно сортируются по возрастанию, так что при просмотре это будет выглядеть так:
0.0.0.0 0.0.0.0 - через шлюз 192.168.0.1.
192.168.0.0 255.255.255.0 - сеть непосредственно подключена к интерфейсу
192.168.0.100 255.255.255.255 - локальный адрес
Вот как это выглядит,например, в windows 7:
$ netstat -nr
===========================================================================
Список интерфейсов
14...6c 71 d9 84 cb 57 ......Atheros AR9485WB-EG Wireless Network Adapter
13...74 d0 2b b0 64 a7 ......Qualcomm Atheros AR8161/8165 PCI-E Gigabit Ethernet Controller (NDIS 6.20)
12...6c 71 d9 84 cb 56 ......Устройства Bluetooth (личной сети)
1...........................Software Loopback Interface 1
17...00 00 00 00 00 00 00 e0 Адаптер Microsoft ISATAP
27...00 00 00 00 00 00 00 e0 Адаптер Microsoft ISATAP #2
16...00 00 00 00 00 00 00 e0 Адаптер Microsoft ISATAP #3
15...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
===========================================================================
IPv4 таблица маршрута
===========================================================================
Активные маршруты:
Сетевой адрес Маска сети Адрес шлюза Интерфейс Метрика
0.0.0.0 0.0.0.0 192.168.0.1 192.168.0.100 20
192.168.0.0 255.255.255.0 On-link 192.168.0.100 276
192.168.0.100 255.255.255.255 On-link 192.168.0.100 276
192.168.0.255 255.255.255.255 On-link 192.168.0.100 276
127.0.0.0 255.0.0.0 On-link 127.0.0.1 306
127.0.0.1 255.255.255.255 On-link 127.0.0.1 306
127.255.255.255 255.255.255.255 On-link 127.0.0.1 306
255.255.255.255 255.255.255.255 On-link 127.0.0.1 306
Здесь кроме тех маршрутов, что я перечислял выше, есть еще несколько, но про них позже.
Теперь надо сказать несколько слов откуда эти маршруты взялись и что с ними можно делать. Представьте, что пылесосу нужно отправить какие-то данные хосту 8.8.8.8, на котором находится публичный ДНС гугла, ну типа "привет, пока, пшел вон, тупая железяка!", так сказать приветствие от IoT компании эппл, сервису компании гугл. Для отправки данного месседжа, его необходимо поместить в IP пакет с соответствующими заголовками, по минимуму как-то так:
1. IP адрес отправителя
2. IP адрес получателя
3. Тип данных
4. TTL и т. д.
Хост готовит пакет, в котором IP адрес отправителя - 192.168.0.100, IP адрес получателя - 8.8.8.8, остальное пока не важно. Далее встает вопрос куда же это отправлять? За ответом хост отправляется выбирать из собственной таблицы маршрутизации маршрут, по которому отправить пакет.
Выбор маршрута происходит просто - из таблицы выбирается маршрут для которого выполняются следующие условия:
1. IP адрес получателя входит в диапазон адресов, описанных сетевым адресом и маской сети
2. Из нескольких подходящих маршрутов выбираются те, у которых маска сети максимальна
3. Из оставшихся выбираются те, у которых метрика минимальна.
Теперь нужно понять, зачем нужны маски и как все это работает.
Для этого нужно еще одно лирическое отступление о битовых операциях, в википедии все описано очень хорошо, немногое необходимое про истину и ложь все должны были в школе изучить, но все таки остановлюсь на этом немногом.
Итак в большинстве машинных языков наряду с арифметическими операциями используются также разные операции логические. Логику сейчас в школе не изучают, что прискорбно, но нам нужен минимум.
Чаще всего эквивалентом истинности чего-либо в вычислениях является двоичная единица, а эквивалентом лжи - ноль.
Теперь к сути операций, сначала Логическое И (умножение или AND):
Истина И Истина = Истина, Ложь И (Истина или Ложь) = Ложь, (если есть хоть немного лжи, то все целиком - ложь) или так:
1 И 1 = 1, 1 И 0 = 0, 0 И 1 = 0, 0 И 0 = 0, или так:
1 * 1 = 1, 1 * 0 = 0, 0 * 1 = 0, 0 * 0 = 0.
То есть если один из операндов - ноль, результат тоже ноль.
Далее Логическое ИЛИ (сложение или OR):
Истина ИЛИ Истина = Истина, Истина ИЛИ Ложь = Истина, Ложь ИЛИ Ложь = Ложь (если есть хоть немного истины, то все целиком - истина) или так:
1 ИЛИ 1 = 1, 1 ИЛИ 0 = 1, 0 ИЛИ 1 = 1, 0 ИЛИ 0 = 0, или так:
1 + 1 = 1 (сумма, конечно, 2, но главное, что она больше нуля, то есть результат суммирования не 0), 1 + 0 = 1, 0 + 1 = 1, 0 + 0 = 0.
То есть если один из операндов - единица, то результат тоже единица.
Логическое НЕ (отрицание или инверсия, или NOT):
НЕ Истина = Ложь, а НЕ Ложь = Истина, или так:
НЕ 1 = 0, а НЕ 0 = 1.
То есть после операции результат будет противоположным операнду.
Теперь вернемся к маскам. Маски представляют собой некий числовой трафарет (похожий на решетку Кардано), который нужен для необходимых в маршрутизации IP пакетов расчетов.
Чаще всего это набор единиц слева направо в 32х-разрядном двоичном числе. Например:
10000000000000000000000000000000 - маска /1 (1 единица) или 128.0.0.0,
11000000000000000000000000000000 - маска /2 (2 единицы) или 192.0.0.0,
11100000000000000000000000000000 - маска /3 (3 единицы) или 224.0.0.0,
11111111.00000000.00000000.00000000 - маска /8 (8 единиц) или 255.0.0.0,
11111111.11111111.00000000.00000000 - маска /16 (16 единиц) или 255.255.0.0,
11111111.11111111.11111111.00000000 - маска /24 (24 единицы) или 255.255.255.0.
Маски (32 бита) накладывается на IP адреса (32 бита), чтобы производить разнообразные расчеты.
В нашем примере с пылесосом маска 255.255.255.0 накладывается на IP адрес интерфейса - 192.168.0.100 для расчетов записей, добавляемых в таблицу маршрутизации:
Повторю еще раз 192.168.0.100 это в двоичной системе -
11000000.10101000.00000000.01100100,
а 255.255.255.0 -
11111111.11111111.11111111.00000000.
Итак на первом этапе стек рассчитывает из комбинации адреса и маски адрес IP сети, непосредственно подключенный к интерфейсу при помощи побитовой операции И:
11000000.10101000.00000000.01100100 И
11111111.11111111.11111111.00000000 =
11000000.10101000.00000000.00000000 или 192.168.0.0.
Расчетный адрес подсети соответственно - 192.168.0.0 с маской 255.255.255.0, нужно отметить, что в знакоместах адреса биты, закрытые единицами маски, не изменились, а в знакоместах закрытых нулями все единицы изменились на нули.
Далее производится операция инвертирования маски - НЕ
11111111.11111111.11111111.00000000 =
00000000.00000000.00000000.11111111
это 0.0.0.255.
Данное число называется wildcard. Это эквивалент количества адресов в данной сети.
Таким образом минимальный адрес в сети, подключенной к вайфай интерфейсу пылесоса -
192.168.0.0, а максимальный (192.168.0.0+0.0.0.255) - 192.168.0.255.
Для адресов из данного диапазона пылесос будет отправлять IP пакеты непосредственно в интерфейс, а хосты с адресами из данного диапазона будут соответственно доступны пылесосу непосредственно, то есть без промежуточных шлюзов.
Все это нужно, чтобы при настройке интерфейса добавить в таблицу маршрутизации запись, указанную ранее:
192.168.0.0 255.255.255.0 - сеть непосредственно подключена к интерфейсу.
А также чтобы определять принадлежность произвольного адреса назначения в IP пакете определенной сети из таблицы маршрутизации.
Например 8.8.8.8 совершенно точно не входит в 192.168.0.0 255.255.255.0, но в таблице маршрутизации была еще одна запись:
0.0.0.0 0.0.0.0 - через шлюз 192.168.0.1,
Как понимать что такое сеть 0.0.0.0 0.0.0.0.
Давайте посчитаем.
Адрес 0.0.0.0 это:
00000000.00000000.00000000.00000000, маска такая же:
00000000.00000000.00000000.00000000, после операции И, получим
00000000.00000000.00000000.00000000, это 0.0.0.0 - адрес сети (а также и минимальный адрес в данной сети), после инверсии маски:
00000000.00000000.00000000.00000000, получим
11111111.11111111.11111111.11111111, то есть 255.255.255.255 (wildcard, количество адресов в сети), после арифметического сложения адреса сети и wildcard (0.0.0.0+255.255.255.255) получим 255.255.255.255 - максимальный адрес в сети.
После данных операций становится понятно, что сеть 0.0.0.0 0.0.0.0 (короткая запись с маской, указывающей на количество единиц маски, - 0.0.0.0/0) содержит все IPv4 адреса в сети IP. Адреса 8.8.8.8, 192.168.0.1 и 192.168.0.100 являются частью данной сети.
Продолжение следует...