Содержание


Разработка модулей ядра Linux

Часть 30. Знакомство с сетевой подсистемой Linux

Comments

Серия контента:

Этот контент является частью # из серии # статей: Разработка модулей ядра Linux

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Разработка модулей ядра Linux

Следите за выходом новых статей этой серии.

Сетевая подсистема — это разветвлённая и обширная часть Linux, формально не связанная с драйверами устройств, так как при использовании сетевого оборудования устройств в /dev не создаётся, а вместо этого объявляются сетевые интерфейсы. Однако изучение вопросов взаимодействия с сетевыми устройствами и протоколами из кода модулей ядра было решено включить в обзор драйверов устройств именно из-за функциональной близости предметов.

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

Структура сетевой подсистемы Linux

Сетевая подсистема Linux гораздо более «запутана», нежели интерфейсы для работы с устройствами. Но, несмотря на обилие возможностей (например, если судить по числу обслуживающих сетевых утилит: ifconfig, ip, netstat и т.д.), сетевая подсистема Linux, с позиции разработчика ядра, выглядит логичнее и прозрачнее, чем, например, те же интерфейсы для работы с устройствами. Эта подсистема в основном ориентирована на обслуживание Ethernet-протоколов на канальном уровне и TCP/IP на транспортном уровне, но также расширяется и на другие типы протоколов, таким образом, покрывая весь спектр возможностей. На данный момент сетевая подсистема Linux обеспечивает поддержку широчайшего спектра протоколов и устройств:

  • проводные соединения Ethernet (LAN);
  • беспроводные соединения WiFi (LAN) и Bluetooth (PAN);
  • разнообразные проводные устройства «последней мили» (WAN): E1/T1/J1, различные модификации DSL;
  • беспроводные модемы (WAN), относящиеся к разнообразным протоколам, сетям и модификациям: GSM, GPRS, EDGE, CDMA, EV-DO (EVDO), WiMAX, LTE.

Весь этот спектр и некоторые классы менее распространенных технологий поддерживаются единой сетевой подсистемой.

Сетевая модель TCP/IP, как известно, очень условно согласуется (или вовсе не согласуется) с 7-ми уровневой OSI-моделью взаимодействия открытых систем. Это связано с тем, что модель взаимодействия TCP/IP была разработана раньше модели OSI. На платформе Linux сложилась следующая терминология разделения на подуровни, которой пользуются разработчики ядра:

  • всё, что относится к поддержке оборудования и канальному уровню, описывается как сетевые интерфейсы и обозначается как L2 (преимущественно это Ethernet);
  • протоколы сетевого уровня OSI (IP/IPv4/IPv6 , IPX, RIP и т.д.) — как сетевой уровень стека протоколов или уровень L3;
  • всё, что выше (ICMP, UDP, TCP, SCTP и т.д.) — как протоколы транспортного уровня или уровень L4;
  • всё то, что относится к выше лежащим уровням (сеансовый, представительский, прикладной) модели OSI (например: SSH, SIP, RTP и т.д.), не проявляется в ядре и относится уже к области клиентских и серверных утилит пространства пользователя.

Такая сложившаяся числовая нумерация сетевых слоёв (L2, L3, L4) соответствует аналогичным уровням из модели OSI. Обратите внимание, что в терминологии, принятой в Linux, нет слоя L1, так как это физический уровень передачи данных, не попадающий в круг интересов разработчиков Linux. Точно также в круг интересов разработчиков ядра Linux не попадают все сетевые слои, лежащие выше L4, так как это уже протоколы и приложения пользовательского уровня, хотя именно там создаются и потребляются сетевые пакеты.

Используемые инструменты

В отличии от остальных системных устройств, которым соответствуют имена в каталоге /dev, сетевые устройства создают сетевые интерфейсы, которые не отображаются как именованные устройства, но имеют свой набор конфигурационных параметров (MAC адрес, IP адрес, маска сети и т.д.). Интерфейсы могут быть физическими (отображающими реальные аппаратные сетевые устройства, например, eth0 — адаптер Ethernet) или логическими (отражающими некоторые моделируемые понятия, например, tap0 — тунельный интерфейс). Одному реальному аппаратному сетевому устройству может соответствовать одновременно несколько различных сетевых интерфейсов.

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

$ ifconfig 
...
cipsec0   Link encap:Ethernet  HWaddr 00:0B:FC:F8:01:8F  
          inet addr:192.168.27.101  Mask:255.255.255.0 
          inet6 addr: fe80::20b:fcff:fef8:18f/64 Scope:Link 
          UP RUNNING NOARP  MTU:1356  Metric:1 
...
wlan0     Link encap:Ethernet  HWaddr 00:13:02:69:70:9B  
          inet addr:192.168.1.21  Bcast:192.168.1.255  Mask:255.255.255.0 
          inet6 addr: fe80::213:2ff:fe69:709b/64 Scope:Link 
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 
...

Здесь показаны два сетевых интерфейса: физическая беспроводная сеть Wi-Fi (wlan0) и виртуальный интерфейс (виртуальная частная сеть, VPN), созданный программными средствами (CiscoSystemsVPNClient) от Cisco Systems (cipsec0), - работающие через один и тот же физический канал (что подтверждает сказанное выше о возможности нескольких сетевых интерфейсов над одним каналом). Для управления создаваемым сетевым интерфейсом (например, операций up или down), в отличие от диагностики, утилита ifconfig потребует прав root.

Менее известным, но более функциональным инструментом является утилита ip (в некоторых дистрибутивах может потребоваться отдельная установка пакета, известного под именем iproute2). Вот результаты запуска утилиты ip на этой же конфигурации:

$ ip link 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
    link/ether 00:15:60:c4:ee:02 brd ff:ff:ff:ff:ff:ff 
...
6: cipsec0: <NOARP,UP,LOWER_UP> mtu 1356 qdisc pfifo_fast state UNKNOWN qlen 1000 
    link/ether 00:0b:fc:f8:01:8f brd ff:ff:ff:ff:ff:ff 
$ ip addr show dev cipsec0 
6: cipsec0: <NOARP,UP,LOWER_UP> mtu 1356 qdisc pfifo_fast state UNKNOWN qlen 1000 
    link/ether 00:0b:fc:f8:01:8f brd ff:ff:ff:ff:ff:ff 
    inet 192.168.27.101/24 brd 192.168.27.255 scope global cipsec0 
    inet6 fe80::20b:fcff:fef8:18f/64 scope link 
       valid_lft forever preferred_lft forever

Хотя утилита ip имеет очень разветвлённый синтаксис, она включает и полноценную систему подсказок.

$ ip help 
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help } 
       ip [ -force ] -batch filename 
where  OBJECT := { link | addr | addrlabel | route | rule | neigh | ntable | 
                   tunnel | maddr | mroute | monitor | xfrm } 
       OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] | 
                    -f[amily] { inet | inet6 | ipx | dnet | link } | 
                    -o[neline] | -t[imestamp] | -b[atch] [filename] } 
$ ip addr help 
Usage: ip addr {add|change|replace} IFADDR dev STRING [ LIFETIME ] 
                                                      [ CONFFLAG-LIST] 
       ip addr del IFADDR dev STRING 
       ip addr {show|flush} [ dev STRING ] [ scope SCOPE-ID ] 
...

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

Ещё один класс утилит, который нам непременно понадобится при создании сетевых модулей — это утилиты для анализа сетевого трафика. Существует множество подобных инструментов, поэтому мы назовём только наиболее известные: tcpdump (консольная утилита) или её функциональный эквивалент с GUI интерфейсом Wireshark. Вот как может выглядеть протокол обмена на одном выбранном сетевом интерфейсе (показано только начало выполнения операции ping на этот интерфейс с внешнего хоста LAN):

$ ip addr show dev p7p1 
3: p7p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 
    link/ether 08:00:27:9e:02:02 brd ff:ff:ff:ff:ff:ff 
    inet 192.168.56.101/24 brd 192.168.56.255 scope global p7p1 
    inet6 fe80::a00:27ff:fe9e:202/64 scope link 
       valid_lft forever preferred_lft forever 
$ sudo tcpdump -i p7p1 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
listening on p7p1, link-type EN10MB (Ethernet), capture size 65535 bytes 
... ARP, Request who-has 192.168.56.101 tell 192.168.56.1, length 46 
... ARP, Reply 192.168.56.101 is-at 08:00:27:9e:02:02 (oui Unknown), length 28 
... IP 192.168.56.1 > 192.168.56.101: ICMP echo request, id 2478, seq 1, length 64 
...

Здесь видно, как работает ARP-механизм разрешения IP-адресов в локальной сети (начало протокола) и приём и передача IP-пакетов (тип протокола ICMP).

Примечание: В примере специально показано имя (p7p1) проводного (Ethernet) сетевого интерфейса в том виде, который он может иметь в некоторых последних (Fedora 16,17) дистрибутивах Linux (вместо eth0, eth1, ...). Такое обозначение увязывает сетевой интерфейс с адресом реализующего его сетевого адаптера на шине PCI.

Заключение

После краткого знакомства с архитектурой сетевой подсистемы платформы Linux и инструментами, используемыми для наблюдения и управления сетевыми интерфейсами, мы можем перейти к более сложным вопросам, связанным с совместным использованием сетевых интерфейсов и драйверов ядра.


Ресурсы для скачивания


Похожие темы


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=844043
ArticleTitle=Разработка модулей ядра Linux: Часть 30. Знакомство с сетевой подсистемой Linux
publish-date=11012012