Адрес получен. Браузер знает четыре числа и хочет отправить по ним запрос. Между ним и сервером — домашний роутер, провайдер, магистральные операторы и дата-центр, и никто из них не знает маршрута целиком. Каждый узел решает только одно: кому передать пакет дальше. Посмотрим, как это выглядит, и научимся читать вывод трассировки, который часто пугает зря.
Это четвёртая часть цикла «Что происходит, когда открываешь сайт».
Конверт в конверте
Запрос браузера по дороге упаковывается слоями, как письмо в несколько конвертов. Каждый слой решает свою задачу и не заглядывает внутрь соседнего:
- 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., домашний сервер без белого адреса от провайдера или внешнего посредника не заработает.
Что проверить своими руками
mtr -r -c 10 ваш-сайтиз дома и с сервера в другой сети. Сравните последнюю строку;- потери на промежуточном узле игнорируйте, если на последнем их нет;
- найдите прыжок задержки — там и проходит длинный участок пути;
- посмотрите WAN-адрес роутера: если он серый, вы за CGNAT.
Сайт тормозит только у части посетителей?
Пришлите трассировку от них и от себя — покажу, на каком участке теряется время.
// загружаю комментарии…