Dokumentace tříd: PDU a EthFrame
Tento dokument detailně popisuje architekturu a rozhraní dvou klíčových objektů naší síťové simulace. Objektový návrh se zaměřuje na striktní zapouzdření dat, bezpečné nastavování atributů a ukázku základů dědičnosti včetně polymorfismu.
1. Abstraktní třída PDU (Protocol Data Unit)
Třída představuje zcela obecnou předlohu pro jakoukoliv datovou jednotku protokolu. Definuje jen naprostý základ – tedy samotný datový náklad (payload) a povinnost umět se sama zvalidovat. Z této třídy nelze vytvářet přímé instance (je abstraktní).
Atributy
payload(String): Samotný datový náklad, který se přenáší uvnitř jednotky. Atribut je zvenčí nepřístupný (private/protected) a pracuje se s ním výhradně přes přístupové metody.
Konstruktor
PDU(payload): Inicializuje datovou jednotku PDU tím, že bezpečně uloží doručená data. Implementace v sobě obsahuje bezpečnostní pojistku, která zamezí vytvoření "holého" PDU bez konkrétního síťového obalu (jako je např. Ethernetový rámec).
Metody (Přístupové)
get payload()/getPayload(): Návratová metoda (Getter), která ven vrátí aktuálně nesený datový náklad.set payload(val)/setPayload(val): Metoda (Setter), pomocí které je možné bezpečně zapsat do PDU nová data.
Metody (Abstraktní)
Následující metody slouží jako kontrakt (prázdná definice). Každý specifický potomek, který z PDU dědí, musí k metodám sám nutně implementovat vlastní blok kódu.
isValid(): Jakákoliv vrstva, která PDU rozšiřuje, musí mít logiku, jíž dokáže stoprocentně ověřit vlastní nerozbitost a vrátit datový typ boolean (true/false) o validitě objektu.
2. Třída EthFrame (Ethernetový rámec)
Třída reprezentuje konkrétní model Ethernetového rámce L2 síťové vrstvy. Třída rozšiřuje základní datovou jednotku PDU (dědí z ní přes klíčové slovo extends / v Pythonu s vnořením (PDU)) tak, že data obalí vlastní hlavičkou s MAC adresami a navíc doplní patičku Frame Check Sequence (FCS) pro odhalení poškození.
Vlastní atributy
- Všechny atributy jsou striktně chráněné proti přímému vypsání/přepsání (zapouzdřené).
dmac(String): Cílová (Destination) MAC adresa ve standardním hexadecimálním tvaru. Značí, na jakou síťovou kartu rámec putuje.smac(String): Zdrojová (Source) MAC adresa odesílatele rámce.type(Integer): EtherType identifikátor protokolu umístěného uvnitř payloadu (např. typicky0x0800pro IPv4 nebo0x0806pro ARP).fcs(Integer): Frame Check Sequence; kontrolní součet rámce vygenerovaný složitějším hashováním na základě spojení obsahu hlavičky a samotných dat z parentPDU. Pokud se po cestě cokoliv změní a hash neodpovídá, rámec je neplatný.
Konstruktor
EthFrame(dmac, smac, type, payload, fcs=null):- Okamžitě volá chráněný konstruktor svého rodiče
PDUa naloží do něj payload. - Pomocí statických metod detailně zvaliduje strukturu vstupních řetězců MAC adres (aby neskončil s nesmyslnými znaky a nesestavil nesmyslný síťový balík).
- Pokud není specifikován záměrně ruční
fcsk nasimulování chyb, automaticky se při zrození rámce vypočítá první správný kontrolní součet pomocí lokální metody a uloží se do pole.
- Okamžitě volá chráněný konstruktor svého rodiče
Statické metody
static isValidMac(mac): Pomocná utilita nezávislá na vzniku objektu. Obdrží do parametru slovo, které proti regulárnímu výrazu^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$vyhodnotí do podobytrue/false, čímž rozhoduje o validitě vzhledu MAC adres.
Instanční gettery a settery
Každý atribut rámce má explicitní Getter a Setter, který chrání logiku proměnných.
get / set dmac(val): Při volání setteru nejenže přepíše privátní lokální MAC hodnotu, ale rovnou zavolá bezpečnostní ověření a vygenerování nového validního kontrolního součtu (FCS).get / set smac(val): Stejně jako úprava dmac zaručuje ihned re-hash rámce a kontrolu MAC formátu.get / set type(val): Zapíše nový typ vloženého vyššího protokolu a vyvolá re-hash rámce pres FCS.set payload(val): Třída modifikuje (override) tuto vlastnost z rodiče tak, že po uložení nových dat dceřiný objekt sám chytře okamžitě přepíše FCS!get fcs(): Vrací aktuálně uložený kontrolní součet v patičce pro možnost ověření kódem. Není k němu volný Setter!
Instanční metody
calculateFcs(): Algoritmus, který zřetězí k sobě textové obsahy veškerých aktuálních vnitřních metadat a poslaného parent.payload do ohromného textu a z něj následně spočítá po jednotlivých ASCII znacích číselnou Hashovou obálku daného řetězce a vrátí ji z funkce ven v Integer formátu.recalculateFcs()(Privátní/Protected metoda): Zkrácená obálka na příkazthis.fcs = this.calculateFcs(), aby se nemuselo v settrerech plýtvat dlouze znaky s dosazováním.isValid()(overriding abstraktní z rodiče): Porovná, zda aktuálně vypočítaný kontrolní součet fyzicky sedí s tím, co si daný rámec teď konkrétně opravdu nese v paměti za hodnotu ve svém atributu (např. v JS jakofcs). Pokud ano, rámec je korektní a přežil let bez úhony. Vrací formát boolean (true/false).toString()/__str__(): Magická převádějící metoda. Pokud programátor potřebuje rámec ihned vypsat do formy debug textu v konzoli jako string, objekt se vyrenderuje v úhledném čitelném grafickém a seřazeném stringu[EthFrame] SRC: ... DST: ... DATA: ....
Výukové a pomocné metody
corruptData(): Demoliční zbraň stavěná čistě pro demonstrační použití. Zničí uvnitř rodičovské platformy data v Payload poli za string obsahující chybu přenosu a úmyslně zakáže v dceři jakékoliv re-hashování a kontrolní součet natvrdo přepálí vlastním číslem, který s novými daty obálky naprosto nekomunikuje. MetodaisValid()po tomto činu odhalí zničený paket.