Вопрос или проблема
Этого не должно происходить, так как маршрутизация является явлением на уровне IP, и все же это происходит:
-
Установите соединение по TCP (или даже UDP!):
nc 1.2.3.4 1234
-
Наблюдайте, что вы можете отправлять и получать данные через это соединение, вводя команды в консоли и проверяя на другом конце соединения
-
Создайте новый маршрут
sudo route add -reject 1.2.3.4 127.0.0.1
-
Наблюдайте, что соединение, установленное на шаге 1, по-прежнему работает
-
Попробуйте установить новое соединение с тем же хостом и наблюдайте, что оно не передает данные, как ожидалось.
Я пробовал это много раз, включая использование UDP-сокетов, и поведение стабильно воспроизводится. Ничего подобного не происходит на Linux или Windows (как можно было бы ожидать). Единственное объяснение, которое у меня есть, это то, что в механизме маршрутизации ОС есть какая-то особая обработка пакетов TCP и UDP или что-то вроде таблиц маршрутизации на уровне процессов. Но я не могу найти ни одного упоминания об этом. Есть ли документация по этому поведению и как его изменить? Или альтернативное объяснение?
Ответ или решение
На первый взгляд, кажется удивительным, что добавление нового маршрута в macOS не влияет на уже существующие TCP и UDP соединения. Это явление можно объяснить несколькими ключевыми аспектами работы сетевой подсистемы macOS, которые отличаются от других операционных систем, таких как Linux или Windows.
1. Принципы работы TCP и UDP
TCP и UDP являются протоколами транспортного уровня, которые используют IP для передачи данных по сети. Однако они работают по-разному. TCP обеспечивают надежную доставку данных с контролем последовательности, а UDP — это протокол без установления соединения, который не гарантирует доставку. При установлении соединения TCP устанавливается «состояние», которое включает в себя информацию о маршруте данных, что делает его более устойчивым к изменениям в маршрутизации.
2. Кэширование маршрутов
В macOS маршруты могут кешироваться, и это означает, что, когда устанавливается соединение, операционная система создает записи о маршруте, используемом для этого соединения. Когда вы вводите команду nc 1.2.3.4 1234
, система создает запись о маршруте и использует ее для передачи данных. Добавление нового маршрута, например, sudo route add -reject 1.2.3.4 127.0.0.1
, не затрагивает уже существующий маршрут, и данные продолжают передаваться через ранее установленные соединения.
3. Разделение маршрутов
macOS также использует логику, которая позволяет создавать так называемые «потоки» для обработки сетевых соединений. Это означает, что для уже открытого соединения маршрутизация обрабатывается отдельно от новых соединений. При добавлении нового маршрута изменяются только новые соединения, а не существующие, что позволяет сохранять работоспособность текущих соединений.
4. Управление соединениями и контекст
Дополнительной особостью macOS является управление сетевыми соединениями на уровне процесса. Каждое приложение может использовать свои собственные параметры маршрутизации в зависимости от состояния соединения. Это означает, что изменения маршрутов могут применяться только к новым запросам на соединение, оставляя существующие соединения нетронутыми.
5. Документация и альтернативы
На данный момент отсутствует официальная документация, описывающая поведение маршрутизации TCP и UDP в macOS подобным образом. Тем не менее, пользователи могут экспериментировать с другими инструментами для управления маршрутизацией или сетевыми настройками, такими как pf
(Packet Filter) в BSD-системах, использующих macOS. Это может помочь в более детальном изучении сетевого поведения системы.
Заключение
Таким образом, уникальные аспекты работы сетевой подсистемы macOS объясняют, почему добавление нового маршрута не влияет на уже установленные TCP и UDP соединения. Пользователям следует учитывать эти нюансы при работе с сетевыми технологиями, особенно если они приходят из других операционных систем, таких как Linux или Windows. Если у вас есть дополнительные вопросы или требуется более детальное обсуждение этих тем, не стесняйтесь обращаться к специалистам в области сетевых технологий.