Зачем нужен ещё один адрес
MAC-адреса прекрасно работают внутри одного сегмента, но для интернета у них фатальный недостаток: в них нет структуры. По MAC невозможно понять, где находится устройство, — это просто номер, выданный на заводе, и соседние номера могут оказаться в Новосибирске и Лиссабоне. Строить по таким номерам всемирную маршрутизацию нельзя: таблица должна была бы содержать каждое устройство планеты.
IP-адрес устроен иначе. В нём есть часть, обозначающая сеть, и часть, обозначающая узел внутри неё. Маршрутизатору достаточно знать направления до сетей, а не до каждого устройства, и соседние адреса действительно находятся рядом физически. Именно эта простая идея делает интернет технически возможным: магистральный маршрутизатор держит около миллиона записей о сетях вместо миллиардов записей об устройствах.
Что на самом деле делает маршрутизатор
Распространённое заблуждение — что маршрутизатор знает весь путь до получателя. Не знает и знать не должен. Он принимает ровно одно решение: кому передать пакет следующим. Дальше решение принимает уже следующий маршрутизатор, и так далее, пока пакет не доберётся до сети назначения.
Это похоже на дорожные указатели: на перекрёстке написано «Тверь — направо», а не подробный маршрут до самого города. Каждый перекрёсток отвечает только за свой поворот. Поэтому путь туда и обратно вполне может идти разными дорогами — и это нормальная ситуация, а не сбой.
Что происходит с пакетом на каждом переходе
Маршрутизатор принимает кадр, снимает канальный заголовок и достаёт IP-пакет.
Смотрит адрес получателя и ищет подходящий маршрут в своей таблице.
Уменьшает TTL на единицу и пересчитывает контрольную сумму заголовка.
Упаковывает пакет в новый кадр — уже с MAC-адресом следующего узла — и отправляет.
Ключевой момент: IP-адреса отправителя и получателя при этом не меняются на всём пути (если по дороге нет NAT), а MAC-адреса меняются на каждом переходе. Два адреса работают каждый на своём уровне и не мешают друг другу.
Таблица маршрутизации
Таблица — это список «в такую-то сеть отправляй туда-то». Посмотреть свою можно командой ip route в Linux или route print в Windows, и у обычного компьютера она довольно скромная: пара строк про свои сети и одна строка про всё остальное.
Назначение | Куда отправлять | Смысл |
|---|---|---|
192.168.1.0/24 | напрямую, через свой интерфейс | Своя локальная сеть — сосед рядом |
10.20.0.0/16 | через 192.168.1.2 | Сеть филиала — за отдельным роутером |
0.0.0.0/0 | через 192.168.1.1 | Всё остальное — маршрут по умолчанию |
Правило самого точного совпадения
Выбирается всегда самый конкретный подходящий маршрут — тот, у которого длиннее префикс. Если пакет идёт в 10.20.5.7, сработает строка про 10.20.0.0/16, а не маршрут по умолчанию, хотя формально под 0.0.0.0/0 подходит вообще всё. И только когда ничего конкретного не нашлось, в дело вступает шлюз по умолчанию.
Откуда маршруты берутся
Маршруты бывают трёх происхождений. Подключённые появляются сами, когда вы настраиваете адрес на интерфейсе: система сразу знает, что эта сеть — соседняя. Статические прописывает администратор руками. Динамические маршрутизатор узнаёт от соседей по протоколам вроде OSPF внутри организации или BGP между провайдерами — там таблица строится автоматически и перестраивается при авариях.
Для домашней и небольшой офисной сети хватает первых двух. Динамическая маршрутизация начинает окупаться, когда путей между сегментами больше одного и хочется, чтобы сеть сама переключалась на резервный.
TTL: почему пакеты не ходят по кругу вечно
В заголовке каждого IP-пакета есть счётчик TTL — time to live. Каждый маршрутизатор на пути уменьшает его на единицу, и когда счётчик доходит до нуля, пакет уничтожается, а отправителю посылается ICMP-сообщение об этом. Если бы не TTL, любая ошибка в маршрутах превращала бы сеть в бесконечную карусель из пакетов — примерно как петля на втором уровне, где такого счётчика нет.
Побочный эффект оказался полезнее самой защиты
На этом механизме построена traceroute. Программа отправляет пакеты с TTL, равным единице, потом двойке, потом тройке — и каждый раз кто-то на пути жалуется, что время жизни истекло. По этим жалобам выстраивается список узлов маршрута. Отсюда же, кстати, объяснение, почему в выводе traceroute часть строк — звёздочки: некоторые маршрутизаторы настроены не отвечать, но пакеты при этом честно передают дальше.
Фрагментация: почему её стараются избегать
Если пакет не помещается в MTU следующего участка, его нужно разрезать на части. Формально IP это умеет: маршрутизатор делит пакет на фрагменты, а собирает их обратно уже получатель. На практике механизм считается проблемным и его стараются не допускать.
Собирает фрагменты только конечный узел, поэтому потеря одного куска означает переотправку всего пакета целиком.
Номера портов есть только в первом фрагменте — фаерволы и балансировщики остальные части просто не понимают и нередко отбрасывают.
Сборка тратит память и процессорное время получателя, а на нагруженном сервере это заметно.
Поэтому отправители ставят в заголовке флаг «не фрагментировать» и заранее выясняют допустимый размер: если пакет где-то не проходит, маршрутизатор возвращает ICMP-сообщение с нужным значением, и отправитель уменьшает размер сам. Механизм называется Path MTU Discovery.
Ломается он ровно в одном случае — когда кто-то по дороге режет ICMP целиком «ради безопасности». Сообщение о необходимости уменьшить пакет не доходит, отправитель продолжает слать слишком крупные пакеты, и они молча исчезают. Симптом узнаваемый: соединение устанавливается, мелкие запросы проходят, а любая передача существенного объёма намертво зависает.
Когда до одной сети есть несколько маршрутов
Бывает, что в таблице оказываются два маршрута до одной и той же сети — например, основной канал и резервный. Выбор делается по метрике: чем она меньше, тем маршрут предпочтительнее. В Linux её видно прямо в выводе ip route, в Windows — в колонке «Метрика».
Система подставляет метрику автоматически, обычно исходя из скорости интерфейса: гигабитный проводной линк получает лучшее значение, чем Wi-Fi. Поэтому ноутбук, подключённый и кабелем, и по воздуху, ходит в интернет через кабель, а при его отключении сам переезжает на беспроводную сеть. Значение можно задать и вручную, если автоматический выбор не устраивает.
Отдельный случай — одинаковые метрики. Тогда трафик распределяется между маршрутами, и это уже балансировка. Для одиночных соединений она обычно безвредна, но приложения, чувствительные к смене адреса отправителя, от такого поведения ломаются — поэтому включают её осознанно, а не по умолчанию.











