9.5. IP-адреса

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

Сетевой уровень решает эту проблему с помощью второго рода адреса, который не зависит от того, в какой кабель подключено устройство. Этот вид адреса называется адресом Internet Protocol, или IP-адресом, а часть «Internet Protocol» в названии указывает на набор правил, которым следует каждый узел в интернете при отправке или пересылке такого адреса. Современный интернет использует параллельно две версии схемы адресации – IPv4 (более старая форма, по-прежнему преобладающая в небольших сетях) и IPv6 (более новая форма, постепенно её замещающая).

9.5.1. Что такое IP-адрес

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

  • Адреса IPv4 имеют длину 32 бита и записываются в виде четырёх десятичных чисел, разделённых точками, где каждое число – один байт:

    192.168.1.42
    8.8.8.8
    10.0.0.1
    

    Тридцать два бита дают примерно четыре миллиарда возможных адресов, что казалось более чем достаточным, когда IPv4 разрабатывался в 1970-х, и оказалось недостаточным к началу 2010-х.

  • Адреса IPv6 имеют длину 128 бит и записываются в виде восьми групп по четыре шестнадцатеричные цифры, разделённых двоеточиями:

    2001:0db8:85a3:0000:0000:8a2e:0370:7334
    

    Последовательности нулей можно сократить до ::, а ведущие нули в группе можно отбросить, поэтому приведённый выше адрес обычно записывается как 2001:db8:85a3::8a2e:370:7334.

В остальном два семейства адресов – это разные языки; узел IPv4 не может напрямую отправить пакет узлу IPv6 без помощи шлюза. Модули network и socket камеры поддерживают оба. В этом руководстве в примерах используется IPv4, потому что большинство локальных сетей, к которым подключается камера, по-прежнему работают только на IPv4, но всё последующее работает точно так же и для IPv6, стоит лишь заменить адреса.

9.5.2. Для чего нужен IP-адрес

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

Это поведение по принципу «переход за переходом» и есть то, что заставляет интернет работать как одну большую сеть, а не как множество мелких островков. На следующей странице рассказывается, как выбираются переходы; эта же – только об адресе.

9.5.3. Как камера получает адрес

Камере, только что подключившейся к сети Wi-Fi, нужен IP-адрес, прежде чем она сможет с чем-либо общаться. Есть два распространённых способа, как это происходит.

Первый – это автоматическое назначение. Камера запрашивает адрес у локальной сети; устройство, которое его выдаёт, – это маршрутизатор, коробка, соединяющая локальную сеть с более широким интернетом. В большинстве домашних и небольших офисных конфигураций та же самая физическая коробка одновременно выступает и коммутатором, в который подключаются проводные устройства, и точкой доступа Wi-Fi, с которой связываются беспроводные устройства, так что «маршрутизатор», «коммутатор» и «точка доступа» могут быть одним и тем же куском оборудования. Маршрутизатор запускает небольшую службу под названием DHCP (Dynamic Host Configuration Protocol), которая хранит пул доступных адресов, выбирает один для каждого только что появившегося устройства и арендует его на фиксированное время. Заодно маршрутизатор выдаёт камере ещё пару полезных элементов конфигурации:

  • адрес, на который отправлять исходящий трафик, когда назначение находится вне локальной сети (шлюз по умолчанию, которым является собственный адрес маршрутизатора); и

  • адреса одного или нескольких серверов имён, которые превращают удобочитаемые имена вроде example.com в IP-адреса. Служба разрешения имён называется DNS, Domain Name System, и подробно описана в Имена и DNS.

Всё это происходит автоматически, пока поднимается соединение. Камере не нужно явно запрашивать что-либо из этого; в тот момент, когда isconnected() возвращает True в примере на предыдущей странице, у камеры уже есть её адрес, её шлюз и её серверы имён.

Второй вариант – это статическая настройка. В некоторых развёртываниях нужен известный адрес для камеры, чтобы другие устройства могли достучаться до неё, не разыскивая её предварительно. Метод ipconfig() задаёт адрес, шлюз и сервер имён вручную:

wlan.ipconfig(addr4=("192.168.1.50/24", "192.168.1.1"))
wlan.ipconfig(dns="192.168.1.1")

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

Как только у камеры появляется IP-адрес, она присоединяется к интернету (или по крайней мере к его части в локальной сети). Другие устройства теперь могут адресовать ей пакеты по этому адресу, а она может адресовать пакеты им.

9.5.4. Маска подсети и /24

/24 в конце адреса в приведённом выше примере статической настройки – это маска подсети. Сам по себе IP-адрес не говорит, где заканчивается локальная сеть – 192.168.1.50 может быть одним из нескольких сотен адресов в небольшой домашней сети или одним из тысяч в более крупной. Маска подсети говорит, какая часть адреса именует сеть, а какая – узел внутри неё.

/24 означает «первые 24 из 32 битов именуют сеть; последние 8 именуют узел». Для 192.168.1.50/24 это разбивает адрес на 192.168.1 для сети и .50 для узла, оставляя место примерно для 254 устройств в одной локальной сети. /16 оставило бы больше битов для части узла и вместило бы намного больше устройств в одну сеть; /30 оставило бы только два адреса узлов и вместило бы соединение точка-точка.

Маску подсети также обычно записывают как четырёхбайтовое число в той же точечной нотации, что и адрес. /24 эквивалентно 255.255.255.0 – читайте каждый байт как «все биты, принадлежащие части сети». Обе формы взаимозаменяемы; считыватель ipconfig() в следующем подразделе как раз возвращает четырёхбайтовую форму.

Почему это разделение вообще важно – как устройство использует маску подсети, чтобы решить, находится ли назначение в локальной сети или должно выйти через шлюз, и почему большинство домашних сетей оказываются на /24 – описано в Частные сети и NAT.

9.5.5. Чтение адреса обратно

Метод ipconfig() без аргументов возвращает активную конфигурацию. Представление addr4 возвращает IP-адрес и маску подсети:

>>> wlan.ipconfig("addr4")
('192.168.1.50', '255.255.255.0')