Tcp beágyazása
Helyezzen be egy TCP / IP stacket a GNU / Linux operációs rendszerbe
A protokollok vizsgálata meglehetősen érdekes tevékenység. Mégis, sok kutató vesz részt az értékelésben és az ellenőrzésben különböző helyzetekben. Személy szerint az IMM UrB RAS [1] munkájának első évében tanulmányoztam a protokollt. Nem számít, hogyan hangzik banális, ez TCP protokoll volt. Ennek oka, hogy elkezdtem ezt csinálni, a következő volt: szükséges volt megérteni a hálózatot az egyik számítástechnikai klaszterben. Amikor TCP-n keresztül továbbítja az adatokat 2 100 Mbps-nál. ugyanakkor a hálózati kártyák (az úgynevezett csatornázás vagy kötés) kétszeresére nőtt a sebesség, ugyanakkor a sebesség nemcsak a gigabites kártyákon növekedett, hanem akár 600 Mbit-re csökkent. másodpercek alatt. A Sniffer nem mutatott semmi különlegeset. És általánosságban elmondható, hogy a szippantás nem mindig ad részletes tájékoztatást arról, hogy mi történik a hálózatban. Ennek használatával megtudhatja, mi történt a hálózatban, és ezen az alapon megpróbálja megérteni, mi történt a protokollal. De ehhez legalább szükséges pontosan elképzelni a protokoll végrehajtását ebben az operációs rendszerben. Elfogadom, ez nem könnyű. És egyáltalán szükség van rá, amikor magának az operációs rendszernek és az összes protokollnak igaza van előttünk? Ráadásul, ha ez egy nyílt forráskódú operációs rendszer, ahol nincs semmi, ami rejtve lenne a szemünkből.
Annak a ténynek köszönhetően, hogy a Linux-rendszermag gyakran megváltozik, nehéz olyan példakódot írni, amely egyszerre több magot használ. Ebből a célból ez a cikk egy példát mutat be a TCP kernel veremének beágyazására a 2.6.12-es Linux-kernelben. Az alkalmazásban megtalálható a 2.6.18 rendszermag verziójának kódja (a VenROCK-nak köszönhetően, kényszerítve!).
Az OS GNU / Linux hálózati alrendszere
Ha az operációs rendszernek hálózati csomaggal kell működnie, akkor sk_buff. Olyan pillanatban jön létre, amikor a rendszer megkapta a csomagot a hálózattól, vagy amikor meg kell hoznia egy újat a küldéshez. Emiatt a hálózati veremben szinte minden funkció ezt a struktúrát kapja paraméterként. Fő célja, hogy egyszerűen és hatékonyan biztosítsa a csomaggal való együttműködést a hálózati verem minden hálózati rétegen (lásd 1. ábra). A sk_buff struktúra egy olyan vezérlőszerkezet, amelynek egy csatolt memóriablokkja van, amelyben a csomag található [2]. Így a változók változása a struktúrában megváltoztatjuk a csomag tartalmát vagy a szolgáltatás információit.
Ábra. 1. struktúra sk_buff
Ennek a szerkezetnek a fő részét az alábbiakban mutatjuk be.
Részletesebb leírás megtalálható a Linux kernel forráskódjában: include / linux / skbuff.h.
A teljes leírás megtalálható a / net / sock.h.
E két struktúra (struct sk_buff és struct sock) az Ön rendelkezésére áll, akkor csomagokat fogadhat és küldhet, adatokat küldhet a hálózati felületről a felhasználói alkalmazáshoz, és fordítva. De a zokni szerkezet csak a közös dolgokat írja le. Például nem tartalmazza a TCP szegmens várt szekvenciaszámát és sok más hasznos dolgot. Ebből a célból más struktúrák szolgálnak.
Minden protokollnak saját szerkezete van a szükséges információk tárolásához. Például TCP esetén ez a struktúra tcp_sock. az UDP - udp_sock esetében. folytassa önmagával :). Mindannyian örökölik a zokni szerkezetét. bár nem mindig közvetlenül, mint a tcp_sock esetében (lásd a 2. ábrát). A protokoll minden mulatsága megtalálható ezeken a struktúrákban - állapotában, időtúllépésekben, a várható csomag sorszámában és sok más konkrét információban. Így a legmegfelelőbb módja annak, hogy megtudja, mi történik a TCP protokollt használó gépen, az adatok olvasása a tcp_sock struktúrából.
Ábra. 2. Alátámassza a zoknit
Hozzáférés a tcp_sock struktúrához
És akkor az aljzat kivonódik:
A hash kiszámításának funkciója a tcp_hashfn. mivel a 2.6.18-as verziót inet_ehashfn () nevezte, és át lett helyezve a fejlécfájlba, így most nem kell leírni a kódot. De a 2.6.12 alatt írunk kódot, ezért meg kell vizsgálnunk, hogy hol és hogyan írjuk le ezt a funkciót. A forráskódja a net / ipv4 / tcp_ipv4.c fájlban is megtekinthető.
Érdemes megemlíteni egy fontos megfigyelést: a helyi portot a szokásos formában (LittleEndian) továbbítják, és a rendeltetési port a hálózati rendbájtban (BigEndian) van, azaz. htons (dest) kell végrehajtani. Az aljzat kivétele után a tcp_sock struktúrához való hozzáférés nagyon egyszerű:
Nos, akkor mi a szíved.
megjegyzés
Az ágazatban fennálló különbségek mellett 2.6. számos különbség van a TCP stack csatlakozásakor a 2.4-ben. De az egész különbség a struktúrák másik nevében rejlik, és enyhén más módon nyerik ki a foglalatot. Az elv ugyanaz marad.