В начало → Linux не для идиотов → Сетевая подсистема |
Ключевым (с нашей точки зрения) объектом сетевой подсистемы Linux является интерфейс. Сетевой интерфейс в Linux – это абстрактный именованный объект, используемый для передачи данных через некоторую линию связи без привязки к ее (линии связи) реализации. Конечно, сказано мудрено – но попробуем объяснить «на пальцах».
Например, если в системе существует интерфейс eth0, то в большинстве случаев на современных компьютерах он сопоставлен Ethernet-адаптеру, встроенному в материнскую плату. Интерфейс с именем ppp0 отвечает за некоторое соединение «точка-точка» с другим компьютером. Интерфейс с именем lo является виртуальным и представляет как бы замкнутый сам на себя (вход непосредственно подключен к выходу) сетевой адаптер.
Основная задача интерфейса – абстрагироваться от физической составляющей канала. То есть программы и система будут использовать один и тот же метод «отправить пакет» для отправки данных через любой интерфейс – хоть lo, хоть ethX, хоть pppY, и точно так же использовать один и тот же метод «принять пакет» – то есть создается унифицированный API передачи данных, независимый от носителя.
Для того, чтобы ознакомиться с интерфейсами, можно воспользоваться командой ifconfig:
$
ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:11:2F:A8:DE:A4 inet addr:172.23.2.114 Bcast:172.23.2.255 Mask:255.255.255.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) Interrupt:11 Base address:0x4000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:60 errors:0 dropped:0 overruns:0 frame:0 TX packets:60 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4707 (4.5 KiB) TX bytes:4707 (4.5 KiB)
В данном случае мы видим в системе два активных интерфейса, eth0 и lo, а также некоторую информацию об их состоянии, настройках и параметрах и состоянии аппаратуры для интерфейса eth0. В частности, поле Link encap характеризует тип интерфейса, HWAddr – аппаратный адрес устройства (например, MAC-адрес для Ethernet), MTU – максимальный размер передаваемого пакета. Также могут представлять интерес поля статистики – они сообщают, какой объем данных был передан и получен через соответствующий интерфейс.
Наиболее часто встречающиеся типы интерфейсов:
eth (Ethernet) – обычно соответствует отдельному сетевому адаптеру
ppp (Point-To-Point) – соединение точка-точка, например при коммутируемом доступе, но очень часто используется и при организации VPN
slip (Serial Line IP) – соединение точка-точка, устаревший протокол
wl (Wireless) – беспроводной интерфейс, обычно сопоставлен соответствующему адаптеру
lo (Loopback) – интерфейс-«петля», то есть что послал, то и получил – используется для общения между сетевыми приложениями в рамках одного компьютера
Команда ifconfig может также использоваться для остановки или активации интерфейса, а также изменения его параметров, связанных с протоколом IP:
#
ifconfig eth0 down
#
ifconfig eth0 up
#
ifconfig eth0 inet 192.168.2.210 netmask 255.255.255.0
#
ifconfig eth0 mtu 296
Для управления параметрами других протоколов используются другие команды – например, ipx_config для управления параметрами, связанными с протоколом IPX. Рассмотрим также картинку, на которой приведена приблизительная схема взаимодействия различных драйверов и сетевых подсистем ядра:
Предположим, что приложение пытается отправить пакет. Перед отправкой через системные вызовы группы socket (bind, connect и пр.) приложение настраивает специальный файловый дескриптор. После окончания настройки каждый записанный в этот дескриптор пакет должен быть отправлен по сети получателю. Как движется пакет в нашей системе? Прежде всего, пакет попадает в драйвер протокола. Этот драйвер определяет через какой интерфейс должна производиться отправка, дописывает к пакету необходимые заголовки и отдает пакет на обработку соответствующему интерфейсу (точнее, ставит пакет в очередь, связанную с этим интерфейсом).
Что драйвер сделает с пакетом, это уже его дело. Например, драйвер интерфейса loopback этот пакет вынет из очереди и сразу
поставит в очередь «принятых», откуда его впоследствии заберет драйвер протокола (левая цепочка на схеме). Драйвер интерфейса
eth0 допишет к пакету заголовки Ethernet и передаст пакет драйверу сетевого адаптера, и уже тот непосредственно проинструктирует
сетевой адаптер, откуда взять и как отправить пакет (правая цепочка). В средней же цепочке мы видим схему работы PPP, когда
пакет помещается в очередь интерфейса ppp0, откуда его заберет демон pppd. Демон допишет в пакет нужные заголовки, и через
символьный специальный файл /dev/ttyS0
передаст пакет драйверу COM-порта, а тот непосредственно будет работать с аппаратурой. Соответственно, при приемке данных
цепочки проходятся в обратном порядке.
В начало → Linux не для идиотов → Сетевая подсистема |