Когда мы разбирали слои сети, было два ключевых уровня: сетевой, где живёт IP, и транспортный, где живут порты. Теперь спустимся к ним вплотную и разберёмся с самым практическим вопросом: как вообще пакет находит нужную машину в интернете, а на этой машине — нужный сервис. Ответ складывается из трёх вещей — IP-адреса, порта и хитрости под названием NAT, которая позволяет целой сети прятаться за одним внешним адресом.

Это ровно те понятия, о которые backend-разработчик спотыкается каждый день: сервис не хочет слушать снаружи, «port already in use», под в Kubernetes получил какой-то странный адрес. Разберёмся по порядку.

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

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

Самый привычный вид — IPv4: четыре числа от 0 до 255 через точку, например 192.168.1.10. Каждое число — это один байт, всего четыре байта, то есть примерно четыре миллиарда возможных адресов. Звучит много, но интернет давно перерос эту цифру — устройств в мире куда больше.

Именно поэтому появился IPv6: адреса вида 2001:0db8:85a3::8a2e:0370:7334, длиннее и записанные шестнадцатеричными группами через двоеточие. Их запас практически неисчерпаем. IPv6 медленно вытесняет IPv4, но на практике вы ещё долго будете встречать оба, и IPv4 остаётся тем, с чем сталкиваешься чаще всего. Дальше в статье примеры будут на IPv4 — с IPv6 логика ровно та же, отличается только запись адреса.

Приватные и публичные адреса

Не все адреса одинаковы. Есть публичные — уникальные во всём интернете, по ним машину видно снаружи. И есть приватные — специально зарезервированные диапазоны, которые используются только внутри локальных сетей и в интернете не маршрутизируются.

Приватных диапазонов три, их полезно узнавать в лицо:

10.0.0.0    – 10.255.255.255     (10.x.x.x)
172.16.0.0  – 172.31.255.255     (172.16.x – 172.31.x)
192.168.0.0 – 192.168.255.255    (192.168.x.x)

Если вы видите адрес, начинающийся на 192.168. или 10. — это почти наверняка внутренняя сеть: домашний роутер, офис, кластер контейнеров. Ваш ноутбук дома получил от роутера что-то вроде 192.168.1.42 — это приватный адрес, снаружи по нему до вас не достучаться. А вот у роутера есть один публичный адрес, выданный провайдером, и именно он виден всему интернету.

Такое разделение экономит дефицитные публичные адреса: тысячи устройств внутри сети обходятся приватными адресами, а наружу выходят через один общий публичный. Как именно — разберём в разделе про NAT.

Маска и подсеть на пальцах

Раз есть приватные сети, нужен способ сказать, где заканчивается «моя» сеть и начинается остальной мир. Для этого служит маска подсети.

Проще всего думать так: адрес делится на две части — «номер сети» и «номер устройства в этой сети». Маска говорит, где проходит граница. Запись 192.168.1.0/24 означает: первые 24 бита (то есть 192.168.1) — это номер сети, а последний байт — номера устройств. Значит, в этой сети живут адреса от 192.168.1.1 до 192.168.1.254, и все они — «соседи», которые общаются напрямую.

192.168.1.0/24
└─ сеть ─┘└─┘ устройства (1..254)

Практический смысл простой: устройства из одной подсети видят друг друга напрямую, а чтобы достучаться до другой подсети или до интернета, пакет идёт через шлюз (обычно роутер). Число после слэша (/24, /16) — это просто размер сети: чем меньше число, тем больше адресов помещается.

Что такое порт

IP-адрес приводит пакет к машине. Но на одной машине крутится куча программ одновременно: веб-сервер, база данных, SSH. Кому из них отдать пришедший пакет? Вот тут и нужен порт.

Порт — это число от 0 до 65535, которое указывает на конкретный сервис на машине. Если IP — это адрес дома, то порт — номер квартиры. Пакет с адресом 192.168.1.10:443 означает «дом 192.168.1.10, квартира 443».

Часть портов закреплена по договорённости за стандартными сервисами — их называют well-known:

80    – HTTP
443   – HTTPS
5432  – PostgreSQL
6379  – Redis
22    – SSH

Поэтому в браузере достаточно написать https://example.com — порт 443 подставляется автоматически, все знают, что HTTPS живёт там.

А когда ваш сервис сам подключается куда-то как клиент, ему тоже нужен порт — но конкретный номер не важен, поэтому операционная система выдаёт первый свободный из высокого диапазона (примерно 49152–65535). Такие временные порты называют эфемерными: соединение закрылось — порт вернулся в общий котёл.

Сокет: полный адрес сервиса

Соединив адрес и порт, получаем сокет — полный адрес конкретного сервиса: IP:порт. Именно пара 192.168.1.10:5432 однозначно указывает «PostgreSQL вот на этой машине». Только IP мало (непонятно, какой сервис), только порт мало (непонятно, на какой машине) — нужны оба.

Отдельно стоит запомнить localhost и его адрес 127.0.0.1. Это специальный адрес «сам себя»: пакет на 127.0.0.1 никуда не уходит по сети, а возвращается той же машине. Удобно для локальной разработки — база на localhost:5432 означает «PostgreSQL прямо на моём компьютере».

NAT: как за одним адресом прячется целая сеть

Вернёмся к загадке: дома у вас десять устройств с приватными адресами 192.168.1.x, а публичный адрес от провайдера — один. Как они все выходят в интернет через него?

Механизм называется NAT (Network Address Translation) — трансляция адресов. Роутер, когда пакет от вашего ноутбука уходит наружу, подменяет приватный адрес отправителя на свой единственный публичный и запоминает в табличке: «ответ на этот разговор надо вернуть ноутбуку». Когда приходит ответ — роутер смотрит в табличку и разворачивает подмену обратно.

ноутбук  192.168.1.42 ─┐
телефон  192.168.1.43 ─┼─[ роутер / NAT ]─→ интернет (один публичный IP)
телевизор 192.168.1.44 ─┘

Снаружи весь ваш дом выглядит как один адрес. NAT — это то, что позволило IPv4 дожить до сегодня, несмотря на дефицит адресов. Побочный эффект: устройство за NAT само по себе недоступно снаружи — к нему нельзя подключиться извне, пока оно первым не начало разговор. Именно поэтому домашний компьютер не торчит в интернете открытым, а чтобы сервис был доступен снаружи, его размещают на машине с публичным адресом.

Где это применяется

Для backend всё это — не теория, а ежедневные грабли и решения.

  • 0.0.0.0 против 127.0.0.1 при запуске сервиса. Когда сервис слушает 127.0.0.1:8080, к нему можно подключиться только с той же машины — снаружи и из других контейнеров он невидим. Чтобы принимать соединения отовсюду, сервис слушает 0.0.0.0:8080 («все сетевые интерфейсы»). Классическая ошибка новичка: сервис в контейнере слушает 127.0.0.1, а снаружи к нему не достучаться — потому что для внешнего мира это «сам себя» внутри контейнера.
  • «Port already in use». Один порт на машине может слушать только один процесс. Если при запуске сервиса вылезает Address already in use: 8080, значит порт уже занят — другим экземпляром вашего же приложения, забытым процессом или чем-то ещё. Лечится сменой порта или остановкой того, кто его держит.
  • IP пода в Kubernetes. В кластере каждый под получает свой приватный IP из внутренней подсети — эфемерный: под пересоздался, адрес сменился. Поэтому обращаться к поду напрямую по IP нельзя, для этого есть стабильные имена сервисов, за которыми прячется меняющийся набор адресов. Про это — раздел Kubernetes и статья про балансировщики.

Где спотыкаются начинающие:

  • Путают IP-адрес и порт. IP приводит к машине, порт — к сервису на ней. «Не могу подключиться» — всегда стоит уточнить, что именно неверно: адрес машины или номер порта.
  • Слушают 127.0.0.1 там, где нужно 0.0.0.0. Сервис вроде запущен, но снаружи или из соседнего контейнера недоступен — почти всегда дело в этом.
  • Думают, что приватный адрес виден из интернета. По 192.168.x.x или 10.x.x.x снаружи достучаться нельзя — это внутренние сети, спрятанные за NAT.
  • Считают IP пода постоянным. В Kubernetes адрес пода живёт ровно до пересоздания — привязываться к нему нельзя.

Что учить дальше

Теперь, когда понятно, как пакет находит машину и сервис, логично разобраться, как между ними устанавливается сам разговор. Дальше — TCP и UDP: чем надёжное соединение отличается от «выстрелил и забыл», и когда какой протокол выбирают. Оттуда — к жизненному циклу соединения: как соединение открывается, живёт и закрывается, и почему их держат в пуле. А чтобы не запоминать адреса руками, есть DNS — система, которая превращает имена вроде example.com в IP-адреса. В облаке те же приватные сети и NAT собираются в целую сетевую инфраструктуру.