Circuit switching vs packet switching — почему Internet packet-switched
В предыдущем уроке мы упомянули, что одна из главных инноваций ARPANET — переход от circuit switching к packet switching. Это фундаментальный выбор, который определяет, как работает Internet до сих пор. И это выбор, который не очевиден — circuit switching работает в телефонной сети уже 150 лет и имеет свои достоинства.
В этом уроке разберём оба подхода глубоко: как они работают физически, что у них хорошо, что плохо, почему Internet выбрал packet switching, и где circuit switching всё ещё применяется (спойлер: даже в Internet есть слои, которые работают по принципу circuit switching).
Circuit switching — классическая телефонная модель
Circuit switching работает так: перед началом обмена данными устанавливается физический или логический канал (circuit) между двумя сторонами. По этому каналу идут все данные, в строгом порядке. После окончания обмена канал освобождается.
Главная особенность circuit switching — ресурсы выделены под одну связь. Если вы установили канал, но не передаёте данные (молчите в трубку), канал всё равно занят. Никто другой не может использовать освободившуюся bandwidth.
Это даёт две хороших вещи:
- Гарантированная производительность. Если канал установлен — он ваш на все 100%. Никаких внезапных просадок из-за чужого трафика.
- Низкая постоянная latency. Данные идут по фиксированному пути. Все элементы заранее знают, как обрабатывать пакет. Это критично для голоса.
И две плохих:
- Расточительность. Если канал занят, но не используется — это потери. В голосовом разговоре говорят попеременно, половина времени канал простаивает.
- Плохая отказоустойчивость. Если один из элементов на пути падает — весь канал рвётся. Нужно устанавливать заново.
Packet switching — модель Internet
Packet switching работает иначе. Никаких заранее установленных каналов. Данные разбиваются на пакеты, каждый из которых имеет адрес получателя и сам находит путь через сеть. Каждый промежуточный узел смотрит на адрес и решает, куда отправлять дальше.
В packet switching нет фазы setup. Вы просто шлёте пакет, и он идёт. Никаких резерваций. Это даёт фундаментально другие свойства:
- Эффективное использование канала. Линки общие для всех. Если один пользователь не передаёт — его слот занимает другой. На больших масштабах статистическое мультиплексирование (statistical multiplexing) даёт огромную экономию.
- Отказоустойчивость. Если один router падает — пакеты идут другим путём. Никаких разорванных связей (на уровне сети). Это и было главным военным требованием ARPANET.
- Простота добавления узлов. Подключился новый router — сразу можно слать пакеты через него. Никакой глобальной переконфигурации.
И платим за это:
- Переменная latency. Каждый пакет идёт своим путём, через разное количество routers. Возможны просадки.
- Возможные потери. Если router перегружен — он дропает пакеты. Получатель сам должен заметить и переспросить (TCP) или принять как есть (UDP).
- Порядок может нарушаться. Если пакет N+1 пошёл быстрее N — придёт раньше. TCP пересортирует, UDP — нет.
Statistical multiplexing — ключевая идея packet switching
Чтобы понять, почему packet switching экономичнее, нужно понять статистическое мультиплексирование.
Пример. У вас есть 10 пользователей, которым нужно по 100 Мбит/с peak bandwidth. В circuit switching вы должны выделить им 10 каналов по 100 Мбит/с = 1 Гбит/с infrastructure. Постоянно занятых, независимо от того, используют они их или нет.
В packet switching вы можете дать им общую инфраструктуру на 200-300 Мбит/с. Почему: в реальности они не используют peak одновременно. Когда один смотрит видео (100 Мбит/с), другие читают почту (1 Мбит/с) или вообще ничего не делают. Среднее ниже peak, и инфраструктура шарится.
Статистическое мультиплексирование работает потому, что трафик пользователей независим и burst’оват. Никто не качает на peak 24/7. Есть пики и спады. Если у вас много пользователей — пики усредняются, и инфраструктура работает близко к среднему. Это закон больших чисел.
Это объясняет, почему интернет относительно дёшев. Если бы каждое HTTP-соединение требовало отдельного гарантированного канала — стоимость провайдеров была бы в 10 раз выше. Packet switching сделал интернет economically viable.
Когда плохой Wi-Fi — это packet switching
Вы замечали, что в плохом Wi-Fi видеосвязь дёргается, а скачивание файла идёт нормально, просто медленно? Это типичное проявление packet switching на проблемном link.
Файл скачивается через TCP. Если пакет потерян — TCP его перешлёт. Скорость снижается, но файл всё равно прибывает целиком. Качество = скорость * время, и время может быть дольше.
Видеосвязь — через UDP (или QUIC). Если пакет потерян — видео пропускает кадр, голос пропускает слог. TCP не успел бы переслать — видео реального времени, retransmission слишком долгий. Качество = чёткая картинка минус потери.
# Проверить, какой у вас packet loss до google.com
ping -c 100 google.com | tail -3
# Увидите что-то вроде: 100 packets transmitted, 99 received, 1% packet loss
# 1% -- это нормально для Wi-Fi и не страшно для большинства приложений
# 5%+ -- проблема, видеосвязь будет рваться
# Более продвинутая диагностика:
mtr -c 100 -r google.com
# Покажет packet loss по каждому hop'у на пути.
# Можно увидеть, где именно потери появляются
В circuit switching такого не было бы. Канал либо установлен (никаких потерь), либо разорван (всё прервалось). Packet switching мягче деградирует: качество плавно ухудшается с проблемами сети.
Гибрид: virtual circuits
В реальном мире не всё чёрно-белое. Между circuit switching и packet switching есть промежуточные варианты. Самый известный — virtual circuits.
Virtual circuit — это «иллюзия канала» поверх packet switching сети. Технически данные идут пакетами, но для приложения это выглядит как стабильный канал с фиксированной маршрутизацией. Примеры:
TCP — особенно интересный случай. С точки зрения приложения вы открываете «connection», шлёте данные, закрываете «connection». Это абстракция virtual circuit. Под капотом TCP делает sequence numbers, ACKs, retransmissions — но это скрыто от вас. Получаете «иллюзию» гарантированного канала поверх unreliable IP.
Поэтому многие фразы вроде «TCP connection» технически неточны — никакого реального соединения нет, есть state на двух endpoint’ах, которые координируются через пакеты. Но абстракция настолько полезна, что мы пользуемся ей повсеместно.
Где circuit switching сегодня
Хотя Internet — packet switching, circuit switching не исчез полностью. Где он есть:
- Внутри телефонных сетей (PSTN). Старая телефонная инфраструктура до сих пор работает на TDM (Time Division Multiplexing) — разновидность circuit switching. Хотя VoIP постепенно заменяет.
- Радиорелейные линии и оптика на дальние расстояния. Между дата-центрами провайдеров часто DWDM (Dense Wavelength Division Multiplexing) — разные длины волн как «каналы».
- 5G сети. Хотя в основе IP, в 5G есть concept «slices» — виртуальные каналы с QoS-гарантиями для разных применений (видео vs IoT vs autonomous cars).
- Финансовые торговые системы. Low-latency trading использует direct fiber links между биржами с гарантированными ресурсами.
Так что не списывайте circuit switching как анахронизм. В некоторых применениях гарантии важнее эффективности.
Сравнительная таблица
В большинстве задач, с которыми вы будете работать, packet switching — это всё, что вам нужно. Когда читаете «TCP connection», «UDP datagram», «IP packet» — все это понятия packet switching. Когда видите «leased line», «dedicated circuit», «MPLS VPN» — это circuit или virtual circuit.
Попробуй сам
Эти эксперименты показывают, что packet switching реально работает в вашей сети.
# 1. Каждое выполнение traceroute может показать разный путь
# (если есть load balancing на пути)
traceroute google.com
sleep 5
traceroute google.com
# Сравните -- могут отличаться промежуточные hops
# 2. Запустите большой ping подсчёт пакетов
ping -c 50 google.com | tail -3
# Statistics в конце: какой % пакетов дошёл, min/avg/max RTT
# Variation в RTT -- характерная черта packet switching
# 3. mtr -- лучшая диагностика для packet switching
mtr -c 100 -r google.com
# Покажет таблицу: hop, % loss, avg RTT, jitter
# Видите, как RTT колеблется -- statistical multiplexing в действии
# 4. Захватите 100 пакетов на интерфейсе
sudo tcpdump -i en0 -c 100 -n
# Каждая строка -- один пакет, который идёт через ваш интерфейс
# Видно, что трафик разнообразный: разные dst адреса, протоколы
Обратите внимание: даже когда вы «ничего не делаете», ваш ноутбук генерирует пакеты. Облачные синки, обновления приложений, OS-фоновые проверки — всё это пакеты, разделяющие ваш Wi-Fi link с другими устройствами в доме. Это и есть statistical multiplexing.
Kafka и packet switching: асинхронная доставка на больших масштабах