Готовый перевод Linux Device Drivers 3 / Драйверы устройств Линукс (третье издание): 17.1. Как появился snull
17.1. Как появился snull
Этот подраздел описывает концепцию сетевого интерфейса snull.
Хотя эта информация может показаться незначительной, пробел в этой
области может вызвать проблемы даже при работе с простым кодом.
Первое и главное – в этой книге предполагалось использовать простой и
независимый от реальной аппаратуры интерфейс, и простой код. Это
наводит на мысль о сходстве с loopback интерфейсом. Snull не является
loopback, в отличии от него он позволяет взаимодействовать с удаленным
хостом, и хорошо демонстрирует процесс написания сетевого драйвера.
Драйвер Linux loopback – прост, его можно найти в файле
drivers/net/loopback.c.
Еще одна особенность snull в том, что он поддерживает только
транспорт IP Это следствие внутреннего устройства интерфейса – snull. .
анализирует содержимое и интерпретирует пакеты, чтобы представлять
два аппаратных интерфейса. Реальный интерфейс не зависит от
протокола передачи, и это ограничение snull не будет затронуто во
фрагментах кода этой главы.
17.1.1. Назначение IP-адресов.
Модуль snull создает два интерфейса. Эти интерфейсы отличаются
от простого loopback тем, что один интерфейс позволяет посылать
данные только самому себе, а другой интерфейс - не только себе.
К сожалению, этот эффект не может быть достигнут посредством
назначения IP-адреса, потому что ядро не отослало бы пакет через
интерфейс A, который был бы направлен к интерфейсу B, этого же хоста.
Для этого используется канал loopback, без прохождения через snull.
Пакеты, посланные через один интерфейс, могут быть приняты через
другой, но получателем пакета не может быть локальный хост. (?????????)
Чтобы стать «скрытым loopback», интерфейс snull инвертирует младший бит 3-го октета в адресах получателя и отправителя. Это
изменяет IP-адреса класса C сети и хоста. В результате пакет,
посылаемый в сеть A(соединение sn0, первый интерфейс), появляется на
интерфейсе sn1, как пакет сети B.
Чтобы не использовать большое количество чисел, назначим
символические имена IP-адресам:
snullnet0 – сеть, соединенная с интерфейсом sn0. Так же snullnet1
соединен с sn1. Адреса этих сетей различаются только младшим
битом 3-го октета. Эти сети должны иметь 24-битную маску сети.
local0 – IP адрес назначенный интерфейсу sn0, это относиться и к
snullnet0. Адрес sn1 – local1. local0 и local1 должны отличаться
в младшем бите 3-го октета и четвертым октетом.
remote0 это хост в snullnet0, и его четвертый октет – тот же что и в
local1. Любой пакет, посланный в remote0, доходит до local1, после
этого сетевой адрес модифицируется кодом интерфейса. Хост
remote1 принадлежит snullnet1 и его четвертый октет – тот же что
и в local0.
Операции snull интерфейса изображены на рисунке 17-1, на
котором имя хоста. связанное с интерфейсом, указано возле имени
интерфейса.
Рисунок 17-1 как хост видит интерфейсы.
Здесь укажем возможные значения сетевых адресов. Как только вы
поместите эти строки в /etc/networks, можно обращаться к сети по
имени. Указанные значения зарезервированы для персонального
использования.
snullnet0 192.168.0.0
snullnet1 192.168.1.0
Поместите в /etc/hosts следующие строки:
192.168.0.1 local0
192.168.0.2 remote0
192.168.1.2 local1
192.168.1.1 remote1
Важная особенность этих адресов в том, что часть
идентифицирующая хост в local0 та же, что и в remote1, а в local1 та же
что и в remote0. Вы можете использовать различные значения адресов,
соблюдая это.
Для краткости будем считать, что ваш компьютер уже подсоединен
к сети. Выбранный вами адрес может уже быть в реальной сети Internet
или intranet, и назначение его вашему интерфейсу приведет к нарушению
связи с реальным хостом. Например, адрес не принадлежащий Internet,
уже может использоваться в вашей персональной сети.
Любой адрес, выбранный вами, можно корректно назначить
интерфейсам, используя команды:
ifconfig sn0 local0
ifconfig sn1 local1
Если адрес не принадлежит сети класса С, вам необходимо добавить
параметр netmask 255.255.255.0,.
Теперь удаленный интерфейс – доступен. Ниже показано, что хосту
доступны remote0 и remote1 через интерфейс snull.
morgana% ping -c 2 remote0
64 bytes from 192.168.0.99: icmp_seq=0 ttl=64 time=1.6 ms
64 bytes from 192.168.0.99: icmp_seq=1 ttl=64 time=0.9 ms
2 packets transmitted, 2 packets received, 0% packet loss
morgana% ping -c 2 remote1
64 bytes from 192.168.1.88: icmp_seq=0 ttl=64 time=1.8 ms
64 bytes from 192.168.1.88: icmp_seq=1 ttl=64 time=0.9 ms
2 packets transmitted, 2 packets received, 0% packet loss
Обратите внимание, что вам не будут доступны другие хосты,
принадлежащие обеим сетям. Это происходит, потому что при передаче
пакета, меняется адрес, и ваш компьютер будет отвергать пакеты, после
их принятия. Например, пакет, предназначенный для 192.168.0.32, уходит
через sn0, и приходит в sn1, с адресом назначения 192.168.1.32, который
не является адресом локального хоста.
17.1.2. Физический транспорт пакетов.
Поскольку нас интересует транспорт данных, скажем, что
интерфейс snull принадлежит классу Ethernet.
snull эмулирует Ethernet, потому что большая часть сетей
базируется на Ethernet технологии, будь то 10base-T, 100base-T или
Gigabit.
К тому же, ядро предлагает общую поддержку Ethernet-устройств,
и нет причин не использовать это. Преимущество существующих Ethernet-
устройств заключается в мощном plip интерфейсе (этот интерфейс
используется портом принтера), объявляющим себя как Ethernet-устройство.
И последнее преимущество использования Ethernet для snull
заключается в том, что вы можете запускать tcpdump для просмотра
проходящих пакетов. Наблюдение за обоими интерфейсами с помощью
tcpdump, может быть полезно для их изучения.
Как было сказано, snull работает только c IP пакетами. Это
ограничение связано с тем фактом, что snull читает и модифицирует
содержимое пакетов. Код модифицирует отправителя, получателя и
контрольную сумму в заголовке каждого пакета, и не проверяет,
действительно ли передается IP-пакет. Поэтому структура не IP-пакета
будет разрушена. Если вы хотите использовать другие протоколы с snull,
вы должны будете модифицировать модули исходного кода.
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: перевод редактируется
Переведено на Нотабеноиде
http://notabenoid.org/book/11832/38381
Переводчики: hardorsoft
Настройки
Готово:
