IPv4 — 32 бита, dotted decimal и почему адресов не хватает
Каждый раз, когда вы открываете сайт, ваш компьютер использует IP-адрес — 32 бита, записанные как 93.184.216.34. Эти 32 бита — основа интернета: уникальный идентификатор каждого подключённого устройства. В 1980-х казалось, что 4 миллиарда адресов хватит на всё человечество. В 2026 году нам не хватает.
В этом уроке разберём, что такое IPv4-адрес физически (32 бита), как читается dotted decimal, что были за классы A/B/C, как мир пришёл к проблеме исчерпания и почему NAT с одной стороны спас интернет, а с другой — сделал его сложнее. Понимать это нужно DE потому, что вся ваша работа крутится вокруг IP — от подключения к БД до VPC peering в AWS.
32 бита, четыре октета
IPv4-адрес — это 32-битное число. Оно может быть записано:
- В десятичной форме:
1576036898. - В hex:
0x5DB8D822. - В бинарной:
01011101 10111000 11011000 00100010. - В dotted decimal:
93.184.216.34— четыре десятичных числа от 0 до 255, разделённых точками.
Dotted decimal придумали для удобства человека. Алгоритм:
- Берём 32 бита.
- Делим на четыре части по 8 бит (октеты).
- Каждую часть преобразуем в десятичное (0-255).
- Соединяем точками.
Несколько интересных моментов:
- Каждый октет может быть 0-255. Адреса вроде
256.10.5.4невозможны — 256 не влезает в 8 бит. Иногда видишь IP999.10.5.4в логах подделанных адресов или просто опечатках. - Адрес
0.0.0.0— особый, означает «любой» (используется как wildcard при bind на сокете). - Адрес
255.255.255.255— broadcast (всем в текущем сегменте). - Адреса
127.0.0.0/8(любой адрес127.X.X.X) — loopback (твоя собственная машина).
Всего адресов: 2^32 = 4,294,967,296. Около 4.3 миллиарда. Кажется много, пока не вспомнить, что в мире 8 миллиардов людей и десятки миллиардов устройств.
Преобразование октета в десятичное — быстрая шпаргалка
Каждый бит в октете имеет вес:
| Бит | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|
Чтобы преобразовать октет вроде 10111000:
- 1 в позиции 128 -> добавили 128
- 0 в позиции 64 -> 0
- 1 в позиции 32 -> добавили 32
- 1 в позиции 16 -> добавили 16
- 1 в позиции 8 -> добавили 8
- 0 в позиции 4 -> 0
- 0 в позиции 2 -> 0
- 0 в позиции 1 -> 0
- Итого: 128 + 32 + 16 + 8 = 184
Полезно запомнить степени двойки до 256: 1, 2, 4, 8, 16, 32, 64, 128, 256. Это нужно для subnetting в следующем уроке.
В Python это тривиально:
import ipaddress
# Создать IPv4-объект:
ip = ipaddress.IPv4Address('93.184.216.34')
# 32 бита как int:
print(int(ip)) # 1576036898
# Бинарная форма:
print(f'{int(ip):032b}') # 01011101101110001101100000100010
# Hex:
print(hex(int(ip))) # 0x5db8d822
# Обратно из int в адрес:
ipaddress.IPv4Address(1576036898) # IPv4Address('93.184.216.34')
Исторические классы A, B, C, D, E
Когда в начале 1980-х спроектировали IP, никто не знал, как делить адреса между организациями. Решили разбить пространство на классы фиксированного размера. Класс определяется первыми битами адреса.
Проблема классового деления: разрыв слишком большой.
- Class A: 16,777,214 хостов. Хорошо, если у вас IBM. Плохо, если у вас компания на 1000 человек — бессмысленно тратить.
- Class B: 65,534 хостов. Идеально для крупного университета. Маленьким — много.
- Class C: 254 хоста. Маленькая контора. Среднему бизнесу — мало.
Если у вас 500 пользователей — Class C мало (254), Class B много (65K). Что взять? Брали Class B, оставшиеся 64,500 адресов пропадали. Так выгорело огромное количество адресов.
Решение пришло в 1993 — CIDR (Classless Inter-Domain Routing), который мы изучим в следующем уроке. CIDR убрал классы и разрешил произвольные размеры подсетей. Сейчас классы — только историческое любопытство, ни одна современная сеть с ними не работает.
Проблема исчерпания и краткая хронология
Цифры по годам — что происходило в IANA (организация, распределяющая IP):
- 1981. RFC 791 — стандарт IPv4. Прогноз: «адресов хватит надолго».
- 1992. Стало ясно: классов мало. Спроектирован CIDR (RFC 1519).
- 1993. Введён CIDR. Замедлило выгорание адресов лет на 20.
- 1995. Появились приватные диапазоны (10/8, 172.16/12, 192.168/16, RFC 1918). Дома и в офисах перестали использовать публичные IP, начали использовать приватные за NAT.
- 2011, 3 февраля. IANA выдала последние крупные блоки. Региональные интернет-регистраторы (RIR) получили по /8 каждому и больше IANA не раздаёт.
- 2012-2017. RIR-ы по очереди исчерпали свои блоки. APNIC (Asia-Pacific) — 2011. RIPE NCC (Europe) — 2012. LACNIC (Lat. Am) — 2014. ARIN (N. Am) — 2015. AfriNIC (Africa) — 2017.
- 2026. Новый блок IPv4 нельзя купить дёшево. Маленькие /24-блоки на вторичном рынке стоят $20K+. Цена /16 — миллионы.
Когда говорят ‘IPv4 исчерпался’, это не значит что нет ни одного свободного адреса. Это значит, что RIR-ы не выдают новые блоки. Есть вторичный рынок — крупные старые получатели (университеты, корпорации) могут продавать неиспользуемые блоки. Цена — $40-50 за один адрес в 2026 году.
Как живём дальше — NAT, CGNAT, IPv6
Адресов не хватает, но интернет работает. За счёт чего?
1. NAT (Network Address Translation). Дома 50 устройств, у роутера один публичный IP. Все устройства внутри имеют приватные IP вроде 192.168.1.X. Когда они выходят в интернет, роутер заменяет приватный IP на свой публичный и запоминает, кому принадлежал пакет. Об этом отдельный урок в модуле 6.
2. CGNAT (Carrier-Grade NAT). То же, но на уровне провайдера. У вас от провайдера приватный IP вроде 100.64.X.X, провайдер делает NAT на свой публичный пул. Очень популярно у мобильных операторов — они получают за провайдера один публичный IP на сотни абонентов.
3. IPv6. Радикальное решение — 128 бит вместо 32. Адресов хватит на каждый атом в Солнечной системе. Внедрение идёт медленно (с 1995 года), но в 2026 году ~40% Google-трафика идёт по IPv6. Об IPv6 отдельный урок.
Какие IP я вижу в ip addr и почему
Когда вы делаете ip addr (или ifconfig на macOS), вы видите IP-адреса своего компьютера. Они могут быть разных видов:
ip addr show
# 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
# inet 127.0.0.1/8 scope host lo
# inet6 ::1/128 scope host
# 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
# inet 192.168.1.42/24 brd 192.168.1.255 scope global dynamic eth0
# inet6 fe80::a683:e7ff:fe1a:bbcc/64 scope link
Расшифровка:
127.0.0.1/8— loopback. Любой адрес127.X.X.Xссылается на сам компьютер. Используется для локальных сервисов (база на 127.0.0.1:5432).192.168.1.42/24— приватный IP в локальной сети. Назначен DHCP (dynamic). /24 значит «маска 24 бита» (про это в следующем уроке).brd 192.168.1.255— broadcast-адрес подсети.scope global— адрес виден за пределами интерфейса.fe80::...— IPv6 link-local. Каждый интерфейс с IPv6 имеет такой, для общения внутри сегмента.
Полезные команды:
# Узнать ваш публичный IP (через внешний сервис):
curl ifconfig.me
# или:
curl ipinfo.io/ip
# или:
dig +short myip.opendns.com @resolver1.opendns.com
# Сравнить с локальным IP (из ip addr) -- обычно разные:
ip addr show | grep 'inet '
Локальный IP — то, что присвоено вашему интерфейсу (часто приватный 192.168.X.X). Публичный IP — то, с чего вы видны интернету (IP вашего роутера/провайдера). Они почти всегда разные, благодаря NAT.
Reserved / специальные адреса
Помимо классов, в IPv4 есть много специальных диапазонов, которые нельзя использовать как обычные публичные адреса:
0.0.0.0/8— «текущая сеть», особый wildcard.127.0.0.0/8— loopback (16M адресов на одну машину! используется обычно только 127.0.0.1).10.0.0.0/8— приватный диапазон (16M адресов).172.16.0.0/12— приватный (1M адресов).192.168.0.0/16— приватный (65K адресов).169.254.0.0/16— link-local (если DHCP не сработал, ОС сама назначает себе адрес отсюда — APIPA на Windows, Avahi на Linux).224.0.0.0/4— multicast.240.0.0.0/4— reserved.
Об этих диапазонах будет отдельный урок.
Попробуй сам
# 1. Посмотреть свои IP:
ip addr show # Linux
ifconfig # macOS / устаревший Linux
ipconfig # Windows
# 2. Узнать публичный IP:
curl ifconfig.me
curl ipinfo.io
# Сравнить с локальным -- увидите, как ваш приватный IP скрывается за NAT провайдера
# 3. Преобразовать IP в число и обратно (Python):
python3 -c "import ipaddress; print(int(ipaddress.IPv4Address('192.168.1.1')))"
# 3232235777
python3 -c "import ipaddress; print(ipaddress.IPv4Address(3232235777))"
# 192.168.1.1
# 4. Глянуть на класс адреса (исторический):
# 10.X.X.X = class A приватный
# 172.16.0.0 = class B приватный
# 192.168.0.0 = class C приватный
# 8.8.8.8 = class A публичный (Google DNS)
# 5. Узнать, кому принадлежит публичный IP (через whois):
whois 93.184.216.34
# увидите info о Edgecast/Verizon
# 6. Сколько уникальных адресов в /8?
python3 -c "print(2**24)"
# 16777216 -- ~16 миллионов
# 7. Сколько вообще IPv4-адресов?
python3 -c "print(2**32)"
# 4294967296 -- 4.3 миллиарда
Запомните: whois 8.8.8.8 сразу показывает, что это Google. Это полезно при дебаге — видишь незнакомый IP в логах, делаешь whois, понимаешь к кому он принадлежит.
Docker VPC и приватные IP-диапазоны: 172.17/16 в действии Kubernetes pod CIDR: приватные IP для каждого pod