SkillGridИзучай computer science на практике

Куда на самом деле уходят миллисекунды

Распространение, передача, очереди и круговые задержки: почему запрос на другую сторону планеты не может быть быстрым и почему переиспользование соединения и CDN стоят так дорого.

15 мин · 50 XP

Задержка это не одно число, а сумма четырёх разных задержек, и ведут они себя совершенно по-разному. Задержка распространения — время, за которое сигнал проходит расстояние, и её задаёт скорость света в среде. Задержка передачи — время вытолкнуть все биты одного пакета в линию, её задают скорость линии и размер пакета. Задержка в очереди — время ожидания пакета в буфере за другими пакетами, её задаёт текущая загрузка сети. Задержка обработки — крошечное время, которое маршрутизатор тратит на просмотр заголовка и выбор выхода. Только две из четырёх предсказуемо уменьшаются от денег, а самая большая не уменьшается вообще.

London to New York        5 550 km    one way
speed in fibre           200 000 km/s
one way delay            27.8 ms
minimum round trip       55.5 msТот же расчёт для любой пары городов: расстояние, расстояние, расстояние.

Свет в вакууме проходит 300 000 км в секунду. В сердцевине оптического волокна показатель преломления около 1.47, поэтому сигнал идёт примерно 200 000 км в секунду, то есть две трети от этой величины. Это не ограничение оборудования, а свойство стекла, и никакая инженерия его не убирает. Каждый километр стоит около 0.005 мс в одну сторону, а поскольку разговор требует ответа, он стоит около 0.01 мс на километр в обе стороны. Это число и есть нижняя граница для любой сети в мире.

Задержка передачи зависит от того, сколько бит вы отправляете и насколько быстрая линия, и больше ни от чего. Кадр Ethernet максимального размера это 1500 байт, то есть 12 000 бит. На линии 1 Гбит/с он выкладывается за 0.012 мс, на линии 100 Мбит/с ровно в десять раз дольше. Обратите внимание, что это значит: для одного небольшого пакета скорость линии почти не важна рядом с переходом через океан за 50 мс. Полоса решает, сколько времени займёт большая передача, а не сколько займёт один запрос.

1500 bytes = 12 000 bits

1 Gbit/s    serialisation  0.012 ms
100 Mbit/s  serialisation  0.120 msДвенадцать тысяч бит, две очень разные линии.

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

Очередь — единственная из четырёх задержек, которая действительно непредсказуема, и именно из-за неё два одинаковых запроса занимают разное время. Когда линия почти свободна, пакет не ждёт ничего. Когда линия загружена, пакеты выстраиваются в буфере, и ожидание может быть микросекундами или сотнями миллисекунд в зависимости от трафика, которым вы не управляете. Когда буфер переполняется, пакеты теряются, а для TCP это повторная передача, то есть как минимум ещё один круговой обход. Поэтому линия может выглядеть быстрой на тесте в три ночи и медленной на видеозвонке в восемь вечера.

Человек чувствует круговые задержки, а не односторонние, потому что почти все протоколы это разговор. Запрос к DNS — один обход, открытие TCP-соединения — ещё один, рукопожатие TLS на новом соединении — ещё один или два, и только потом уходит запрос страницы. Поэтому открытие страницы на холодном соединении оплачивает три или четыре круговых обхода прежде, чем придёт первый полезный байт, и каждый из них стоит полного расстояния до сервера и обратно.

$ curl -w "dns %{time_namelookup} connect %{time_connect} tls %{time_appconnect} total %{time_total}\n" -o /dev/null -s https://example.org
dns 0.004 connect 0.058 tls 0.117 total 0.171

$ curl -o /dev/null -s -w "total %{time_total}\n" https://example.org
$ curl -o /dev/null -s -w "total %{time_total}\n" https://example.org
total 0.171
total 0.062Замер фаз настоящего запроса и повторный замер на переиспользованном соединении.

Поэтому переиспользование соединения это не оптимизация, а главное событие. Открытое соединение позволяет клиенту полностью пропустить рукопожатия TCP и TLS для следующего запроса, превращая загрузку страницы за 170 мс в 60 мс через океан. Поэтому же HTTPS дороже HTTP на холодном соединении и почти ничего не стоит на тёплом, и поэтому сервер, который слишком охотно закрывает простаивающие соединения, делает всё вокруг медленнее.

Единственный настоящий ответ на задержку распространения — сократить расстояние. CDN держит копии контента во множестве мест и отвечает каждому пользователю из ближайшего, поэтому запрос, который раньше перелетал океан, теперь пересекает город. Это не помогает с динамическими данными, которые обязаны считаться в одном конкретном месте, и не ускоряет первое соединение с холодным кэшем. Зато превращает задачу физики в задачу логистики, а логистика решается.

Практика

  1. Два сервера стоят в 12 000 км друг от друга и соединены прямым волокном. Если пренебречь всеми задержками оборудования, каково минимальное время кругового обхода между ними?

    Подсказки
    • Переведите расстояние во время дважды: один раз туда, один раз обратно.
    • Каждые 1 000 км стоят около 5 мс в одну сторону при 200 000 км/с, и ответ платит ту же цену ещё раз.
  2. Сопоставьте каждый вид задержки с тем, что на самом деле определяет её величину.

    Подсказки
    • Сначала отсортируйте по тому, что допускает физика: уменьшается при расширении линии только одна из этих задержек.
    • Задержка в очереди — та, что зависит от того, насколько сеть загружена именно в эту секунду.
    • Обновление линии с 100 Мбит/с до 1 Гбит/с не меняет вообще ничего в задержке, которую определяет одно лишь расстояние.
  3. Страница на сервере в 12 000 км грузится за 170 мс на холодном кэше браузера и за 62 мс при перезагрузке. Куда делись остальные 108 мс?

    Подсказки
    • Посчитайте, что обязано произойти в сети прежде, чем можно будет прочитать первый байт тела ответа.
    • Новое TCP-соединение плюс полное рукопожатие TLS это два лишних круговых обхода сверх самого запроса.
    • Уже открытое соединение пропускает оба рукопожатия целиком.

Вопросы по этому уроку

Зачем вообще учить сети?

Почти всё, что ты делаешь, в итоге с чем-то общается. Понимание того, как данные реально ходят, превращает «не работает» из загадки в список того, что можно проверить по очереди.

В чём реальная разница между TCP и UDP?

TCP следит, чтобы всё дошло и по порядку, и повторяет потерянное — за это платит временем. UDP отправляет и не оглядывается, поэтому видеозвонки и игры предпочитают его: опоздавший кадр хуже пропавшего.

Что такое DNS простыми словами?

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

Это бесплатно?

Да. Первый уровень каждого предмета бесплатный и не требует аккаунта. Дальше уровни и старшие грейды платные — именно это позволяет проекту существовать.

На какой возраст рассчитано?

Для любознательных подростков примерно с 12 лет и для взрослых, начинающих с нуля. Опыт программирования не предполагается: уроки по сетям и физике не требуют математики сверх школьной.

Нужно ли уже уметь программировать?

Нет. Логика, физика и сети начинаются с нуля. Код ты пишешь в разделе языков — и он тоже начинается с самого начала.

Нужно что-то устанавливать?

Нет. Всё работает в браузере: теория, практика и интерактивные симуляции. Скачивать нечего и настраивать нечего.

Сколько времени занимает один предмет?

Урок — от 10 до 15 минут. Грейд «джун» это примерно 12–20 уроков, то есть несколько недель регулярных занятий, а не один вечер.

Обязательно идти по порядку?

Внутри грейда уровни открываются по очереди: каждый опирается на предыдущий. А между предметами ты свободен — начинай с логики, физики или сетей.