Как операционная система определяет, куда отправлять TCP-пакеты при установлении соединения с хостом?

«Как операционная система определяет, куда отправлять TCP-пакеты при установлении соединения с хостом?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ядро ОС использует таблицу маршрутизации для принятия решения о следующем прыжке для каждого исходящего IP-пакета. Алгоритм выбора маршрута следующий:

  1. Проверка локальных интерфейсов: Сначала проверяется, принадлежит ли IP-адрес назначения одной из непосредственно подключенных подсетей (локальных интерфейсов).
  2. Поиск наиболее специфичного маршрута: Если адрес не локальный, ядро ищет в таблице маршрут с самой длинной маской подсети (наиболее специфичный), который соответствует адресу назначения.
  3. Шлюз по умолчанию: Если специфичный маршрут не найден, используется маршрут по умолчанию (0.0.0.0/0 или default).

Пример (Linux): Посмотреть текущую таблицу маршрутизации:

$ ip route show
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
default via 192.168.1.1 dev eth0

В этом примере трафик в сеть 192.168.1.0/24 уйдет напрямую через интерфейс eth0, а весь остальной трафик (default) будет отправлен на шлюз 192.168.1.1.

Проверка маршрута для конкретного адреса:

$ ip route get 8.8.8.8
8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.100 uid 1000

Эта команда показывает полный путь, который будет использован для пакета до 8.8.8.8: через шлюз 192.168.1.1, интерфейс eth0 и с исходным адресом 192.168.1.100.