Адрес получен. Браузер знает четыре числа и хочет отправить по ним запрос. Между ним и сервером — домашний роутер, провайдер, магистральные операторы и дата-центр, и никто из них не знает маршрута целиком. Каждый узел решает только одно: кому передать пакет дальше. Посмотрим, как это выглядит, и научимся читать вывод трассировки, который часто пугает зря.

Это четвёртая часть цикла «Что происходит, когда открываешь сайт».

Конверт в конверте

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

кадр Ethernet / Wi-Fi — MAC роутера, меняется на каждом участке IP: откуда 198.51.100.10 → куда 203.0.113.22 TCP: порт 50574 → порт 443, номера байтов, подтверждения TLS: зашифровано, снаружи видна только длина HTTP: GET /blog/ Host: alekseychikun.ru
IP-адрес везёт пакет до машины, порт — до программы на ней, TCP следит, чтобы ничего не потерялось.
  • IP — адрес машины. По нему узлы решают, куда отправить пакет;
  • порт — номер программы на этой машине. 443 — веб-сервер с HTTPS, 80 — без шифрования, 22 — SSH. Порт браузера выбирается случайно из свободных: в нашем захвате это был 50574;
  • TCP — нумерует байты и требует подтверждения, поэтому потерянное перешлют, а перепутанное соберут в правильном порядке (подробно в следующей части);
  • канальный уровень — MAC-адреса, по ним пакет идёт до ближайшего соседа. Этот «внешний конверт» заменяется на каждом участке пути, внутренние слои едут без изменений.

Посмотреть путь

mtr — это traceroute и ping в одном: он показывает каждый узел по дороге и сколько до него идёт ответ. Тот же сервер в дата-центре, тот же сайт:

$ mtr -n -r -c 5 alekseychikun.ru
 HOST                Loss%   Snt   Last   Avg  Best  Wrst
  1.|-- 100.100.1.1     0.0%     5    0.2   0.2   0.1   0.2
  2.|-- 100.88.255.254  0.0%     5    1.0   1.1   1.0   1.4
  3.|-- 10.255.254.149  0.0%     5    0.8   1.0   0.7   2.1
  4.|-- ???            100.0     5    0.0   0.0   0.0   0.0
  5.|-- 10.255.200.232  0.0%     5    8.3   8.3   8.2   8.3
  6.|-- 185.0.14.61     0.0%     5   26.5  26.6  26.5  26.7
  7.|-- 10.29.134.254   0.0%     5   26.5  26.6  26.5  26.8
  8.|-- ???            100.0     5    0.0   0.0   0.0   0.0
  …
 12.|-- 203.0.113.22    0.0%     5   28.2  28.4  28.2  28.5

Как это читать

Строки «???» со 100% потерь — не потери. Трассировка работает так: отправляет пакеты с маленьким сроком жизни (TTL — тот же термин, что в DNS, но здесь это число узлов), и каждый узел, на котором срок кончился, обязан вернуть уведомление. Многие роутеры магистралей эти уведомления не отправляют или режут по скорости. Пакеты через них при этом проходят: последний узел отвечает без единой потери. Смотреть надо на последнюю строку. Потери, которые начинаются на каком-то узле и тянутся до конца, — настоящие. Потери на одном узле посередине — нет.

Задержка растёт скачками, а не плавно. Первые пять узлов — рядом с сервером-отправителем, до них от 0,2 до 8 мс. Потом прыжок с 8 до 26 мс на шестом узле: это длинный магистральный участок, и именно он и есть «расстояние» до сайта. Дальше ещё 2 мс до цели. Почти вся сетевая задержка набирается на одном-двух участках.

Серые адреса посередине — норма. 10.x.x.x и 100.64–127.x.x не маршрутизируются в интернете, и операторы используют их внутри своих сетей. Видеть их в трассировке — нормально.

Итог трассировки — 28 мс до сайта. Это ровно то время, которое в первой части заняло открытие TCP-соединения: один круг туда и обратно. Сеть ведёт себя предсказуемо, и по трассировке это видно сразу.

Домашний NAT: много устройств, один адрес

Дома у телефона, ноутбука и телевизора адреса вида 192.168.1.x. В интернет все они выходят под одним внешним адресом роутера. Роутер запоминает, какое устройство с какого порта начало соединение, и подменяет адрес и порт в каждом пакете туда и обратно. Это NAT.

Следствие: снаружи к домашнему устройству соединение начать нельзя — роутер не знает, кому его отдать. Чтобы домашний сервер был доступен из интернета, на роутере вручную пробрасывают порт: «всё, что пришло на 443, отдавай машине 192.168.1.10».

Многие провайдеры сегодня ставят ещё один NAT у себя — CGNAT, адреса из диапазона 100.64.0.0/10. Тогда «внешний» адрес вашего роутера тоже серый, и проброс порта на нём ничего не даст: снаружи до вас не достучаться в принципе. Если на роутере WAN-адрес начинается со 100.64–100.127 или с 10., домашний сервер без белого адреса от провайдера или внешнего посредника не заработает.

Что проверить своими руками

  1. mtr -r -c 10 ваш-сайт из дома и с сервера в другой сети. Сравните последнюю строку;
  2. потери на промежуточном узле игнорируйте, если на последнем их нет;
  3. найдите прыжок задержки — там и проходит длинный участок пути;
  4. посмотрите WAN-адрес роутера: если он серый, вы за CGNAT.

Сайт тормозит только у части посетителей?

Пришлите трассировку от них и от себя — покажу, на каком участке теряется время.

· полезно?
АЧ
Алексей Чикун веб-разработчик, команда TRIOHEAD

Делаю сайты и сервисы целиком: от вёрстки до сервера. Пишу о том, что проверил на своих проектах.

Комментарии

// загружаю комментарии…

Комментарии публикуются после проверки. Ссылки и HTML не принимаются.