При выполнении IPC с использованием сокетов TCP/IP с использованием обратного адреса, общие сетевые стеки пропускают кадрирование сообщения в PDU более низкого уровня?
В некоторых средах, таких как Java, естественно использовать сокеты TCP/IP для передачи сообщений между процессами на одном хосте, используя адрес localhost (127.0.0.1 в IPv4 или:: 1 в IPv6). (Поскольку Java не стремится раскрывать другие механизмы IPC в своем API).
Очевидно, что это может быть намного медленнее, чем IPC через передачу сообщений по каналам или IPC с использованием общей памяти.
С другой стороны, если сетевой стек TCP/IP понял, что оба конца соединения находятся в интерфейсе loopback, он может сделать справедливую бит оптимизации, чтобы эффективность могла не сильно отличаться от использования труб.
Но делают ли обычные операционные системы (Windows, Linux) такими оптимизациями в своих стеках TCP/IP?
Ответы
Ответ 1
Да. Когда принимается пакет/данные на адрес Loopback (127.x.x.x), IP-уровень TCP/IP использует маршрут Loopback для маршрутизации пакета к себе.
Looback Route
Назначение сети || Сетевая маска || Шлюз || Интерфейс || Метрика
127.0.0.0 |||||||||||||||||||||| 255.0.0.0 || 127.0.0.1 || 127.0.0.1 || 1
После маршрутизации на itsef на уровне TCP/UDP с помощью блоков управления протоколом (для каждой структуры данных соединения) будет идентифицирован соответствующий сокет и его процесс владельца для доставки пакета/данных.
Нижняя строка. Все задачи на уровнях передачи данных и физических уровнях (модели OSI) будут устранены.
Ответ 2
Зависит от ОС и используемой конфигурации. Ответ - да, если вы запрашиваете поведение по умолчанию.
Именно по этой причине вы не можете использовать такие инструменты, как wireshark, чтобы обнюхивать локальные сценарии loopback.
Ответ 3
В частности, в linux, когда пакеты передаются по интерфейсу loopback, ядро запускает "программное" прерывание для каждого пакета. С этого момента прием пакетов идентичен потоку приема пакета для физического устройства. Таким образом, вы правы в своем предположении, что связь через интерфейс loopback будет намного медленнее, чем альтернативные механизмы IPC, такие как unix-сокеты.
Я думаю, что путь кода ядра можно оптимизировать. Например, мы могли бы вызвать код приема приема непосредственно из пути кода передачи интерфейса обратной петли.