Anatomy of a hálózati verem a linux

Bevezetés a jegyzőkönyvek

Míg a hivatalos bevezetés a hálózati gyakran hivatkoznak a modell a Nyílt rendszerek összekapcsolása (OSI - Nyílt rendszerek összekapcsolása), bevezetés az alapvető hálózati verem Linux a négy modellből ismert, mint az internet (internetes modell) (lásd 1. ábra) .

1. ábra: Az internet modell egy hálózati stack

Az alján a verem a kapcsolati réteg. Az adatkapcsolati réteg kapcsolódik a eszközmeghajtók, és hozzáférést biztosít a fizikai réteg, amely állhat több média, mint például szekvenciális csatornák vagy Ethernet eszközök. Fent a csatorna a hálózati rétegben. amely felelős csomagokat küld a cél. A következő szint az úgynevezett közlekedés felelős a peer (peer-to-peer) kommunikáció (pl egy host). A hálózati réteg vezérlők közötti kommunikáció a házigazdák és a közlekedés - a kölcsönhatás a végpontok belül ezek a gépek. Végül pedig ott van az alkalmazási réteg. ami általában kényszerült, és rájön, szemantikai adatokat. Például Hypertext Transfer Protocol (HTTP - Hypertext Transfer Protocol) mozog kérések és válaszok a webes tartalom között, a szerver és a kliens.

Core hálózati architektúra

Most viszont, hogy az építészet, a Linux hálózati verem, és hogyan valósítja meg az interneten modellt. A 2. ábrán egy magas szintű véve a Linux hálózati verem. Ezek közül a legfontosabb a felhasználói területet vagy alkalmazási réteg. amely meghatározza a felhasználó a hálózati verem. Az alján a fizikai eszközök. amely lehetővé teszi a kapcsolatot a hálózat (soros vagy nagy sebességű hálózatok, például Ethernet). A központban, vagy a kernel térben. - a hálózati alrendszer, amely a hangsúly ebben a cikkben. A hálózaton keresztül verem a tok belsejébe pufferek vizsgált (sk_buffs), melyek következtében a csomagkapcsolt adatok közötti források és vevők. Röviden sk_buff szerkezete lesz látható.

2. ábra: A magas szintű architektúra a Linux hálózati verem

Először is, itt van egy gyors áttekintést a legfontosabb elemei a hálózati alrendszer Linux részletesen a következő részekben. A tetején (lásd 2. ábra) egy olyan rendszer, az úgynevezett rendszer hívás interfész. Csak utat ad a felhasználó űralkalmazásokon, hogy hozzáférjen a hálózati alrendszer mag. Következő egy protokoll-független (protokoll agnosztikus) szint, amely közös munkába az alatta szállítási réteg protokollok. Következő a tényleges protokoll, ami Linux tartalmazza a beépített protokollok TCP, UDP, és természetesen, a VI. Következő - egy másik független réteg, amely egy közös felületet az egyes eszközmeghajtók rendelkezésre, és azokból, majd a végén ezek a vezetők maguk.

rendszer hívás interfész

rendszer hívás felület lehet leírni két módon. Amikor a hálózat hívás amit a felhasználó, akkor multiplexálják rendszeren keresztül hívást a kernel. Ez végül a kihívást sys_socketcall ./net/socket.c, amelyet azután de-multiplexek a hívás célpontja. Egy másik nézet a rendszer hívás felület - a normál fájlműveleteket hálózati bemenet / kimenet (I / O). Például a tipikus olvasási és írási műveletek hajthatók végre a hálózati csatlakozó (amely képviseli a fájl leíró, mint egy normál kép). Tehát míg vannak olyan műveletek, amelyek specifikusak a hálózat (létrehozása socket hívja a socket. Összekapcsolása, hogy kezelni egy hívást csatlakozni, és így tovább), ott is számos szabványos fájl műveletek, amelyek alkalmazzák a hálózati entitások, mint a közönséges fájlok. Végül a rendszer hívás felület biztosítja az eszközöket a vezérlést a felhasználói tér és a kernel.

Protokoll-független interfész (jegyzőkönyv agnosztikus interface)

Aljzatok réteg egy protokoll-független (protokoll agnosztikus) felület, amely egy sor szabványos funkciók támogatása több különböző protokollokat. Ez a réteg nem csak támogatja a hagyományos TCP - és az UDP-protokoll, hanem az IP, nyers Ethernet és más közlekedési protokollok, mint a Transmission Control Protocol adatfolyamok (SCTP - adatfolyam vezérlő Transmission Protocol).

A reakció játszódik le a hálózaton keresztül verem át a socket. socket szerkezet Linux - struct zokni. meghatározott linux / include / net / sock.h. Ez a nagy szerkezet tartalmazza az összes szükséges állapotának egyetlen foglalat, például egy konkrét protokoll által használt a foglalatra, és a művelet elvégezhető rajta.

A hálózat alrendszer tisztában van a rendelkezésre álló protokollok egy speciális szerkezet, amely meghatározza a képességeit. Mindegyik protokollt tartalmaz egy szerkezet az úgynevezett proto (ez a linux / include / net / sock.h). Ez a szerkezet határozza meg a foglalat különálló műveletek hajthatók végre az aljzatok réteg a szállítási réteg (például create aljzat, csatlakoztassa mind a foglalat, mint a foglalat zárva van, stb).

hálózati protokollok

Szakasz határozza meg bizonyos hálózati protokollok hálózati protokollok (például a TCP, UDP, és így tovább). Ezek inicializált elején a nap inet_init funkció linux / net / ipv4 / af_inet.c (mert a TCP és UDP egy család inet protokoll). inet_init függvény regisztrálja az egyes beépített protokollok használatával proto_register funkciót. Ez a funkció határozza meg a Linux / net / core / sock.c, és mellett, hozzátéve, hogy a listát a meglévő protokoll, ha szükséges, lehet hozzá egy vagy több födém-cache.

Láthatjuk, hogy az egyes protokollok azonosítani magukat a proto szerkezet fájlok tcp_ipv4.c, udp.c és raw.c, a linux / net / ipv4 /. Mindegyik protokoll struktúrák vannak leképezve típus és protokoll inetsw_array. mely attribútumok beágyazott protokollok működésüket. Inetsw_array szerkezete és kapcsolata a 3. ábrán látható Mind a protokollok a tömbbe inicializálja az elején a nap inetsw kihívás inet_register_protosw a inet_init. inet_init funkció is üzembe helyezi a különböző inet modulokat. mint például az ARP, ICMP, IP-modulok és TCP-UDP-inek.

3. ábra: Internet-protokoll tömb felépítése

Korrelációja aljzat és protokoll

Megjegyzés a 3. ábrán, hogy a proto szerkezete határozza meg a szállítási módok a foglalat, míg proto_ops szerkezet - általános. További protokollok is adhatunk a protokoll switch inetsw segítségével inet_register_protosw hívást. Például SCTP hozzáfűzi magát megtámadni sctp_init linux / net / SCTP / protocol.c. További információ a SCTP megtalálható Resources.

Adatáthelyezés aljzatok segítségével történik az alapszerkezet nevezett szoftvercsatorna pufferében (sk_buff). A sk_buff tartalmaz adatcsomag és az állami adatok, amelyek több szinten a protokoll. Mindegyik csomag küldött vagy fogadott képviselt sk_buff. sk_buff szerkezete van meghatározva linux / include / linux / skbuff.h és a 4. ábrán látható.

4. ábra szoftvercsatorna pufferében és kapcsolata más szerkezetek

Mint látható, több struktúrában sk_buff ehhez a kapcsolathoz össze lehet kapcsolni. Mindegyikük szerkezetét azonosítja az egy berendezés (net_device), egy csomagot küldött, vagy amelyből érkezett. Ahogy a csomagot a bemutatott sk_buff. csomagfejlécekben kényelmesen keresztül egy sor mutató (th. IPH és mac a Media Access Control (fejléc Media Access Control vagy MAC). Mivel sk_buff központi szerepet játszanak az aljzat információ menedzsment hozta létre számos támogató funkciókat. Vannak olyan funkciók létrehozására, megsemmisítése, klónozását és szekvenálását sk_buff.

Pufferek aljzatok vannak kialakítva, hogy egymással kommunikálni egy adott aljzat, és tartalmaz egy nagy mennyiségű információt, beleértve a hivatkozásokat protokoll fejlécek időbélyegek (amikor a csomagot küldött vagy fogadott), és a megfelelő eszköz.

Az eszköz-független interfész (Device agnosztikus interfész)

Az alábbiakban a protokollok réteg másik agnosztikus interfész réteget, amely összeköti protokollok különböző hardver eszközmeghajtók különböző képességekkel. Ez a szint egy szabványos funkciók, hogy a használt alacsony szintű hálózati eszközmeghajtók, hogy képes kölcsönhatásba lépni a magas szintű protokoll.

Először is, az eszközmeghajtók lehet regisztrálni és regisztrációját magát a kernel hívja register_netdevice vagy unregister_netdevice. A hívó fél első kitölti a struktúra net_device. majd továbbítja azt a regisztrációhoz. A kernel felhívja a funkcióját init (ha létezik), végez számos alapvető ellenőrzést, létrehoz egy sysfs bejegyzést, majd hozzáadja az új eszközt az eszköz lista (a csatlakoztatott készülékek listáját, amelyek aktívak a kernel). Net_device szerkezete megtalálható a linux / include / linux / netdevice.h. Egyes funkciók a linux / net / core / dev.c.

Hogy küldjön sk_buff a protokoll eszköz dev_queue_xmit funkció használatakor. Ez hozza a sk_buff sorban esetleges átviteli az eszközmeghajtó (meghatározott eszköz, segítségével egy mutatót vagy net_device sk_buff-> dev sk_buff). Dev szerkezet tartalmaz egy módszert nevű hard_start_xmit. hogy tartja a vezető funkciót kezdeményező átviteli sk_buff.

A csomag fogadása hagyományosan végre netif_rx. Amikor az alacsonyabb szintű eszközmeghajtó fogad egy csomagot (tartalmazott a kiválasztott sk_buff), sk_buff fölött van a hálózati réteg segítségével hívást netif_rx. Ez a funkció teszi sk_buff majd pedig a magasabb szintű protokoll további feldolgozásra útján netif_rx_schedule. Funkciók dev_queue_xmit és netif_rx vannak linux / net / core / dev.c.

Végül, egy új alkalmazási program interfész (NAPI) került bevezetésre kölcsönhatás a készülék agnosztikus réteg (dev) a sejtmagban. Ezt alkalmazzák egyes vezetők, de a túlnyomó többség még mindig a régebbi keret fogadásakor interfész (egy durva becslés hat hétből). NAPI eredményezhetnek jobb teljesítményt nagy terhelés alatt, elkerülve megszakítások minden beérkező keretre.

eszközmeghajtók

Alján a hálózati verem a illesztőprogramokat kezeli a fizikai hálózati eszközöket. Példák erre a szintre eszközök közé tartoznak a SLIP vezető soros vagy Ethernet driver over Ethernet eszközt.

Indítás közben az eszközmeghajtó osztja helyet net_device szerkezetét. majd inicializálja a szükséges rutint. Egyikük, az úgynevezett dev-> hard_start_xmit. határozza meg a felső szinten kell bevezetni az átadás sk_buff. Ő át sk_buff. Ez a funkció függ a berendezés, de ez általában egy csomag leírt sk_buff. átkerül az úgynevezett „hardware gyűrű” (hardver gyűrű) vagy a „queue” (queue). Frame átvételét, ahogy az a készülék agnosztikus réteg, használ netif_rx interfész, vagy netif_receive_skb egy NAPI-kompatibilis hálózati meghajtó. NAPI vezető korlátozza az a képessége, hogy az alapul szolgáló hardver. A részleteket lásd a Resources.

Miután az eszközillesztő létre azok kapcsolódási dev szerkezetét. hívás register_netdevice teszi áll a használatra. A linux / drivers / net, megtalálja illesztőprogramjait hálózati eszközöket.

megy előre

Linux forráskód - egy nagyszerű módja annak, hogy megtudjuk, a design vezetők a különböző típusú készülék, beleértve a hálózati eszközmeghajtók. Meg fogja találni különbségeket a tervezés és a kernel API elérhető, de minden hasznos lesz a használati utasítást, mint egy kiindulási pont az új driver. A többi kódot a hálózati verem a szokásos és használatos, amíg szükség van egy új protokollt. De még akkor is, a végrehajtás TCP (a streaming protokoll) vagy UDP (protokoll alapú üzenetküldő) szolgál hasznos modellek a kezdete egy új fejlesztés.

Get termékek és technológiák

  • A következő fejlesztési projekt Linux IBM próbaszoftver létrehozása szoftver. letölthető közvetlenül a developerWorksön. (EN)

Kapcsolódó cikkek