Библиотека сайта rus-linux.net
Цилюрик О.И. Модули ядра Linux | ||
Назад | Внешние интерфейсы модуля | Вперед |
Сеть
Сетевая подсистема является гораздо разветвлённее итерфейса устройств Linux. Но, несмотря на обилие возможностей (например, если судить по числу обслуживающих сетевых утилит: ifconfig, ip, netstat, route ... и до нескольких десятков иных) — сетевая подсистема Linux, с позиции разработчика ядра, логичнее и прозрачнее, чем, например, тот же интерфейс устройств. Сетевая подсистема Linux ориентирована в большей степени на обслуживание протоколов Ethernet на канальном уровне и TCP/IP на уровне транспортном, но эта модель расширяется с равным успехом и на другие типы протоколов, таким образом покрывая весь спектр возможностей. Сеть TCP/IP, как известно, весьма условно вписывается в 7-уровневую модель OSI взаимодействия открытых систем (она и разработана раньше модели OSI, и, естественно, они не соответствуют друг другу). В Linux сложилась такая терминология разделения на подуровни, что:
- всё, что относится к поддержке оборудования и канальному уровню — описывается как сетевые интерфейсы;
- протоколы сетевого уровня OSI (IP/IPv4/IPv6, IPX, ICMP, RIP, OSPF, ARP, ... ) — как сетевой уровень стека протоколов (или L2);
- всё, что выше (UDP, TCP, SCTP ...) - как протоколы транспортного уровня (или L3);
- всё же то, что относится к выше лежащим уровням (сеансовый, представительский, прикладной) модели OSI (например: SSH, SIP, RTP, ...) — никаким образом не проявляется в ядре, и относится уже только к области клиентских и серверных утилит пространства пользователя.
Сетевая реализация построена так, чтобы не зависеть от конкретики протоколов. Основной структурой данных описывающей сетевой интерфейс (устройство) является struct net_device, к ней мы вернёмся позже, описывая устройство.
= = = = = = = = = =
здесь Рис. 4: сетевые уровни и уровни стека протоколов.
= = = = = = = = = =
А вот основной структурой обмениваемых данных (между сетевыми уровнями), на движении которой построена работа всех сетевых уровней — есть буферы сокетов (определения в <linux/skbuff.h>). Буфер сокетов состоит их двух частей: данные управления struct sk_buff, и данные пакета (указываемые в struct sk_buff указателями head и data). Буферы сокетов всегда увязываются в очереди (struct sk_queue_head) посредством своих двух первых полей next и prev. Вот некоторые поля структуры, которые позволяют представить её структуру:
typedef unsigned char *sk_buff_data_t; struct sk_buff { struct sk_buff *next; /* These two members must be first. */ struct sk_buff *prev; ... sk_buff_data_t transport_header; sk_buff_data_t network_header; sk_buff_data_t mac_header; ... unsigned char *head, *data; ... };
Структура вложенности заголовков в точности соответствует структуре инкапсуляции сетевых протоколов протоколов внутри друг друга, это позволяет обрабатывающему слою доступаться до информации, относящейся только к данному слою.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Интерфейс /sys | Драйверы: сетевой интерфейс |