Всё, что мы разбирали до сих пор, работало с адресами: 203.0.113.10. Люди адресами не пользуются, они набирают www.example.com. Кто-то должен перевести одно в другое, и это DNS — Domain Name System, RFC 1034 и 1035, 1987 год. DNS — первое, что делает браузер при открытии страницы, первое, что ломается при неправильной настройке сети, и самая большая распределённая база данных в мире: несколько сотен миллионов имён, ни одного центрального сервера, и ответ за десятки миллисекунд из любой точки планеты.
Как в прошлых частях, нас интересует не «DNS превращает имена в адреса», а как именно: кто хранит, кто спрашивает, что едет в пакете.
Во всех предыдущих частях у хоста уже был адрес 192.168.1.10, маска /24, шлюз 192.168.1.1 и адрес DNS-сервера. Откуда? В пятой части мы видели, что всё это можно задать руками, и в серверных сетях так и делают. Но ноутбук, который утром в офисе, днём в кафе, а вечером дома, руками не настроишь: в каждой сети у него должен быть свой адрес из её диапазона и её шлюз. Эту работу делает DHCP — Dynamic Host Configuration Protocol, RFC 2131. Он же причина, по которой домашняя сеть «просто работает»: роутер раздаёт адреса, а вы об этом не думаете.
Задача выглядит парадоксально: чтобы получить адрес, нужно отправить запрос, а отправить IP-пакет без адреса нельзя. Посмотрим, как это обходят.
На этой неделе я включил HTTP/3 на Traefik в своём кластере, и по дороге пришлось заново разложить в голове, чем три живущие одновременно версии HTTP отличаются друг от друга и зачем вообще нужна третья, если вторая появилась десять лет назад. Это та самая раскладка: как устроена каждая версия, какую проблему предыдущей она решает, когда одна быстрее другой, как всё это настраивается в Traefik и на какие грабли я наступил или успел заметить заранее.
Статья самостоятельная, но опирается на две части серии «Сети для самых маленьких»: про UDP и про TCP. Там подробно про соединения, потери и окна; здесь будем на них ссылаться.
В девятой части UDP добавил к IP только порты и ничего больше: пакет либо дошёл, либо нет. Для большинства приложений этого мало. Файл должен прийти целиком, байты — в том порядке, в котором отправлены, и отправитель не должен заваливать получателя и сеть быстрее, чем они справляются. Всё это делает TCP, Transmission Control Protocol, RFC 793 (сейчас — RFC 9293), и делает поверх того же ненадёжного IP, который теряет, дублирует и переставляет пакеты.
Разговор будет долгим, потому что TCP — это не формат, а алгоритм: набор правил, по которым две стороны договариваются, нумеруют байты, подтверждают, повторяют и притормаживают. Пойдём по жизни соединения: заголовок, установление, передача, надёжность, скорость, закрытие — и в конце посмотрим на всё это в одном захвате.
За восемь частей мы научились доставлять пакет от машины к машине: Ethernet до соседа, IP через роутеры, ARP для перевода адресов и ICMP для сообщений об ошибках. Пакет пришёл на машину с нужным IP-адресом. А дальше кому? На машине десятки программ, и IP ничего о них не знает: в его заголовке есть поле Protocol, но оно скажет только «внутри UDP» или «внутри TCP».
Транспортный уровень решает ровно эту задачу — доставить данные не машине, а процессу на ней, — и, если нужно, добавляет то, чего у IP нет: надёжность, порядок, управление скоростью. В интернете два транспорта. Начнём с того, который добавляет к IP самый минимум: UDP, User Datagram Protocol, RFC 768. Весь стандарт — две страницы 1980 года.
В шестой части роутер несколько раз выбрасывал пакет и сообщал об этом отправителю: когда TTL дошёл до нуля, когда не нашлось маршрута, когда пакет с флагом DF не влез в MTU. IP сам по себе ничего сообщить не может: в его заголовке нет места для ошибок, а роутер не хранит состояния. Для этого рядом с IP с самого начала живёт второй протокол — ICMP, Internet Control Message Protocol (RFC 792). Он же под капотом у двух самых известных сетевых команд, ping и traceroute, и он же — причина половины загадочных проблем вида «пинг ходит, а сайт не открывается».
В пятой части хост решал, сосед перед ним или нужен шлюз, а в шестой роутер на каждом хопе упаковывал пакет в новый кадр с MAC-адресом следующего роутера. В обоих случаях мы молча предполагали, что MAC-адрес соседа откуда-то известен. Но в пакете есть только IP-адрес назначения, а кадру Ethernet нужен MAC. Кто-то должен перевести одно в другое. Это делает ARP — Address Resolution Protocol, RFC 826, один из самых старых и самых простых протоколов стека, и при этом один из самых важных: без него ни один пакет не покинет машину.
В пятой части мы разобрали адреса и маски и дошли до момента, когда хост решает: сосед или шлюз. Если шлюз — пакет уезжает роутеру, и дальше начинается то, ради чего сетевой уровень существует: маршрутизация, передача пакета от сети к сети, пока он не окажется в сегменте получателя. Сегодня — что роутер при этом читает в пакете, как выбирает путь и что меняет, что происходит с пакетом, который не влезает в кадр, и как домашний роутер прячет всю квартиру за одним адресом.
Четыре предыдущие части были про канальный уровень: Ethernet, Wi-Fi и PPPoE умеют доставить кадр соседу — устройству на том же кабеле, в той же радиосети, на другом конце той же линии. Дальше соседа канальный уровень не видит: MAC-адрес ничего не говорит о том, где машина находится, и коммутатор с миллиардом адресов в таблице не построить.
Сетевой уровень добавляет две вещи: адрес, по которому можно понять, где машина, и маршрутизацию — передачу пакета от сети к сети через цепочку роутеров. Протокол сетевого уровня в интернете — IP, Internet Protocol, и его четвёртая версия, IPv4 (RFC 791, 1981 год), до сих пор несёт большую часть трафика. Сегодня — только про адреса: как они устроены, как считаются подсети и как машина по адресу принимает своё первое решение. Заголовок пакета, маршрутизация и NAT — в следующей части.
В первой части канальный уровень был просто «доставить соседу», во второй и третьей мы увидели, как это делают Ethernet и Wi-Fi. Сегодня — протокол, который сидит между Ethernet и IP и встречается почти в каждом домашнем роутере: PPPoE, Point-to-Point Protocol over Ethernet. В настройках роутера это тот самый пункт «Тип подключения: PPPoE», рядом с которым вводят логин и пароль от провайдера.
Чтобы понять PPPoE, нужно понять две вещи: что такое PPP и зачем его понадобилось заворачивать в Ethernet.