Универсальный программатор устройств с прецизионным приводным рычагом

Что такое универсальный сокет и как он связан с сетевым устройством?

Я пытаюсь понять, как сетевые драйверы работают под Linux. Эти вопросы и ответы показали, что сетевое устройство в Linux не представлено файлом устройства. В нем указано, что сетевые драйверы работают с сокетами.

Например, это относится к настройке сетевых устройств с помощью вызовов ioctl. Однако ioctl требуется файловый дескриптор, учитывая, что для сетевых драйверов нет файлов устройств, единственный файловый дескриптор, который можно передать, — это дескриптор из сокета.

Это подводит меня к сути вопроса. До сих пор кажется, что сетевой интерфейс, который был бы программным представлением физической сетевой карты, на самом деле является подчиненным объектом по сравнению с сокетом.

Но что такое сокет в этом абстрактном смысле, это просто другое название файла устройства, поддерживающего push-уведомления? Я понимаю сокеты TCP с точки зрения точек подключения, привязанных приложением пользовательского пространства к паре адрес: порт на сетевом интерфейсе. Я не понимаю сокет как необходимое условие для настройки сетевого интерфейса.

Может ли сетевой интерфейс в Linux (например, eth0, указанный в ifconfig ) существовать без сокета?

Оставляет ли ifconfig или какой-либо демон сетевого менеджера сокет открытым, чтобы мы могли установить параметры сетевого интерфейса?

1 ответ 1

Давайте быстро рассмотрим файлы устройств: в Linux прикладные программы передают операции чтения и записи ядру через файловые дескрипторы. Это прекрасно работает с файлами, и оказалось, что тот же API можно использовать для символьные устройства которые производят и потребляют потоки символов, и блочные устройства которые читают и пишут блоки фиксированного размера по произвольному адресу доступа, просто делая вид, что это тоже файлы.

Но был необходим способ настройки этих устройств (установка скорости передачи данных и т. д.), и для этого IOCTL звонок придумали. Он просто передает структуру данных, специфичную для устройства и типа управления вводом-выводом, используемого ядром, и возвращает результаты в той же структуре данных, поэтому это очень общий расширяемый API, который можно использовать для многих вещей. .

Читайте также:
Отопительное устройство на твердом топливе Определение | Инсайдер права

Теперь, как вписываются сетевые операции? Типичное приложение сетевого сервера хочет связывать на какой-то сетевой адрес, Слушать на определенном порту (например, 80 для HTTP или 22 для ssh), и если клиент подключает, он хочет Отправить данные к и Получать данные этого клиента. И двойные операции для клиента.

Не очевидно, как это совместить с файловыми операциями (хотя это можно сделать, см. План 9), поэтому разработчики UNIX изобрели новый API: розетки. Вы можете найти подробности в разделе 2 справочных страниц для socket , bind , listen , connect , send и recv . Обратите внимание, что хотя он и отличается от API файлового ввода-вывода, вызов сокета, тем не менее, также возвращает файловый дескриптор. В Интернете есть множество руководств по использованию сокетов, немного погуглите.

Пока это все чистый UNIX, никто не говорил о сетевых интерфейсах во времена изобретения сокетов. И поскольку этот API действительно устарел, он определен для множества сетевых протоколов помимо интернет-протокола (посмотрите на константы AF_*), хотя в Linux поддерживаются лишь некоторые из них.

Но поскольку компьютеры начали получать несколько сетевых карт, для этого потребовалась некоторая абстракция. В Linux это сетевой интерфейс (НИ). Он используется не только для части оборудования, но и для различных туннелей, конечных точек пользовательских приложений, которые серверируют как туннели, такие как OpenVPN и т. д. Как уже объяснялось, API сокетов не основан на (специальных) файлах и не зависит от файловой системы. Точно так же и сетевые интерфейсы не отображаются в файловой системе. Однако сетевые интерфейсы доступны в файловых системах /proc и /sys (а также в других сетевых настройках).

NI — это просто абстракция ядра конечной точки, через которую сетевые пакеты входят и выходят из ядра. Сокеты, с другой стороны, используются для передачи пакетов приложениям. Никакой сокет не должен участвовать в обработке пакета. Например, когда включена переадресация, пакет может войти в один NI и уйти в другой. В этом смысле сокеты и сетевые интерфейсы полностью независимы.

Читайте также:
Утепление стен изнутри – чем и когда делать?

Но должен был быть способ настройки сетевых интерфейсов, точно так же, как вам нужен был способ настройки блочных и символьных устройств. И поскольку сокеты уже возвращали файловый дескриптор, было несколько логично просто разрешить ioctl для этого файлового дескриптора. Это сетевое устройство интерфейс, который вы связали.

Существует немало других подобных злоупотреблений системными вызовами, например, для фильтрации пакетов, перехвата пакетов и т. д.

Все это росло по частям и во многих местах не особенно логично. Если бы он был разработан сразу, возможно, можно было бы сделать более ортогональный API.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: