Готовый перевод Linux Device Drivers 3 / Драйверы устройств Линукс (третье издание): Глава 17. Драйвера сетевых устройств

Внимание! Этот перевод, возможно, ещё не готов, так как модераторы установили для него статус «перевод редактируется»

Глава 17. Драйвера сетевых устройств

Мы обсудили символьные и блочные драйвера, теперь рассмотрим
сетевые. Сетевой интерфейс является третьим стандартным классом
устройств Linux, в этой главе описано его взаимодействие с ядром.

Роль сетевых устройств в системе подобна монтируемым блочным
устройствам. Блочное устройство регистрирует диски и методы в ядре,
затем передает и принимает блоки данных по запросу с помощью
функции request. Аналогично и сетевое устройство регистрирует себя в
специальных структурах ядра, для обмена пакетами с внешним миром.

Имеются несколько важных отличий между монтированием дисков
и интерфейсом доставки пакетов. Диск представлен как специальный
файл в каталоге /dev, а сетевой интерфейс не имеет подобного
представления. Стандартные файловые операции (чтение, запись и т.п.)
не производятся над сетевым интерфейсом, также не применим принцип
Unix «все является файлом». Таким образом, сетевой интерфейс
существует в своем пространстве, и экспортирует собственный набор
операций.

Хотя вы можете возразить, что приложения используют системные
вызовы read и write для сокетов, но эти вызовы взаимодействуют с
программным обеспечением по отдельному интерфейсу. Несколько сотен
сокетов могут быть мультиплексированы на одном физическом
устройстве.

Более важное отличие заключается в том, что блочные устройства
выполняют какие-либо действия только по запросу ядра, а сетевые
устройства принимают пакеты асинхронно из внешней среды. Таким
образом, для передачи буфера, ядро запрашивает драйвер блочного
устройства, а сетевое устройство само запрашивает ядро для передачи
полученного пакета. Интерфейс ядра для сетевых устройств построен на
основе этих отличий.

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

Сетевая подсистема ядра Linux, спроектирована так, чтобы быть
независимой от протокола. Это применимо к сетевым протоколам
(Internet protocol [IP], IPX или другие) и аппаратному протоколу (Ethernet,
token ring и т.д.). При взаимодействии между сетевым драйвером и ядром
одновременно может передаваться только 1 пакет. Это позволяет
скрывать от драйвера протокол, и от протокола – физическую среду.

Эта глава описывает, как сетевые интерфейсы вписываются в ядро
Linux, предоставляет примеры сетевого интерфейса, который называется
snull. Для упрощения обсуждения, интерфейс использует аппаратный
протокол Ethernet и передает IP-пакеты. Знания, приобретенные вами при
рассмотрении snull, могут быть легко применены для не IP-протокола.
Написание не Ethernet-драйвера немного отличается в деталях,
связанных с сетевым протоколом.

В этой главе не рассказывается о схеме назначения IP адресов,
сетевых протоколов или других основополагающих концепциях сети. Эти
понятия не имеют отношения к написанию драйверов, и нельзя
удовлетворительно рассмотреть сетевые технологии в объеме менее чем сотня страниц.

Перед началом изучения, сделаем заметку по терминологии. В
мире сетевых технологий используется термин «октет», что означает
группу из 8 бит, что в большинстве случаев является наименьшей
единицей данных в сетевых устройствах и протоколах. Термин байт почти
никогда не встречается. Для соблюдения стандартов, мы также будем
употреблять «октет», когда говорим о сетевых устройствах.

Термин «заголовок» так же заслуживает упоминания. Заголовок –
это множество байт (прошу прощения – октет), находящихся в пакете, и
позволяющих ему пройти через различные сетевые уровни. Когда
приложение посылает блок данных через TCP-сокет, сетевая подсистема
разделяет эти данные на пакеты, и добавляет в начало каждого пакета
TCP-заголовки, описывающие его местоположение в потоке. Затем, перед
заголовком TCP, нижние уровни добавляют IP-заголовок, используемый
для доставки пакета к месту назначения. Если пакет выходит за пределы
среды Ethernet, заголовки Ethernet, интерпретируемые аппаратно,
находятся перед остальными. Обычно сетевой драйвер не должен
интересоваться заголовками более высоких уровней, они могут
многократно усложнить создание заголовков аппаратного уровня.

Внимание! Этот перевод, возможно, ещё не готов.
Его статус: перевод редактируется

Переведено на Нотабеноиде
http://notabenoid.org/book/11832/38380

Переводчики: hardorsoft

Настройки

Готово:

100.00% КП = 1.0