Анатомия на Linux Network Stack, за системен администратор

Анатомия на Linux мрежовия стек

Една от най-големите характеристики на операционната система Linux® е нейният мрежов стек. Това е производно на BSD стека и е добре оборудвано със солиден набор от интерфейси, вариращи от агностични на протокол, като общ сокет или интерфейс на ниво устройство, до специфични интерфейси, специфични за мрежовия протокол. Тази статия изследва структурата на мрежовия стек на Linux по отношение на неговите слоеве и също така обсъжда някои от основните структури.

Въведение в протоколите

Докато официалното въведение в мрежата ни препраща към модела за взаимосвързаност на отворените системи (OSI), това въведение към основния мрежов стек в Linux използва четиристепенен модел, известен като интернет модел (виж Фигура 1).

Фигура 1. Интернет модел на мрежовия стек

В долната част на стека е каналният слой. Свързващ слой се отнася до драйвери на устройства, които осигуряват достъп до физическия слой, който може да се състои от множество носители като серийни връзки или Ethernet устройства. Над канала е мрежов слой, който е отговорен за маршрутизиране на пакети до тяхното местоназначение. Следващото ниво наречено транспорт отговорен за връзките между връстници (например в рамките на хост). Мрежовият слой управлява комуникацията между хостове, а транспортният слой контролира комуникацията между крайните точки в тези хостове. И накрая, има ниво на приложение, което обикновено е семантично и разбира преместени данни. Например протоколът за прехвърляне на хипертекст (HTTP) премества заявки и отговори за уеб съдържание между сървър и клиент.

Архитектура на основната мрежа

Сега нека да преминем към архитектурата на мрежовия стек на Linux и да видим как тя прилага интернет модела. Фигура 2 показва изглед на високо ниво на мрежовия стек на Linux. Най-отгоре е нивото на потребителското пространство или ниво на приложение, което определя потребителите на мрежовия стек. В долната част са физическите устройства, които осигуряват свързаност с мрежи (серийни или високоскоростни мрежи като Ethernet). В центъра или в пространството на ядрото е мрежовата подсистема, която е фокусът на тази статия. Сокетните буфери (sk_buffs) преминават през вътрешността на мрежовия стек, които преместват пакетни данни между източници и дестинации. Структурата sk_buff ще бъде показана за кратко.


Фигура 2. Архитектурата на високо ниво на мрежовия стек на Linux

Първо ви се предлага кратък преглед на основните елементи на мрежовата подсистема Linux, подробно описани в следващите раздели. В горната част (вижте фигура 2) има система, наречена интерфейс за системно повикване. Той просто предоставя начин на приложенията за потребителско пространство да получат достъп до подсистемата за мрежово ядро. Следващия е агностичният слой на протокола, който предоставя общ начин за работа с основните транспортни протоколи. Следват действителните протоколи, които в Linux включват вградени TCP, UDP и разбира се IP. Следващият е друг независим слой, който осигурява общ интерфейс към и от отделните налични драйвери на устройства, последван в края от самите драйвери.

Интерфейс за системно обаждане

Интерфейсът за системно обаждане може да бъде описан по два начина. Когато мрежово повикване е направено от потребител, то се мултиплексира чрез системно повикване към ядрото. Това завършва като извикване на sys_socketcall в ./net/socket.c, който след това демултиплексира повикването към предвидената цел. Друг изглед на интерфейса на системното повикване е използването на нормални файлови операции за мрежови вход/изход (I/O). Например, нормални операции за четене и запис могат да се извършват в мрежов сокет (който е представен от дескриптор на файл като нормален файл). Следователно, въпреки че има специфични за мрежата операции (създаване на сокет чрез извикване на сокет, свързването му с дескриптор чрез извикване на свързване и т.н.), има и редица стандартни файлови операции, които се прилагат към мрежови обекти като към обикновени файлове . И накрая, интерфейсът syscall предоставя средство за прехвърляне на контрол между приложението на потребителското пространство и ядрото.

Протокол агностичен интерфейс

Сокетният слой е агностичен интерфейс за протокол, който предоставя набор от стандартни функции за поддържане на редица различни протоколи. Този слой не само поддържа конвенционални протоколи TCP и UDP, но също така IP, суров Ethernet и други транспортни протоколи, като протокол за предаване на поточно управление (SCTP).

Комуникацията през мрежовия стек се осъществява чрез сокет. Структурата на сокета в Linux е struct sock, дефинирана в linux/include/net/sock.h. Тази голяма структура съдържа всички необходими състояния за отделен сокет, включително специфичния протокол, използван от сокета, и операциите, които могат да бъдат изпълнени върху него.