07.01.2013 Views

Vypracovane otazky k bakalarskym statnicim

Vypracovane otazky k bakalarskym statnicim

Vypracovane otazky k bakalarskym statnicim

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Učební texty k státní bakalářské zkoušce<br />

Obecná informatika<br />

Architektury počítačů a sítí<br />

študenti MFF<br />

15. augusta 2008<br />

1


5 Architektury počítačů a sítí<br />

Požadavky<br />

• Architektury počítače.<br />

• Procesory, multiprocesory.<br />

• Vstupní a výstupní zařízení, ukládání a přenos dat.<br />

• Architektury OS.<br />

• Procesy, vlákna, plánování.<br />

• Synchronizační primitiva, vzájemné vyloučení.<br />

• Zablokování a zotavení z něj.<br />

• Organizace paměti, alokační algoritmy.<br />

• Principy virtuální paměti, stránkování.<br />

• Systémy souborů, adresářové struktury.<br />

• Bezpečnost, autentifikace, autorizace, přístupová práva.<br />

• ISO/OSI vrstevnatá architektura sítí.<br />

• TCP/IP.<br />

• Spojované a nespojované služby, spolehlivost, zabezpečení protokolů.<br />

5.1 Architektury počítače<br />

Definice (Architektura počítača)<br />

Architektura počítača popisuje „všetko, čo by mal vedieť ten, ktorý programuje v<br />

assembleri / tvorí operačný systém�. Teda:<br />

• z akých častí – štruktúra počítača, usporadanie<br />

• význam častí – funkcia časti, ich vnútorná štruktúra<br />

• ako spolu časti komunikujú – riadenie komukácie<br />

• ako sa jednotlivé časti ovládajú, aká je ich funkčnosť navonok<br />

Definice (Víceúrovňová organizace počítače)<br />

• Mikroprogramová úroveň (priamo technické vybavenie počítača)<br />

• Strojový jazyk počítače (virtuálny stroj nad obvodovým riešením; vybavenie –<br />

popis architektúry a organizácie)<br />

• Úroveň operačního systému (doplnenie predchádzajúcej úrovne o súbor makroinštrukcií<br />

a novú organizáciu pamäti)<br />

• Úroveň assembleru (najnižšia úroveň ľudsky orientovaného jazyka)<br />

• Úroveň vyšších programovacích jazyků (obecné alebo problémovo orientované;<br />

prvá nestrojovo orientovaná úroveň)<br />

• Úroveň aplikačních programů<br />

2


Je teda potrebné definovať<br />

• Inštrukčný súbor (definícia prechodovej funkcie medzi stavmi počítača, formát<br />

inštrukcie, spôsob zápisu, možnosti adresovania operandov)<br />

• Registrový model (rozlišovanie registrov procesoru: podľa voľby, pomocou určenia<br />

registru – explicitný/implicitný register; podľa funkcie registru – riadiaci<br />

register/register operandu)<br />

• Definice specializovaných jednotek (jednotka na výpočet vo floatoch;<br />

fetch/decode/execute jednotky)<br />

• Paralelismy (rozklad na úlohy, ktoré sa dajú spracovať súčasne – granularita<br />

(programy, podprogramy, inštrukcie...))<br />

• Stupeň predikce (schopnosť pripraviť sa na očakávanú udalosť (načítanie inštrukcie,<br />

nastavenie prenosu dát) – explicitná predikcia, štatistika, heuristiky,<br />

adaptívna predikcia)<br />

• Datové struktury a reprezentáciu dát (spôsob uloženia dát v počítači, mapovacie<br />

funkcie medzi reálnym svetom a vnútorným uložením, minimálna a<br />

maximálna veľkosť adresovateľné jednotky)<br />

• Adresové konvencie (ako sa pristupuje k dátovým štruktúram – segment+offset<br />

alebo lineárna adresácia; veľkosť pamäti a jej šírika, „povolené� miesta)<br />

• Řízení (spolupráca procesoru a ostatných jednotiek, interakcia s okolím, prerušenia<br />

– vnútorne/vonkajšie)<br />

• Vstupy a výstupy (metódy prenosu dát medzi procesorom a ostatnými jednotkami/počítačom<br />

a okolím; zahrňuje definície dátových štruktúr, identifikácia<br />

zdroja/cieľa, dátových ciest, protokoly, reakcie na chyby).<br />

• Šíře datových cest<br />

• Stupeň sdílení (na úrovni obvodov – zdieľanie obvodov procesoru a IO; na<br />

úrovni jednotiek – zdieľanie ALU viacerými procesormi)<br />

Základní dvě architektury počítačů<br />

Von Neumannova<br />

• Počítač se skládá z řídící jednotky, ALU, paměti a I/O jednotek<br />

• Štruktúra počítača sa nemení typom úlohy (tj. počítač je programovaný obsahem<br />

paměti).<br />

• Program se nejprve zavede do paměti, z ní se postupně popořadě vybírají instrukce<br />

(a následující krok závisí na předchozím), pořadí lze změnit instrukcemi<br />

skoku.<br />

• Do jedné paměti, dělené na buňky stejné velikosti, se ukládají i zpracovávaná<br />

data. Data jsou reprezentovaná binárně.<br />

• V každém okamžiku je vykonávána jen jedna činnost. Je to architektura SISD<br />

(viz Flynnova taxonomie).<br />

3


Je pevně daná instrukční sada. Strojová instrukce obsahuje operační znak,<br />

který určuje druh operace, počet parametrů atd., a operandovú část – umístnění<br />

jednotlivých operandů. Vykonat jednu instrukci znamená:<br />

• (fetch) načítať inštrukciu z pamäti do procesoru<br />

• (decode) zistiť o akú inštrukciu ide<br />

• (load) pripraviť zdrojové operandy<br />

• (execute) vykonať operáciu<br />

• (store) uloziť cieľové operandy<br />

Při vykonávání programu jsou potřebné různé registry – nejdůležitější jsou: PC<br />

(Program Counter, obsahuje adresu následující instrukce), IR (Instruction Register,<br />

adresa právě vykonávané instrukce), SP (Stack Pointer, ukazatel na vrchol<br />

zásobníku), MAR (memory access register – adresa do operační paměti), MBR<br />

(memory buffer register, dáta čítána/zapisována do paměti).<br />

Struktura jednoprocesorového počítače podle Von Neumanna:<br />

Harvardská<br />

Vytvořena až po Von Neumannově, liší se hlavně tím, že program se ukládá do<br />

jiné paměti než data (tzn. jsou 2 „druhy paměti� – instrukcí a dat). Příklady jsou<br />

DSP procesory a mikrokontrolery (např. AVR od Atmelu, a PIC – mají paměť na<br />

program a data a RISC instrukční sadu; výhoda oddělených pamětí je, že můžou<br />

mít různou bitovou hloubku – 8 bitové data, ale 12-, 14- či 16- bitové instrukce<br />

(např. ARM musí občas použít více než jednou instrukci na zpracování obsahu<br />

plné velikosti)).<br />

Oproti Von Neumannově nehrozí nebezpečí přepsání programu sebou samým,<br />

ale kvůli většímu počtu paměťových sběrnic je náročnější na výrobu. Paměť navíc<br />

nelze dělit podle potřeby (rozdělení je už dané).<br />

5.2 Procesory, multiprocesory<br />

Definice (Procesor)<br />

Procesor (CPU – central processing unit) je ústřední výkonnou jednotkou počítače,<br />

která čte z paměti instrukce a na jejich základě vykonává program.<br />

Základnými súčasťami procesora sú:<br />

4


• řadič nebo řídicí jednotka, která řídí tok programu, tj. načítání instrukcí, jejich<br />

dekódování, načítání operandů instrukcí z operační paměti a ukládání výsledků<br />

zpracování instrukcí<br />

• sada registrů k uchování operandů a mezivýsledků.<br />

• jedna nebo více aritmeticko-logických jednotek (ALU), které provádí s daty<br />

aritmetické a logické operace.<br />

• některé procesory obsahují jednu nebo několik jednotek plovoucí čárky (FPU),<br />

které provádí operace v plovoucí řádové čárce.<br />

Poznámka<br />

Súčasné procesory navyše často obsahujú ďalšie rozsiahle funkčné bloky (cache,<br />

rôzne periférie) – ktoré z „ortodoxného hladiska� nie sú priamo súčasťou jadra<br />

procesoru. Niektoré procesory môžu obsahovať viac jadier (+logiku slúžiacu k<br />

ich vzájomnému prepojeniu). Ďalším trendom je SoC (System on Chip), kde sa<br />

na čipe procesora nachádzajú aj ďalšie subsystémy napr. na spracovanie zvuku,<br />

grafiky alebo pripojenie externých periférií (takéto riešenia sa využívajú väčšinou<br />

v PDA, domácej elektronike, mobiloch atď.).<br />

Dělení podle instruční sady<br />

Podľa inštrukčnej sady je možné procesory rozdeliť na:<br />

• CISC (Complex Instruction Set Computer): poskytuje rozsiahlu inštrukčnú<br />

sadu spolu s rôznymi variantami inštrukcií. Jedna inštrukcia napr. môže vykonať<br />

veľa low-level operácií (načítanie z pamäti, vykonať aritmetickú operáciu a<br />

výsledok uložiť). Takéto inštrukcie zjednodušovali zápis programov (inštrukcie<br />

boli bližšie vyšším programovacím jazykom) a zmenšovali veľkosť programu a<br />

počet prístupov do pamäti – čo bolo v 60tych rokoch dôležité. Avšak nie vždy<br />

je vykonanie jednej zložitej operácie rýchlejšie ako vykonanie viac menej zložitých<br />

miesto toho (napr. kvôli zložitému dekódovaniu a použitiu mikrokódu<br />

na volanie jednoduchých „podinštrukcií�). Príkladmi CISC architektúr procesorov<br />

sú System/360, Motorola 68000 a Intel x86. V súčasnosti napr. x86<br />

rozkladá zložité inštrukcie na „micro-operations� ktoré môžu byť pipeline-ou<br />

spracované paralelne a vyšší výkon je tak dosahovaný na väčšom rozsahu inštrukcií.<br />

Vďaka tomu sú súčasné x86 procesory minimálne rovnako výkonné<br />

ako ozajstné RISC architektúry.<br />

• RISC (Reduced Instruction Set Computer): design CPU ktorý uprednosňuje<br />

jednoduchšiu inštrukčnú sadu a menšiu zložitosť adresovacích modelov – vďaka<br />

čomu je možné dosiahnuť lacnejšiu implementáciu, väčšiu úroveň paralelizmu<br />

a účinnejšie kompilátory. Dôvodom vzniku bolo aj nevyužívanie celej CISC<br />

inštrukčnej sady a upredňostňovania len obmedzenej podmnožiny (designéri<br />

procesorov potom optimalizovali len tieto podmnožiny a tak sa zvyšné inštrukcie<br />

používali ešte menej...). Kvôli väčšiemu počtu inštrukcií však musia<br />

RISC procesory častejšie pristupovať k pamäti... Príkladmi RISC procesorov<br />

sú napr. SPARC a ARM. V architekturách typu Post-RISC jde o spojení<br />

RISCových vlastností s technikami zvýšení výkonu, jako je out-of-order vykonávání<br />

a paralelismus.<br />

5


• VLIW: Very Long Instruction Word or VLIW refers to a CPU architecture<br />

designed to take advantage of instruction level parallelism (ILP). A processor<br />

that executes every instruction one after the other (i.e. a non-pipelined scalar<br />

architecture) may use processor resources inefficiently, potentially leading to<br />

poor performance. The performance can be improved by executing different<br />

sub-steps of sequential instructions simultaneously (this is pipelining), or even<br />

executing multiple instructions entirely simultaneously as in superscalar architectures.<br />

The VLIW approach, on the other hand, executes operation in<br />

parallel based on a fixed schedule determined when programs are compiled.<br />

Since determining the order of execution of operations (including which operations<br />

can execute simultaneously) is handled by the compiler, the processor<br />

does not need the scheduling hardware that the three techniques described<br />

above require. As a result, VLIW CPUs offer significant computational power<br />

with less hardware complexity (but greater compiler complexity) than is<br />

associated with most superscalar CPUs.<br />

• EPIC: (Někdy označován za poddruh VLIW) Explicitly Parallel Instruction<br />

Computing (EPIC) is a computing paradigm that began to be researched in<br />

the 1990s. This paradigm is also called Independence architectures. It was<br />

used by Intel and HP in the development of Intel’s IA-64 architecture, and has<br />

been implemented in Intel’s Itanium and Itanium 2 line of server processors.<br />

The goal of EPIC was to increase the ability of microprocessors to execute<br />

software instructions in parallel, by using the compiler, rather than complex<br />

on-die circuitry, to identify and leverage opportunities for parallel execution.<br />

This would allow performance to be scaled more rapidly in future processor<br />

designs, without resorting to ever-higher clock frequencies, which have since<br />

become problematic due to associated power and cooling issues.<br />

TODO: asi opravit, možná zpřesnit VLIW a EPIC a určitě přeložit<br />

Řekneme, že procesor má ortogonální instrukční sadu, pokud žádná instrukce<br />

nepředpokládá implicitně použití některých registrů. To umožňuje jednodušší práci<br />

algoritmům přidělování registrů v překladačích. Příkladem neortogonální instrukční<br />

sady je i x86.<br />

Další dělení<br />

Ďalej je možné procesory rozdeliť podľa dĺžky operandov v bitoch (8, 16, 32, 64...),<br />

ktorý je procesor schopný spracovať v jednom kroku. V embedded zariadeniach sa<br />

najčastejšie používajú 4- a 8-bitové procesory. V PDA, mobiloch a videohrách 8<br />

resp. 16 bitové. 32 a viac bitov využíajú napr. osobné počítače a laserové tlačiarne.<br />

Dôležitou vlastnosťou je aj taktovacia frekvencia jadra, MIPS (millions of instructions<br />

per second) a jeho rýchlosť. V súčasnosti je ťažké dávať do súvislosti<br />

výkon procesorov s ich frekvenciou (resp. MIPS) – kým Pentium zvládne na výpočet<br />

vo floatoch, jednoduchý 8-bitový PIC na to potrebuje oveľa viac taktov.<br />

Ďalším „problémom� je superskalarita procesorov, ktorá im umožňuje vykonať<br />

viacero nezávislých inštrukcií počas jedného taktu.<br />

6


Techniky pro zvýšení výkonu<br />

Zvyšovať výkon (procesorov) je možné viacerými spôsobmi. Najjednoduchším (a<br />

najpomalším) typom je Subskalárny CPU (načíta a spracúva len jednu inštrukciu<br />

naraz – preto musí celý procesor čakať kým vykonávanie inštrukcie skončí; je tak<br />

zdržovaný dlhšie trvajúcimi inštrukciami).<br />

Pokusy o dosiahnutie skalárneho a lepšieho výkonu vyústili do designov ktoré<br />

sa správajú menej lineárne a viac paralelne. Čo sa týka paralelizmu v procesoroch,<br />

používajú sa dva druhy pojmov na ich klasifikáciu – Instruction level parallelism<br />

(zvyšovanie rýchlosti vykonávania inštrukcií v procesore a teda zväčšovanie využitia<br />

prostriedkov na čipe) a Thread level parallelism (zväčšovanie počtu vlákien,<br />

ktoré dokáže CPU vykonávať naraz).<br />

• pipeline: Zlepšenie je možné dosiahnúť pomocou „instruction pipelining�-u,<br />

ktoré je použíté vo väčšine moderných procesorov. Umožňuje vykonanie viac<br />

ako jednej inštrukcie v jednom kroku vďaka rozloženiu spracovávania inštrukcie<br />

na viac menších krokov:<br />

• superskalarita: Dialša možnosť je použitie superscalar designu, ktorý obsahuje<br />

dlhú inštrukčnú pipeline a viacero identických execution jednotiek.<br />

• Out of order execution<br />

1. Načtení instrukce, případně její rozdrobení na mikroinstrukce<br />

2. Zařazení do vyčkávací stanice (instruction pool)<br />

3. Instrukce čeká na všechny svoje operandy<br />

4. Instrukce se vykoná ve své výkonné jednotce (je vybírána z instruction<br />

poolu nezávisle na ostatních)<br />

5. Výsledky se uchovají ve frontě (reorder buffer)<br />

7


6. Až se všechny starší instrukce zapíší do registrů, zapíše se výsledek této<br />

instrukce (opětovné řazení)<br />

• Predikce skoků – hluboké pipeliny mají problém, pokud podmíněný skok<br />

není proveden; dynamická predicke skoků (historie CPU – vzory nějaké hloubky)<br />

vs. statická (bez nápovědy – skok vpřed se neprovede, skok vzad se provede; s<br />

nápovědou – překladač odhaduje pravděpodobnost skoku)<br />

• Spekulativní vykonávaní – vykonávání kódu, který nemusí být zapotřebí;<br />

významná disproporce mezi rychlostí CPU a paměti; typické využití je značné<br />

předsunutí čtecích operací; CPU provádí i odsouvání zápisových operací<br />

• Data parallelism: SIMD inštrukcie (napr. multimediálne inštrukcie), vektorové<br />

procesory...<br />

Multiprocesory<br />

TODO: jde o copy & paste z Wiki ... předělat česky/slovensky<br />

Definice (Multiprocesor)<br />

O multiprocesoru mluvíme, pokud je použito dvou nebo více procesorů (CPU)<br />

v rámci jednoho počítačového systému. Termín je také používán mluvíme-li o<br />

schopnosti systému využívat více procesorů a/nebo schopnosti rozdělovat úlohy<br />

mezi jednotlivými procesory.<br />

Vztah k datům a instrukcím<br />

In multiprocessing, the processors can be used to execute a single sequence of<br />

instructions in multiple contexts (single-instruction, multiple-data or SIMD, often<br />

used in vector processing), multiple sequences of instructions in a single context<br />

(multiple-instruction, single-data or MISD, used for redundancy in fail-safe systems<br />

and sometimes applied to describe pipelined processors or hyperthreading),<br />

or multiple sequences of instructions in multiple contexts (multiple-instruction,<br />

multiple-data or MIMD).<br />

Symetrie<br />

In a multiprocessing system, all CPUs may be equal, or some may be reserved<br />

for special purposes. A combination of hardware and operating-system software<br />

design considerations determine the symmetry (or lack thereof) in a given system.<br />

For example, hardware or software considerations may require that only one CPU<br />

respond to all hardware interrupts, whereas all other work in the system may be<br />

distributed equally among CPUs; or execution of kernel-mode code may be restricted<br />

to only one processor (either a specific processor, or only one processor<br />

at a time), whereas user-mode code may be executed in any combination of processors.<br />

Multiprocessing systems are often easier to design if such restrictions are<br />

imposed, but they tend to be less efficient than systems in which all CPUs are<br />

utilized equally.<br />

Systems that treat all CPUs equally are called symmetric multiprocessing<br />

(SMP) systems. In systems where all CPUs are not equal, system resources may be<br />

8


divided in a number of ways, including asymmetric multiprocessing (ASMP), nonuniform<br />

memory access (NUMA) multiprocessing, and clustered multiprocessing<br />

(qq.v.).<br />

Těsnost spojení multiprocesorů<br />

• Tightly-coupled multiprocessor systems contain multiple CPUs that are connected<br />

at the bus level. These CPUs may have access to a central shared memory<br />

(SMP or UMA), or may participate in a memory hierarchy with both<br />

local and shared memory (NUMA). The IBM p690 Regatta is an example of<br />

a high end SMP system. Intel Xeon processors dominated the multiprocessor<br />

market for business PCs and were the only x86 option till the release of AMD’s<br />

Opteron range of processors in 2004. Both ranges of processors had their own<br />

onboard cache but provided access to shared memory; the Xeon processors via<br />

a common pipe and the Opteron processors via independent pathways to the<br />

system RAM.<br />

• Chip multiprocessors, also known as multi-core computing, involves more<br />

than one processor placed on a single chip and can be thought of the most<br />

extreme form of tightly-coupled multiprocessing. Mainframe systems with multiple<br />

processors are often tightly-coupled.<br />

• Loosely-coupled multiprocessor systems (often referred to as clusters) are<br />

based on multiple standalone single or dual processor commodity computers<br />

interconnected via a high speed communication system (Gigabit Ethernet is<br />

common). A Linux Beowulf cluster is an example of a loosely-coupled system.<br />

Tightly-coupled systems perform better and are physically smaller than looselycoupled<br />

systems, but have historically required greater initial investments and may<br />

depreciate rapidly; nodes in a loosely-coupled system are usually inexpensive commodity<br />

computers and can be recycled as independent machines upon retirement<br />

from the cluster.<br />

SMP (Symmetric Multiprocessing): viac procesorov so zdieľanou operačnou<br />

pamäťou (nutné mechanizmy na zabránenie nesprávnych náhľadov na pamäť a<br />

migráciu procesov medzi procesormi). SMP systems allow any processor to work<br />

on any task no matter where the data for that task are located in memory; with<br />

proper operating system support, SMP systems can easily move tasks between<br />

processors to balance the workload efficiently.<br />

5.3 Vstupní a výstupní zařízení<br />

K I/O zařízením je možné přistupovat dvěma způsoby: pomocí portů (speciální<br />

adresový port CPU) nebo pamětovým mapováním (namapování do fyzické paměti).<br />

Zařízení mají různé charakteristiky:<br />

• druh – blokové (disk, síťová karta), znakové (klávesnice, myš)<br />

• přístup – sekvenční (datová páska), náhodný (hdd, cd)<br />

9


• komunikace – synchronní (pracuje s daty na žádost – disk), asynchronní<br />

(„nevyžádaná� data – síťová karta)<br />

• sdílení – sdílené (preemptivní, lze odebrat – síťová karta (po multiplexu OS)),<br />

vyhrazené (nepreemptivní – tiskárna, sdílení se realizuje přes spooling). Reálně<br />

se rozdíly stírají.<br />

• rychlost (od několika Bps po GBps)<br />

• směr dat – R/W, R/O (CD-ROM), W/O (tiskárna)<br />

Přenos dat mezi zařízením a CPU/pamětí:<br />

• polling – aktivní čekání na změnu zařízení, přenos provádí CPU<br />

• přerušení – asynchronní přerušení od zařízení, přenos provádí CPU<br />

• DMA (Direct Memory Access) – zařízení si samo řídí přístup na sběrnici<br />

a přenáší data z/do paměti; po skončení přenosu přerušení (oznámení o<br />

dokončení)<br />

Cíle I/O software:<br />

• Nezávislost zařízení – programy nemusí dopředu vědět, s jakým přesně zařízením<br />

budou pracovat – je jedno jestli pracuji se souborem na pevném disku,<br />

disketě nebo na CD-ROM<br />

• Jednotné pojmenování (na UNIXu /dev)<br />

• Připojení (mount) – časté u vyměnitelných zařízení (disketa); možné i u<br />

pevných zařízení (disk); nutné pro správnou funkci cache OS<br />

• Obsluha chyb – v mnoha případech oprava bez vědomí uživatele (velmi často<br />

způsobeno právě uživatelem)<br />

5.4 Architektury OS<br />

Klasická struktura – monolitická<br />

Nejstarší, už IBM 360, Unix, Win., všechny služby uvnitř, prováděny ve chráněném<br />

módu, jádro poměrně velké, „údajně� nejrychlejší. Program zavolá službu OS, přes<br />

tabulku se zjistí adresa přísl. fce, ta se zavolá a vrátí výsledek. Nevýhoda: horší<br />

údržba – je-li v programu chyba, může poškodit zbývající části systému, rozšiřování<br />

za běhu je komplikované.<br />

Virtuální stroje<br />

Původní nápad : Virtual Machine pro IBM360 – oddělit multitasking od OS jako<br />

ext. stroj. Nad HW byla další vrstva – „Virtual Machine� – měla plánovat, vyrábí<br />

pro procesy iluzi holého HW; dneska např. VMWare dělá to samé. Pro IBM360 se<br />

dalo použít v kombinaci s CMS (jednoúlohový) i původního OS360 (rychlejší než<br />

OS360 na holém HW).<br />

Dnes: definuji abstraktní stroj, pro něj překládám programy (.NET, Java) →<br />

přenositelnost, kompatibilita (IBM AS400 – desítky let), problém – pomalé.<br />

10


Mikrojádro<br />

snaha aby část běžící v kernel módu byla co nejmenší (třeba jen cca 10 KB),<br />

nejnovější, experimentální, často pro Distribuované OS (dnes už nepoužívané),<br />

hodně procesů & komunikace (klient/server), mikrojádro řeší jenom komunikaci.<br />

Filesystém apod. jsou procesy – aplikace jim posílají přes jádro požadavky.<br />

Jediný komerční OS – Chorus (ústředny). výhoda: když něco spadne, nepoškodí to<br />

zbytek, moduly jdou měnit za běhu, komunikace jde snadno rozšířit na komunikaci<br />

po síti.<br />

Architektura WinNT<br />

Jádro je poměrně malé (cca 1MB), schopné (pro vyšší vrstvy jsou některé schopnosti<br />

skryté), na jeho vzniku se podíleli schopní Unixáři. Byla zde snaha o malou<br />

velikost, přenositelnost. Jádro je neutrální vzhledem k vyšším vrstvám, nad ním<br />

lze vybudovat různé systémy (Windows subsystém, POSIX, OS/2).<br />

Rozhraní OS a uživ. programů zajišťuje WinAPI, nad ním se nacházejí různé<br />

DLL, mezi kernelem a HW je „hardware abstraction layer�, tj. kernel lze jednoduše<br />

upravit pro jiné architektury (Alpha, IA-64). Grafické drivery jediné mají přímý<br />

přístup k HW (kvůli výkonu), části API (USER, GDI) jsou implementované v<br />

jádře, přechod mezi user a kernel režimem zajišťuje ntdll.dll (a je tedy využíván<br />

všemi programy). Veškeré služby a aplikace běží v user módu nad jádrem.<br />

Architektura Linuxu<br />

• Na úrovni SW – přenositelnost; abstrakce HW.<br />

• nad HW – kernel, nad ním systémová volání, hodně podobné Windows.<br />

11


5.5 Procesy, vlákna, plánování<br />

Procesy a vlákna<br />

Systémové volání je interface mezi OS (kernelspace) a užívatelskými programy (userspace).<br />

Definice (Proces)<br />

Proces je inštancia vykonávaného programu. Kým program je len súbor inštrukcií,<br />

proces je vlastný „výkon� týchto inštrukcií. Proces má vlastný adresný priestor<br />

(pamäť), prostriedky, práva a napr. aj ID (Process ID).<br />

Počas života sa môže proces nachádzať v rôznych stavoch:<br />

• bežiaci – jeden proces na procesor,<br />

• blokovaný – pri použití blokujúceho volania – I/O disku atď.,<br />

• pripravený – skončilo blokovanie; spotreboval všetok pridelený čas resp. vrátil<br />

riadenie systému, čaká na nové pridelenie procesora,<br />

• zombie – po ukončení procesu, keď už nepracuje – ale ešte nebol vymazaný.<br />

Definice (Vlákno)<br />

Vlákno je možnosť pre program ako sa „rozdeliť� na dva alebo viac zároveň (resp.<br />

pseudo-zároveň) vykonávaných úloh. Oproti procesu mu nie je pridelená vlastná<br />

pamäť – je to len miesto vykonávania inštrukcií v programe. Oproti procesu sú<br />

jeho „atribútmi� len hodnota programového čítača, stav registrov CPU a zásobník.<br />

Oproti Windows/Solaris neobsahuje Linux priamu podporu pre vlákna. Miesto<br />

toho podporuje procesy (zhodou okolností :-)) zdieľajúce pamäť. V samotnom jadre<br />

linuxu ale vlákna existujú (kthreads).<br />

Plánovanie<br />

Prideľovanie procesorového času jednotlivým procesom má na starosti plánovač.<br />

Plánovanie pritom môže byť preemptívne alebo nepreemptívne (kooperatívne – alla<br />

Win16).<br />

Ciele plánovania (niektoré z nich sú očividne protichodné):<br />

• Spravodlivosť (každy procesor dostane adekvátnu časť času CPU)<br />

• Efektívnosť (plne vyťažený procesor)<br />

• Minimálna doba odpovede<br />

• Průchodnost (maximálny počet spracovaných procesov)<br />

• Minimálna réžia systému<br />

Kritériá plánovania:<br />

• Viazanosť procesu na dané CPU a I/O (presun procesu na iný procesor zaberie<br />

veľa prostriedkov)<br />

• Proces je dávkovy/interaktívny?<br />

• Priorita procesu (statická (nemenná – okrem „renice�) + dynamická, ktorá sa<br />

mení v čase kvôli spravodlivosti)<br />

12


• Ako často proces generuje výpadky stránok (nejaký popis???)<br />

• Kolik skutočného času CPU proces obdržel<br />

Algoritmy:<br />

• FIFO: nepreemptívny, proces opustí procesor až po skončení<br />

• Round Robin: preemptívne rozšírenie FIFO, po skončení časového kvanta je<br />

proces presunutý na koniec fronty<br />

• Plánovanie s viacerými frontami: niekoľko front, procesu z i-tej fronty<br />

je pridelený procesor až keď vo frontách 1, . . . , i − 1 nie je pripravený ziadny<br />

proces. Ak proces skončil I/O operáciou, je blokovaný a presunutý do fronty<br />

i − 1, ak skončil preempciou, je pripravený a presunutý do fronty i + 1.<br />

• SMP: fronta CPU čakajúcich na pripravené procesy (aktívne (spotrebováva<br />

energiu) vs. pasívne čakanie (špeciálne inštrukcie)), „vzťah�/afinita procesov<br />

k CPU<br />

• TODO: Plánovanie windows vs. linux???<br />

5.6 Synchronizační primitiva, vzájemné vyloučení<br />

Pojmy<br />

Race conditions: výsledek operace závisí na plánování<br />

Vzájemné vyloučení (mutual exclusion): kritickou operaci provádí nejvýše jeden<br />

proces. Podmínky vzájemného vyloučení:<br />

1. Žádné dva procesy nemohou být najednou ve stejné kritické sekci<br />

2. Nemohou být učiněny žádné předpoklady o rychlosti nebo počtu CPU<br />

3. Žádný proces mimo kritickou sekci nesmí blokovat jiný proces<br />

4. Žádný proces nesmí čekat nekonečně dlouho v kritické sekci<br />

Kritická sekce: část programu, kde se provádí kritická operace<br />

Metody dosáhnutí vzájemného vyloučení: aktivní čekání (busy waiting) a pasivní<br />

čekání/blokování.<br />

Aktivní čekání<br />

Vlastnosti: spotřebovává čas procesoru, vhodnější pro předpokládané krátké doby<br />

čekání, nespotřebovává prostředky OS, rychlejší.<br />

Je možné použít např. zakázání přerušení (vhodné pro jádro OS). Používání<br />

zámků nefunguje:<br />

int lock;<br />

void proc(void) {<br />

for (;;) {<br />

nekritická_sekce();<br />

while (lock != 0);<br />

13


}<br />

}<br />

lock = 1;<br />

kritická_sekce();<br />

lock = 0;<br />

ale důsledné střídání ano (to ale porušuje podmínku 3.)<br />

int turn = 0;<br />

void p1(void) void p2(void)<br />

{ {<br />

for (;;) { for (;;) {<br />

while (turn != 0); while (turn != 1);<br />

kritická_sekce(); kritická_sekce();<br />

turn = 1; turn = 0;<br />

nekritická_sekce(); nekritická_sekce();<br />

} }<br />

} }<br />

Petersonovo řešení:<br />

#define N 2 /* počet procesů */<br />

int turn;<br />

int interested[N]; /* kdo má zájem */<br />

void enter_region(int proc) { /* proc: kdo vstupuje */<br />

int other;<br />

}<br />

other = 1-proc; /* číslo opačného procesu */<br />

interested[proc] = TRUE; /* mám zájem o vstup */<br />

turn = proc; /* nastav příznak */<br />

while (turn == proc && interested[other] == TRUE);<br />

void leave_region(int proc) { /* proc: kdo vystupuje */<br />

interested[proc] = FALSE; /* už odcházím */<br />

}<br />

Instrukce TSL (spin-lock) - je nutné aby ji podporoval HW (všechny současné<br />

procesory nějakou mají):<br />

enter_region:<br />

tsl R,lock ; načti zámek do registru R a<br />

; nastav zámek na 1<br />

cmp R,#0 ; byl zámek nulový?<br />

jnz enter_region ; byl-li nenulový, znova<br />

14


et ; návrat k volajícímu - vstup do<br />

; kritické sekce<br />

leave_region:<br />

mov lock,#0 ; ulož do zámku 0<br />

ret ; návrat k volajícímu<br />

Pasivní čekání<br />

Vlastnosti: proces je ve stavu blokován, vhodné pro delší doby čekání, spotřebovává<br />

prostředky OS, pomalejší.<br />

Postup používající Sleep/Wakeup (implementovány OS, atomické operace - sleep<br />

uspí volající proces, wakeup probudí udaný proces) nefunguje (viď Problém producent/konzument).<br />

Semafory... Sémantika:<br />

Down(Semaphore s) {<br />

wait until s > 0, then s := s-1;<br />

/* must be atomic once s > 0 is detected */<br />

}<br />

(pokud je čítač > 0, sníží čítač o 1 a pokračuje dál; pokud je čítač = 0, operace<br />

DOWN se zablokuje a proces je přidán do fronty čekající na tomto semaforu)<br />

Up(Semaphore s) {<br />

s := s+1; /* must be atomic */<br />

}<br />

(pokud je fronta neprázdná, vybere libovolný proces a ten probudí za DOWN; jinak<br />

zvětší čítač o 1)<br />

Init(Semaphore s, Integer v) {<br />

s := v;<br />

}<br />

Je možné „používať� aj sémantiku, kde sa hodnota vždy zníži/zvýši o 1 (a je<br />

možné sa teda dostať do záporných hodnôt semafóru)... Špeciálny (binárny) typ<br />

semaforu, kde sú povolené len hodnoty 0 a 1 (v Up sa miesto s := s + 1 volá s := 1)<br />

sa nazýva mutex a používa sa na riadenie prístupu k jednej premennej.<br />

Monitory<br />

Implementovány překladačem, lze si představit jako třídu C++ (všechny proměnné<br />

privátní, funkce mohou být i veřejné), vzájemné vyloučení v jedné instanci<br />

(zajištěno synchronizací na vstupu a výstupu do/z veřejných funkcí, synchronizace<br />

implementována blokovacím primitivem OS). ???TODO<br />

Zprávy<br />

Operace SEND a RECEIVE, zablokování odesílatele/příjemce, adresace proces/mailbox,<br />

rendez-vous...<br />

RWL - read-write lock, bariéry...<br />

Ekvivalence primitiv - pomocí jednoho blokovacího primitiva lze implementovat<br />

jiné blokovací primitivum.<br />

Rozdíly mezi platformami: Windows - jednotné funkce pro pasivní čekání, čekání<br />

na více primitiv, timeouty. Unix - OS implementuje semafor, knihovna pthread.<br />

15


Klasické synchronizační problémy<br />

Problém producent/konzument<br />

Producent vyrába predmety, konzument ich spotrebúva. Medzi nimi je sklad<br />

pevnej veľkosti (N). Konzument nemá čo spotrebúvať ak je sklad prázdny; producent<br />

prestane vyrábať, ak je sklad plný.<br />

int N = 100;<br />

int count = 0;<br />

void producer(void) {<br />

int item;<br />

while(TRUE) {<br />

produce_item(&item);<br />

if(count==N) sleep ();<br />

enter_item(item);<br />

count++;<br />

if(count == 1) wake(consumer);<br />

}<br />

}<br />

void consumer(void) {<br />

int item;<br />

while(TRUE) {<br />

if(count==0) sleep ();<br />

remove_item(&item);<br />

count--;<br />

if(count==N-1)<br />

wake(producer);<br />

consume_item(&item);<br />

}<br />

}<br />

1. Buffer je prázdny, a konzument práve prečítal count, aby zistil, či je rovný nule<br />

2. Preplánovanie na producenta<br />

3. Producent vytvorí item a zvýši count<br />

4. Producent zistí, či je count rovný jednej. Zistí že áno, čo znamená že konzument<br />

bol predtým zablokovaný (pretože muselo byť 0), a zavolá wakeup<br />

5. Teraz môže dôjsť k zablokovaniu: konzument sa uspí, pretože si myslí, že nemá<br />

čo zobrať; producent bude chvíľu produkovať a dôjde ”preplneniu” ⇒ uspí sa;<br />

spí producent aj konzument :o)<br />

Problém obědvajících filosofů<br />

Pět filosofů sedí okolo kulatého stolu. Každý filosof má před sebou talíř špaget a<br />

jednu vidličku. Špagety jsou bohužel slizké a je třeba je jíst dvěma vidličkami. Život<br />

filosofa sestává z období jídla a období přemýšlení. Když dostane hlad, pokusí se<br />

vzít dvě vidličky, když se mu to podaří, nají se a vidličky odloží.<br />

Problém ospalého holiče<br />

Holič má ve své oficíně křeslo na holení zákazníka a pevný počet sedaček pro<br />

čekající zákazníky. Pokud v oficíně nikdo není, holič se posadí a spí. Pokud přijde<br />

16


první zákazník a holič spí, probudí se a posadí si zákazníka do křesla. Pokud přijde<br />

zákazník a holič už střihá a je volné místo v čekárně, posadí se, jinak odejde.<br />

5.7 Zablokování a zotavení z něj<br />

Prostředek je cokoliv, k čemu je potřeba hlídat přístup (HW zařízení – tiskárny,<br />

cpu; informace – záznamy v DB). Je možné je rozdělit na odnímatelné (lze odejmout<br />

procesu bez následků – CPU, paměť) a neodnímatelné (nelze odejmnout bez<br />

nebezpečí selhání výpočtu – CD-ROM, tiskárna... tento druh způsobuje problémy).<br />

Práce s prostředky probíhá v několika krocích: žádost o prostředek (blokující,<br />

právě tady dochází k zablokování), používání (např. tisk), odevzdání (dobrovolné/při<br />

skončení procesu).<br />

Množina procesů je zablokována, jestliže každý proces z této množiny čeká na<br />

událost, kterou může způsobit pouze jiný proces z této množiny.<br />

Coffmanovy podmínky<br />

Splnenie týchto podmienok je nutné pre zablokovanie:<br />

1. Vzájemné vyloučení – každý prostředek je buď vlastněn právě jedním procesem<br />

nebo je volný.<br />

2. Drž a čekej – procesy aktuálně vlastnící nějaké prostředky mohou žádat o<br />

další.<br />

3. Neodnímatelnost – přidělené prostředky nemohou být procesům odebrány.<br />

4. Čekání do kruhu – existuje kruhový řetěz procesů, kde každý z nich čeká na<br />

prostředek vlastněný dalším článkem řetězu.<br />

Řešení zablokování<br />

• Pštrosí algoritmus – Zablokování se ani nedetekuje, ani se mu nezabraňuje,<br />

ani se neodstraňuje, Uživatel sám rozhodne o řešení (kill). Nespotřebovává<br />

prostředky OS – nemá režii ani neomezuje podmínky provozu. (Nejčastější<br />

řešení – Unix, Windows)<br />

• Detekce a zotavení – Hledá kružnici v orientovaném grafu (hrany vedou<br />

od procesu, který čeká, k procesu, který prostředek vlastní), pokud tam je<br />

kružnice, nastalo zablokování a je třeba ho řešit:<br />

– Odebrání prostředku – dohled operátora, pouze na přechodnou dobu<br />

– Zabíjení procesů z cyklu (resp. mimo cyklus vlastnící identický prostředek)<br />

– Rollback (OS ukládá stav procesů, při zablokování se některé procesy<br />

vrátí do předchozího stavu ⇒ ztracena práce... obdoba u DB)<br />

• Vyhýbání se – Bezpečný stav (procesy/prostředky nejsou zablokovány, existuje<br />

cesta, jak uspokojit všechny požadavky na prostředky spouštěním procesů<br />

v jistém pořadí); Viď. bankéřův algoritmus. Nutné je předem znát všechny<br />

prostředky, které budou programy potřebovat; OS pak dává prostředky tomu,<br />

který je nejblíž svému maximu potřeby a navíc pro který je prostředků dost<br />

na dokončení. Dnes se moc nepoužívá.<br />

17


• Předcházení (prevence) – napadení jedné z Coffmanovy podmínek<br />

1. Vzájemné vyloučení – spooling (prostriedky spravuje jeden systemový<br />

proces, ktory dohliada na to, aby jeho stav bol konzistentny (tiskarna) –<br />

pozor na místo na disku)<br />

2. Drž a čekej – žádat o všechny prostředky před startem procesu. Nejprve<br />

všechno uvolnit a pak znovu žádat o všechny najednou<br />

3. Neodnímatelnost – vede k chaosu<br />

4. Čekání do kruhu – nejvýše jeden prostředek – všechny prostředky jednoznačně<br />

očíslovány, procesy mohou žádat o prostředky jen ve vzestupném<br />

pořadí<br />

• Dvojfázové zamykání – nejprve postupně všechno zamykám (první fáze). Potom<br />

se může pracovat se zamčenými prostředky – a na závěr se už jen odemyká<br />

(druhá fáze) – viď transakční spracování u databází ((striktní/konzervativní)<br />

dvoufázové zpracování)<br />

Bankéřův algoritmus: Bankéř má klienty a těm slíbil jistou výšku úvěru. Bankéř<br />

ví, že ne všichni klienti potřebují plnou výši úvěru najednou. Klienti občas navštíví<br />

banku a žádají postupně o prostředky do maximální výšky úvěru. Až klient<br />

skončí s obchodem, vrátí bance vypůjčené peníze. Bankéř peníze půjčí pouze tehdy,<br />

zůstane-li banka v bezpečném stavu.<br />

5.8 Organizace paměti, alokační algoritmy<br />

Hierarchie paměti (směrem odshora dolů roste velikost, cena na bajt a rychlost<br />

klesá – a naopak. . . ):<br />

• registry CPU — 10ky-100vky bajtů (IA-32: obecné registy pár 10tek), IA-64 –<br />

až kB (extrém), stejně rychlé jako CPU.<br />

• cache — z pohledu aplikací není přímo adresovatelná; dnes řádově MB, rozdělení<br />

podle účelu, několik vrstev. L1 cache (cca 10ky kB) – dělené instrukce/data;<br />

L2 (cca MB) sdílené instr&data, běží na rychlosti CPU (dřív bývala pomalejší),<br />

servery – L3 (cca 10MB). Vyrovnává rozdíl rychlosti CPU a RAM.<br />

Využívá lokality programů – cyklení na místě; sekvenčního přístupu k datům.<br />

Pokud nenajdu co chci v cache – „cache-miss�, načítá se potřebné z RAM (po<br />

blocích), jinak (v 95-7% případů) nastane „cache-hit�, tj. požadovaná data v<br />

cache opravdu jsou a do RAM nemusím.<br />

• hlavní paměť (RAM) — přímo adresovatelná procesorem, 100MB – GB; pomalejší<br />

než CPU; CAS – doba přístupu na urč. místo – nejvíc zdržuje (v 1<br />

sloupci už čte rychle, dat. tok dostatečný), další – latence – doba než data<br />

dotečou do CPU – hraje roli vzdálenost (AMD- integrovaný řadič v CPU)<br />

• pomocná paměť — není přímo adresovatelná, typicky HDD; náh. přístup, ale<br />

pomalejší. 100GB, různé druhy – IDE, SATA, SCSI; nejvíc zdržuje přístupová<br />

doba (čas seeku) cca 2-10ms; obvykle sektor – 512 B; roli hraje i rychlost<br />

otáčení (4200 – 15000 RPM) – taky řádově ms.<br />

• zálohovací paměť — nejpomalejší, z teorie největší, dnes ale neplatí; typicky –<br />

pásky; pro větší kapacitu – autoloadery ; sekvenční přístup; dnes – kvůli rychlosti<br />

často zálohování RAIDem.<br />

18


Správce paměti: část OS, která spravuje paměťovou hierarchii se nazývá<br />

správce paměti (memory manager):<br />

• udržuje informace o volné/plné části paměti<br />

• stará se o přidělování paměti<br />

• a „výměnu paměti s diskem�<br />

Přiřazení adresy<br />

• při překladu (je již známo umístění procesu, generuje se absolutní kód, PS:<br />

statické linkování)<br />

• při zavádění (OS rozhodne o umístění – generuje se kód s relokacemi, PS:<br />

dynamické linkování)<br />

• za běhu (proces se může stěhovat i za běhu, relokační registr)<br />

Overlay – Proces potřebuje více paměti než je skutečně k dispozici. Programátor<br />

tedy rozdělí program na nezávislé části (které s v paměti podle potřeby vyměňnují)<br />

a část nezbytnou pro všechny části. . .<br />

Výměna (swapping) – dělá se, protože proces musí být v hlavní paměti, aby<br />

jeho instrukce mohly být vykonávány procesorem... Jde o výměnu obsahu paměti<br />

mezi hlavní a záložní.<br />

Překlad adresy – nutný, protože proces pracuje v logickém (virtuálním) adresovém<br />

prostoru, ale HW pracuje s fyzickým adresovým prostorem...<br />

Spojité přidělování – přidělení jednoho bloku / více pamětových oddílů (pevně –<br />

paměť pevně rozdělena na části pro různé velikosti bloků/volně – v libovolné části<br />

volné paměti může být alokován libovolně veliký blok)<br />

Informace o obsazení paměti – bitová mapa / spojový seznam volných bloků<br />

(spojování uvolněného bloku se sousedy)<br />

Alokační algoritmy:<br />

• First-fit – první volný dostatečné velikosti – rychlý, občas ale rozdělí velkou<br />

díru<br />

• Next-fit – další volný dostatečné velikosti – jako First-fit, ale rychlejší<br />

• Best-fit – nejmenší volný dostatečné velikosti – pomalý (prohledává celý seznam),<br />

zanechává malinké díry (ale nechává velké díry vcelku)<br />

• Worst-fit – největší volný – pomalý (prohledává celý seznam), rozdělí velké<br />

díry<br />

• Buddy systém – paměť rozdělena na bloky o velikosti 2 n , bloky stejné velikosti<br />

v seznamu, při přidělení zaokrouhlit na nejbližší 2 n , pokud není volný, rozštípnou<br />

se větší bloky na příslušné menší velikosti, při uvolnění paměti se slučují<br />

sousední bloky (buddy)<br />

Fragmentace paměti:<br />

• externí – volný prostor rozdělen na malé kousky, pravidlo 50% – po nějaké<br />

době běhu programu bude cca 50% paměti fragmentováno a u toho to zůstává<br />

• interní – nevyužití celého přiděleného prostoru<br />

• sesypání – pouze při přiřazení adresy za běhu, nebo segmentaci – nelze při<br />

statickém přidělení adresy<br />

19


5.9 Principy virtuální paměti, stránkování, algoritmy pro<br />

výměnu stránek, výpadek stránky, stránkovací tabulky,<br />

segmentace<br />

Virtuální paměť<br />

• procesy pracují s virtuální adresou<br />

• mapování adresy na fyzickou - mapovací tabulky<br />

• obraz virtuální paměti (VAP) částečně v RAM a částečně na disku<br />

• dříve iluze větší paměti, dnes hlavně ochrana přístupu<br />

• stránkování / segmentace<br />

Stránkování<br />

podporované všemi velkými CPU a OS, jednorozměrný VAP<br />

• VAP rozdělen na stránky (velikost je mocnina 2), FAP na rámce (úseky stejné<br />

délky)<br />

• převod stránkovací tabulkou, příznak existence mapování (výpadek stránky →<br />

synchronní přerušení)<br />

• umožnuje oddělené VAP i sdílenou paměť - mapování virtuální stránky 2 procesů<br />

na jednu fyzickou<br />

• víceúrovňové stránkování (např. kvůli velikosti)<br />

20


• TLB (Translation Lookaside Buffer) - asociativní paměť sloužící na rychlé<br />

vyhledání mapování virtuální stránky na fyzickou, využívá lokalitu chování<br />

programů<br />

...nulaúrovňové stránkování - používá pouze TLB, řízeno také OS (oblíbené u<br />

64-bitových CPU - UltraSPARC III)<br />

• inverzní stránkování (např. když FAP je menší než VAP, 64-bitové CPU -<br />

IA-64)<br />

Akce vykonávané při výpadku stránky:<br />

• výjimka procesoru<br />

• uložit stav CPU (kontext)<br />

• zjistit VA<br />

• kontrola platnosti adresy a práv<br />

• nalezení volného rámce<br />

• zrušit mapování na nalezený rámec<br />

• pokud je vyhazovaný rámec vyhazován, spustit ukládání na disk<br />

• načíst z disku požadovanou stránku do rámce<br />

• zavést mapování<br />

• obnovit kontext<br />

Při implementaci stránkování je nutno brat v úvahu:<br />

• znovuspuštění instrukce — je potřeba aby procesor po výpadku zkusil přístup<br />

do paměti znova. dnes umí všechny CPU, např. 68xxx - problémy (přerušení<br />

v půlce instrukce)<br />

21


• sdílení stránek — jednomu rámci odp. víc stránek → pokud s ním něco dělám,<br />

týká se to všech stránek! musím vše ost. odmapovat. musím si pamatovat<br />

mapování pro každý rámec - obrácené tabulky.<br />

• odstranění položky z TLB při rušení mapování — nestačí změnit tabulky, musí<br />

se vyhodit i z TLB (kde to může, ale nemusí být). problém - u multiprocesorů<br />

má každá CPU vlastní TLB, tabulky jsou sdílené → CPU při rušení mapování<br />

musí poslat interrupt s rozkazem ke smazání všem (i sobě), počkat na potvrzení<br />

akce od všech.<br />

Algoritmy pro výměnu stránek<br />

• Optimální stránka (v okamžiku výpadku stránky vybírám stránku, na níž<br />

se přistoupí za největší počet instrukcí) - nelze implementovat<br />

• NRU (Not Recently Used) - každá stránka má příznaky Accessed a Dirty<br />

(typicky implementovatelné v HW, možno simulovat SW); jednou za čas se<br />

smažou všechna A; při výpadku rozdělím stránky podle A,D a vyberu stránku<br />

z nejnižší neprázdné třídy:<br />

A D<br />

0 0 0<br />

1 0 1<br />

2 1 0<br />

3 1 1<br />

• FIFO (vykazuje anomálie - Belady (zvětšení počtu výpadků stránky, když<br />

zvýšíme počet stránek v paměti)), druhá šance (úprava FIFO; pokud A=1,<br />

zařadím na konec FIFO... nevykazuje anomálie)<br />

• Hodiny - modifikace druhé šance: kruhový zoznam stránek + iterátor na<br />

ukazující na nejstarší stránku v zoznamu. Při výpadku (a neexistenci volého<br />

rámce) se zjistí, jestli má *iterator nastavený příznak Accessed. Jestli ne, tato<br />

stránka bude nahrazena - v opačném případě se Accessed příznak zruší a iterator++.<br />

Toto se opakuje, dokud nedojde k výměně. . .<br />

• LRU (Least Recently Used) - často používané stránky v posledním krátkém<br />

časovém úšeku budou znovu použity, čítač použití stránek, možné implementovat<br />

v HW<br />

• NFU (Not Frequently Used) - SW simulace LRU, SW čítač ke každé stránce;<br />

jednou za čas projdu všechna A a přičtu je k odpovídajícím čítačům; vybírám<br />

stránku s nejnižším čítačem; nezapomíná - je možná modifikace se stárnutím<br />

čítače<br />

Segmentace<br />

dnes pouze Intel IA-32, dvojrozměrný VAP<br />

• rozdělení programu na segmenty (napr. podle částí s různými vlastnostmi -<br />

kód, data, zásobníky. . . ), různé délky segmentů, ktoré můžou měnit svoji délku<br />

za běhu<br />

22


• VAP dvourozměrný (segment, offset), FAP jednorozměrný (vyzerá jako při<br />

spojitém pridělování paměti)<br />

• segmentová převodní tabulka (VA se skládá ze dvou častí S:D, v tabulce se<br />

najde adresa segmentu S. . . k této adrese se poté přičte D, co je umístnění<br />

adresy v FA), příznak existence mapování<br />

• při výpadku je nutné měnit celý segment (ty mohou být velké), je možné<br />

segmenty sesypat - ale nelze mít segment větší než FAP<br />

Segmentaci je možné kombinovat se stránkováním (odstraňuje nevýhody segmentace,<br />

neprovádí se výpadky segmentů):<br />

5.10 Systémy souborů, adresářové struktury<br />

Definice (soubor)<br />

Soubor je pojmenovaná množina souvisejících informací, která leží v pomocné<br />

paměti (na disku).<br />

Soubor je abstrakce, která umožňuje uložit informaci na disk a později ji přečíst.<br />

Abstrakce odstiňuje uživatele od podrobností práce s disky.<br />

Soubory<br />

• pojmenování souboru (umožňuje uživateli přístup k jeho datům; přesná pravidla<br />

pojmenování určuje OS - malá vs. velká písmenka, speciální znaky, délka<br />

jména, přípony a jejich význam)<br />

• atributy souborů (opět určuje OS) - jméno, typ, umístění, velikost, ochrana,<br />

časy, vlastník, . . .<br />

• struktura souborů - sekvence bajtů / sekvence záznamů / strom<br />

• typy souborů - běžné soubory, adresáře (systémové soubory vytvářející strukturu<br />

souborového systému), speciální soubory (znakové/blokové, soft linky)<br />

• přístup<br />

– sekvenční – pohyb pouze vpřed, OS může přednačítat<br />

– náhodný – možno měnit aktuální pozici<br />

– paměťově mapované soubory – pojmenovaná virtuální paměť, práce<br />

se souborem instrukcemi pro práci s pamětí, ušetří se kopírování pamětí;<br />

23


mají i problémy (přesná velikost souboru, zvětšování souboru, velikost<br />

souborů)<br />

• volné místo na disku - bitmapa / spojový seznam volných bloků<br />

Uložení souborů<br />

Soubory se ukládají na disk po blocích<br />

• souvislá alokace - souvislý sled bloků<br />

• spojovaná alokace - blok odkazuje na další<br />

• indexová alokace - inode (UNIX)<br />

Adresáře<br />

• zvláštní typ souboru<br />

• operace nad adresáři - hledání souboru / vypsání adresáře / přejmenování,<br />

vytvoření, smazání souboru<br />

• kořen, aktuální adresář, absolutní/relativní cesta<br />

• hierarchická struktura<br />

– strom – jednoznačné pojmenování (cesta)<br />

– DAG – víceznačné pojmenování, ale nejsou cykly<br />

– obecný graf – cykly vytváří problém při prohledávání<br />

• implementace adresářů - záznamy pevné velikosti, spojový seznam, B-stromy<br />

Co musí filesystém umět?<br />

musí splňovat 3 věci: správu souborů (kde jsou, jak velké), správu adresářů (převod<br />

jméno ↔ id) (někdy to dělá jiný prostředek, dnes větš. umí FS sám), správu<br />

volného místa. někdy mohou být i další (odolnost proti výpadkům)<br />

Velikost bloků – blok = nejmenší jednotka pro práci s diskem; disk pracuje s<br />

min. 1 sektorem (typicky 512 B) - někdy by pak bylo moc bloků → OS sdruží<br />

několik sektorů lineáně vedle sebe = 1 blok. velikost: velké = rychlejší práce,<br />

ale vnitřní fragmentace (průměrný soubor má cca pár KB), malé = malá vnitřní<br />

fragmentace, větší režie na info o volném místě/ umístění souboru (zabírá víc<br />

bloků!), navíc fragmentace souborů → zpomalení. dnes má blok cca 2-4KB.<br />

Linky<br />

• Hard link – Na jedna data souboru se odkazuje z různých položek v adresářích<br />

• Soft link – Speciální soubor, který obsahuje jméno souboru<br />

Příklady<br />

• FAT – http://en.wikipedia.org/wiki/File_Allocation_Table<br />

• NTFS – charakteristika, MFT (Master File Table), run list<br />

http://www.digit-life.com/articles/ntfs/<br />

http://www.pcguide.com/ref/hdd/file/ntfs/archSector-c.html<br />

24


• ext2/ext3 – struktura, inode, žurnál<br />

http://www.science.unitn.it/~fiorella/guidelinux/tlk/node95.html<br />

http://www.linux-security.cn/ebooks/ulk3-html/0596005652/understandlk-CHP-18.<br />

html<br />

Plánování pohybu hlav disků<br />

• FCFS (First-Come, First-Served) - žádné plánování, fronta požadavků, jeden<br />

za druhým<br />

• SSTF (Shortest Seek Time First) - krajní žádosti mohou ”hladovět”<br />

• LOOK (výtah), C-LOOK (circular LOOK) - pohyb jen jedním směrem, na<br />

konci otočka<br />

RAID (Redundant Array of Inexpensive Disks)<br />

• JBOD (Just a Bunch of Disks)<br />

• RAID 0 – striping, žádná redundance<br />

• RAID 1 – mirroring, redundance<br />

• RAID 0+1 – mirroring a striping<br />

• RAID 2 – 7-bitový paritní Hammingův kód<br />

• RAID 3 – 1 paritní disk, po bitech na disky<br />

• RAID 4 – 1 paritní disk a striping<br />

• RAID 5 – distribuovaná parita a striping<br />

• RAID 6 – distribuovaná parita – dvojitá P+Q, striping<br />

5.11 Bezpečnost, autentifikace, autorizace, přístupová práva<br />

Definice<br />

• Ochrana – s prostředky OS mohou pracovat pouze autorizované procesy<br />

• Autorizace – zjištění oprávněnosti požadavku<br />

• Bezpečnost – zabraňuje neautorizovaný přístup do systému<br />

• Právo – povolení/zakázání vykonávat nějakou operaci<br />

• Doména ochrany – množina párů (objekt:práva)<br />

– ACL (Access Control List) – ke každému objektu seznam práv pro<br />

uživatele/skupiny<br />

– C-list (Capability List) – ke každému uživateli/skupině seznam práv<br />

pro objekty<br />

25


Autentifikace<br />

Identifikace něčím, co uživatel ví, má nebo je.<br />

• Hesla<br />

– slovníkový útok (80–90% hesel je jednoduchých), hrubá síla<br />

– vynucování délky a složitosti hesla<br />

• Model otázka/odpověď<br />

• Fyzický objekt – smartcards, USB klíče<br />

• Biometrika – otisky prstů, rohovka, hlas<br />

TODO: autorizace, přístupová práva<br />

5.12 Architektura ISO/OSI<br />

Úvod<br />

Definice<br />

Síťový model je ucelená představa o tom, jak mají být sítě řešeny (obsahuje:<br />

počet vrstev, co má která vrstva na starosti; neobsahuje: konkrétní představu<br />

jak která vrstva plní své úkoly - tedy konkrétní protokoly). Příkladem je referenční<br />

model ISO/OSI (konkrétní protokoly vznikaly samostatně a dodatečně).<br />

Síťová architektura navíc obsahuje konkrétní protokoly - napr. rodina protokolů<br />

TCP/IP.<br />

Referenčný model ISO/OSI (International Standards Organization / Open Systems<br />

Interconnection) bol pokusom vytvoriť univerzálnu sieťovú architektúru - ale<br />

skončil ako sieťový model (bez protokolov). Pochádza zo „sveta spojov� - organizácie<br />

ISO, a bol „oficiálnym riešením�, presadzovaným „orgánmi štátu�; dnes už prakticky<br />

odpísaný - prehral v súboji s TCP/IP. ISO/OSI bol reakciou na vznik proprietárnych<br />

a uzavretých sietí. Pôvodne mal model popisovať chovanie otvorených systémov<br />

vo vnútri aj medzi sebou, ale bolo od toho upustené a nakoniec z modelu ostal len<br />

sieťový model (popis funkcionality vrstiev) a konkrétne protokoly pre RM ISO/OSI<br />

boli vyvíjané samostatne (a dodatočne zaraďované do rámca ISO/OSI).<br />

Model vznikal maximalistickým spôsobom - obsahoval všetko čo by mohlo byť<br />

v budúcnosti potrebné. Vďaka rozsiahlosti štandardu sa implementovali len jeho<br />

niektoré podmnožiny - ktoré neboli (vždy) kompatibilné. Vznikol GOSIP (Government<br />

OSI Profile) určujúci podmnožinu modelu, ktorú malo mať implementované<br />

všetko štátne sieťové vybavenie. Naproti tomu všetkému TCP/IP vzniklo naopak -<br />

najprv navrhnutím jednoduchého riešenia, potom postupným obohacovaním o nové<br />

vlastnosti (tie boli zahrnuté až po preukázaní „životaschopnosti�).<br />

7 vrstev<br />

Kritériá pri návrhu vrstiev boli napr.: rovnomerná vyťaženosť vrstiev, čo najmenšie<br />

dátové toky medzi vrstvami, možnosť prevziať už existujúce štandardy (X.25), odlišné<br />

funkcie mali patriť do odlišných vrstiev, funkcie na rovnakom stupni abstrakcie<br />

26


mali patriť do rovnakej vrstvy. Niektoré vrstvy z finálneho návrhu sa používajú málo<br />

(relačná a prezentačná), niektoré zase príliš (linková - rozpadla sa na 2 podvrstvy<br />

LLC+MAC).<br />

aplikační vrstva vrstvy orientované na podporu aplikací<br />

prezentační vrstva<br />

relační vrstva<br />

transportní vrstva přispůsobovací vrstva<br />

síťová vrstva vrstvy orientované na přenos dat<br />

linková vrstva<br />

fyzická vrstva<br />

Fyzická vrstva sa zaoberá prenosom bitov (kódovanie, modulácia, synchronizácia...)<br />

a ponúka teda služby typu pošli a príjmi bit (pričom neinterpretuje význam<br />

týchto dát). Pracuje sa tu s veličinami ako je šírka pásma, modulačná a prenosová<br />

rýchlosť.<br />

Linková vrstva prenáša vždy celé bloky dát (rámce/frames), používa pritom<br />

fyzickú vrstvu a prenos vždy funguje len k priamym susedom. Môže pracovať spoľahlivo<br />

či nespoľahlivo, prípadne poskytovať QoS/best effort. Ďalej zabezpečuje riadenie<br />

toku - zaistenie toho, aby vysielajúci nezahltil príjemcu. Delí sa na dve podvrstvy<br />

- MAC (prístup k zdieľanému médiu - rieši konflikty pri viacnásobnom prístupe k<br />

médiu) a LLC (ostatné úlohy).<br />

Sieťová vrstva prenáša pakety (packets) - fakticky ich vkladá do linkových<br />

rámcov. Zaručuje doručenie paketov až ku konečnému adresátovi (tj. zabezpečuje<br />

smerovanie). Môže používať rôzne algoritmy smerovania - ne/adaptívne, izolované,<br />

distribuované, centralizované... (v architektúre TCP/IP je to IP vrstva)<br />

Transportná vrstva zabezpečuje komunikáciu medzi koncovými účastníkmi<br />

(end-to-end) a môže meniť nespoľahlivý charakter komunikácie na spoľahlivý, menej<br />

spoľahlivý na viac spoľahlivý, nespojovaný prenos na spojovaný... Príkladom sú<br />

napr. TCP a UDP. Ďalšou úlohou je rozlišovanie jednotlivých entit (na rozdiel od<br />

napr. sieťovej vrstvy) v rámci uzlov - procesy, démony, úlohy (rozlišuje sa zväčša<br />

nepriamo - napr. v TCP/IP pomocou portov).<br />

Relačná vrstva zaisťuje vedenie relácií - šifrovanie, synchronizáciu, podporu<br />

transakcií. Je to najkritizovanejšia vrstva v ISO/OSI modele, v TCP/IP úplne<br />

chýba.<br />

Prezentačná vrstva slúži na konverziu dát, aby obe strany interpretovali dáta<br />

rovnako (napr. reálne čísla, rôzne kódovanie textov). Ďalej má na starosti konverziu<br />

dát do formátu, ktorý je možné preniesť: napr. linearizácia viacrozmerných polí,<br />

dátových štruktúr; konverzia viacbajtových položiek na jednotlivé byty (little vs. big<br />

endian). Poznámka: Zápis čísla 1234H v Big endian je [12:34:–:–] (sun, motorola), v<br />

Little endian [–:–:34:12] (intel, amd, ethernet).<br />

Aplikačná vrstva mala pôvodne obsahovať aplikácie - ale tých je veľa a nebolo<br />

možné ich štandardizovať. Teraz teda obsahuje len „jadro� aplikácií - tie, ktoré malo<br />

zmysel štandardizovať (email a pod.). Ostatné časti aplikácií (GUI) boli vysunuté<br />

nad aplikačnú vrstvu.<br />

27


Kritika<br />

Model ISO/OSI:<br />

• je príliš zložitý, ťažkopádny a obtiažne implementovateľný<br />

• je príliš maximalistický<br />

• nerešpektuje požiadavky a realitu bežnej praxe<br />

• počítal skôr s rozľahlými sieťami ako s lokálnymi<br />

• niektoré činnosti (funkcie) zbytočne opakuje na každej vrstve<br />

• jednoznačne uprednostňuje spoľahlivé a spojované prenosové služby (ale tie<br />

sú spojené s veľkou réžiou ⇒ spoľahlivosť si efektívnejšie zabezpečia koncové<br />

uzly)<br />

Možnosť nespoľahlivého/nespojovaného spojenia bolo pridané do štandardu až<br />

dodatočne, napriek tomu bol porazený architektúrou TCP/IP. Používajú sa však<br />

niektoré prevzaté prokoly - X.400 (elektronická pošta), X.500 (adresárové služby -<br />

odľahčením vznikol úspešný protokol LDAP).<br />

5.13 Rodina protokolů TCP/IP (ARP, IPv4, IPv6, ICMP,<br />

UDP, TCP) – adresace, routing, fragmentace, spolehlivost,<br />

flow control, congestion control, NAT<br />

ISO/OSI TCP/IP<br />

aplikační vrstva aplikační vrstva<br />

prezentační vrstva<br />

relační vrstva<br />

transportní vrstva transportní vrstva<br />

síťová vrstva síťová vrstva (též IP vrstva)<br />

linková vrstva vrstva síťového rozhraní<br />

fyzická vrstva<br />

Obvyklé označenie je TCP/IP protocol suite (súčasťou je viac ako 100 protokolov).<br />

Architektúra vznikla postupne (v akademickom prostredí, neskôr sa rozšírila aj<br />

do komerčnej sféry) – najprv vznikli protokoly, potom vrstvy – a od vzniku sa toho<br />

zmenilo len málo (zmeny sú aditívne). Je to najpoužívanejšia sieťová technológia (IP<br />

over everything, everything over IP). Prístup autorov bol, na rozdiel od ISO/OSI,<br />

od jednoduchšieho k zložitejšiemu – najprv sa vytvárajú jednoduché riešenia, ktoré<br />

sa postupne obohacujú. Až sa riešenie prakticky overí (2 nezávislé implementácie),<br />

vznikne štandard. TCP/IP predpokladá že siete sú typu nespojované, nespoľahlivé<br />

a best effort. Všetká inteligencia je sústredená do koncových uzlov, sieť je „hlúpa�<br />

ale rýchla.<br />

TCP/IP bol pôvodne určený pre ARPAnet – nemohol mať teda žiadnu centrálnu<br />

časť a musel byť robustný voči chybám (nespoľahlivé/nespojované prenosy). Dôraz<br />

sa kládol aj na ”internetworking”. Nebolo však požadované zabezpečenie, mobilita<br />

ani kvalita služieb.<br />

TCP/IP nedefinuje rôzne siete (čo sa hardvérových vlastností týka) a technológie<br />

vo vrstve sieťového rozhrania – iba sa snaží nad nimi prevádzkovať protokol IP<br />

28


(okrem SLIP a PPP pre dvojbodové spoje). V sieťovej vrstve je IP protokol, v<br />

transportnej jednotné transportné protokoly (TCP a UDP), v aplikačnej potom<br />

jednotné základy aplikácií (email, prenos súborov, remote login...).<br />

Adresace, IPv4, IPv6<br />

Data se v IP síti posílají po blocích nazývaných datagramy. Jednotlivé datagramy<br />

putují sítí zcela nezávisle, na začátku komunikace není potřeba navazovat spojení či<br />

jinak „připravovat cestu� datům, přestože spolu třeba příslušné stroje nikdy předtím<br />

nekomunikovaly.<br />

IP protokol v doručování datagramů poskytuje nespolehlivou službu, označuje<br />

se také jako best effort – „nejlepší úsilí�; tj. všechny stroje na trase se datagram<br />

snaží podle svých možností poslat blíže k cíli, ale nezaručují prakticky nic. Datagram<br />

vůbec nemusí dorazit, může být naopak doručen několikrát a neručí se ani za<br />

pořadí doručených paketů. Pokud aplikace potřebuje spolehlivost, je potřeba ji implementovat<br />

v jiné vrstvě síťové architektury, typicky protokoly bezprostředně nad<br />

IP (viz TCP).<br />

Pokud by síť často ztrácela pakety, měnila jejich pořadí nebo je poškozovala, výkon<br />

sítě pozorovaný uživatelem by byl malý. Na druhou stranu příležitostná chyba<br />

nemívá pozorovatelný efekt, navíc se obvykle používá vyšší vrstva, která ji automaticky<br />

opraví.<br />

V IPv4 je adresou 32bitové číslo, zapisované po jednotlivých bajtech, oddělených<br />

tečkami. Takových čísel existuje celkem 2 32 . Určitá část adres je ovšem rezervována<br />

pro vnitřní potřeby protokolu a nemohou být přiděleny. Dále pak praktické důvody<br />

vedou k tomu, že adresy je nutno přidělovat hierarchicky, takže celý adresní prostor<br />

není možné využít beze zbytku. To vede k tomu, že v současnosti je již znatelný<br />

nedostatek IP adres, který řeší různými způsoby: dynamickým přidělováním (tzn.<br />

např. každý uživatel dial-up připojení dostane dočasnou IP adresu ve chvíli, kdy<br />

se připojí, ale jakmile se odpojí, je jeho IP adresa přidělena někomu jinému; při<br />

příštím připojení pak může tentýž uživatel dostat úplně jinou adresu), překladem<br />

adres (NAT) a podobně. Ke správě tohoto přidělování slouží specializované síťové<br />

protokoly, jako např. DHCP.<br />

Pôvodný koncept adries počítal so štruktúrou adresy IPv4 v tvare sieť:počítač,<br />

kde bolo delenie častí pevne dané. Neskôr sa to ale ukázalo ako príliš hrubé delenie<br />

a lokálna časť adresy (v rámci jednej podsiete) može mäť dnes promenlivú dĺžku.<br />

Obecne platí, že medzi adresami v rovnakej podsieti (majú rovnakú sieťovú časť)<br />

je možné dopravovať dáta priamo – dotyční účastníci sú prepojení jedným ethernetom<br />

alebo inou lokálnou sieťou. V opačnom prípade sa dáta dopravujú smerovačmi/routermi.<br />

Hranicu v adrese medzi adresou siete a počítača určuje dnes maska<br />

podsiete. Jedná sa o 32 bitovú hodnotu, ktorá obsahuje jednotky tam, kde je v<br />

adrese určená sieť.<br />

Adresovanie sietí bolo v prvopočiatkoch internetu vyriešené staticky – prvých<br />

8 bitov adresy určovalo sieť, zvyšok jednotlivé počítače (existovať tak mohlo<br />

max. 256 sietí). S nástupom lokálnych sietí bolo tento systém potrebné zmeniť –<br />

zaviedli sa triedy IP adries. Existovalo 5 tried (A(začiatok 0, hodnoty prvého bajtu<br />

0-127, maska 255.0.0.0), B(10, 128-191, 255.255.0.0), C(110, 192-223, 255.255.255.0),<br />

D(1110, 224-239, určené na multicast) a E(1111, 240-255, určené ako rezerva)). Po-<br />

29


stupom času sa ale aj toto rozdelenie ukázalo ako nepružné a bol zavedený CIDR<br />

(Classless Inter-Domain Routing) systém v ktorom je možné hranicu medzi adresou<br />

siete a lokálnou časťou adresy umiestniť ľubovoľne (označuje sa potom ako kombinácia<br />

prefixu a dĺžky vo forme 192.168.0.0/24, kde 24 znamená že adresu tvorí<br />

prvých 24 bitov – jiný zápis je pomocí už zmiňované masky podsítě, tj. 192.168.0.0<br />

s maskou 255.255.255.0).<br />

Medzi adresami existujú niektoré tzv. vyhradené adresy, ktoré majú špeciálny<br />

význam.<br />

• Adresa s (binárnymi) nulami v časti určujúcej počítač (192.168.0.0 (/24)) znamená<br />

„táto sieť�, resp. „táto stanica�.<br />

• Adresa s jednotkami v časti určujúcej počítač (192.168.0.255 (/24)) znamená<br />

broadcast – všesmerové vysielanie.<br />

• Adresy 10.0.0.0 – 10.255.255.255, 172.16.0.0 – 172.31.255.255 a 192.168.0.0 –<br />

192.168.255.255 sa používajú na adresovanie interných sietí – smerovače tieto<br />

adresy nesmie smerovať ďalej do internetu.<br />

IPv6 je trvalejším riešením nedostatku adries – zatiaľ sa ale rozširuje veľmi<br />

pozvolna. Adresa v IPv6 má dĺžku 128 bitov (oproti 32), čo znamená cca. 6×10 23 IP<br />

adries na 1m 2 zemského povrchu – umožňuje teda, aby každé zariadenie na zemi malo<br />

vlastnú jednoznačnú adresu. Adresa IPv6 sa zapisuje ako osem skupín po štyroch<br />

hexadecimálnych číslach (napr. 2001:0718:1c01:0016:0214:22ff:fec9:0ca5) – pričom<br />

úvodné nuly v číslach je možné vynechať. Ak po sebe nasleduje niekoľko nulových<br />

skupín, je možné použiť len znaky :: – napr. ::1 miesto 0000:0000:.......:0001. Toto<br />

je možné použiť len raz v zápise adresy. RFC 4291 zavádza 3 typy adries:<br />

• inidividuálne / unicast – identifikujú práve jedno rozhranie<br />

• skupinové / multicast – určuje skupinu zariadení, ktorým sa má správa<br />

dopraviť<br />

• výberové / anycast – určuje tiež skupinu zariadení, dáta sa však doručia<br />

len jednému z členov (najbližšiemu)<br />

IPv6 neobsahuje všesměrové (broadcast) adresy. Byly nahrazeny obecnějším modelem<br />

skupinových adres a pro potřeby doručení dat všem zařízením připojeným k<br />

určité síti slouží speciální skupinové adresy (např. ff02::1 označuje všechny uzly na<br />

dané lince).<br />

IPv6 zavádí také koncepci dosahu (scope) adres. Adresa je jednoznačná vždy jen<br />

v rámci svého dosahu. Nejčastější dosah je pochopitelně globální, kdy adresa je jednoznačná<br />

v celém Internetu. Kromě toho se často používá dosah linkový, definující<br />

jednoznačnou adresu v rámci jedné linky (lokální sítě, např. Ethernetu). Propracovanou<br />

strukturu dosahů mají skupinové adresy (viz níže).<br />

Adresní prostor je rozdělen následovně:<br />

prefix význam<br />

::/128 neurčená<br />

::1/128 smyčka (loopback)<br />

ff00::/8 skupinové<br />

fe80::/10 individuální lokální linkové<br />

ostatní individuální globální<br />

30


Výběrové adresy nemají rezervovánu svou vlastní část adresního prostoru. Jsou<br />

promíchány s individuálními a je otázkou lokální konfigurace, aby uzel poznal, zda<br />

se jedná o individuální či výběrovou adresu.<br />

Strukturu globálních individuálních IPv6 adres definuje RFC 3587. Je velmi jednoduchá<br />

a de facto odpovídá (až na rozměry jednotlivých částí) výše uvedené struktuře<br />

IPv4 adresy.<br />

n bitů 64-n bitů 64 bitů<br />

globální směrovací prefix adresa podsítě adresa rozhraní<br />

Globální směrovací prefix je de facto totéž co adresa sítě, následuje adresa podsítě<br />

a počítače (přesněji síťového rozhraní). V praxi je adresa podsítě až na výjimky<br />

16bitová a globální prefix 48bitový. Ten je pak přidělován obvyklou hierarchií, jejíž<br />

stávající pravidla jsou:<br />

• první dva bajty obsahují hodnotu 2001 (psáno v šestnáctkové soustavě)<br />

• další dva bajty přiděluje regionální registrátor (RIR)<br />

• další dva bajty přiděluje lokální registrátor (LIR)<br />

Reálná struktura globální individuální adresy tedy vypadá následovně:<br />

16 bitů 16 bitů 16 bitů 16 bitů 64 bitů<br />

2001 přiděluje RIR přiděluje LIR adresa podsítě adresa rozhraní<br />

Adresa rozhraní by pak měla obsahovat modifikovaný EUI-64 identifikátor. Ten<br />

získáte z MAC adresy jednoduchým postupem: invertuje se druhý bit MAC adresy<br />

a doprostřed se vloží dva bajty obsahující hodnotu fffe. Z ethernetové adresy<br />

00:14:22:c9:0c:a5 tak vznikne identifikátor 0214:22ff:fec9:0ca5.<br />

Adresy začínajúce hodnotou ff sú tzv. ”skupinové adresy” – štyri nasledujúce bity<br />

v nej obsahujú príznaky, ďalšie štyri potom dosah (napr. interface-local, link-local,<br />

admin-local, site-local, organization-local, global...)<br />

IPv6 ďalej podporuje QoS a bezpečnosť (IPsec).<br />

Routing<br />

Pojmem směrování (routing, routování) je označováno hledání cest v počítačových<br />

sítích. Jeho úkolem je dopravit datový paket určenému adresátovi, pokud možno co<br />

nejefektivnější cestou. Síťová infrastruktura mezi odesílatelem a adresátem paketu<br />

může být velmi složitá. Směrování se proto zpravidla nezabývá celou cestou paketu,<br />

ale řeší vždy jen jeden krok – komu data předat jako dalšímu (tzv. „distribuované<br />

směrování�). Ten pak rozhoduje, co s paketem udělat dál.<br />

V prípade, že je cieľová stanica packetu v rovnakej sieti ako je odosielateľ, o<br />

doručenie sa postará linková vrstva. V opačnom prípade musí odosielateľ určiť najvhodnejší<br />

odchodzí smer a poslať datagram smerovaču vo zvolenom smere.<br />

Základní datovou strukturou pro směrování je směrovací tabulka (routing table).<br />

Představuje vlastně onu sadu ukazatelů, podle kterých se rozhoduje, co udělat s<br />

kterým paketem. Směrovací tabulka je složena ze záznamů obsahujících:<br />

31


• cílovou adresu, které se dotyčný záznam týká. Může se jednat o adresu individuálního<br />

počítače, častěji však je cíl definován prefixem, tedy začátkem<br />

adresy. Prefix mívá podobu 147.230.0.0/16. Hodnota před lomítkem je adresa<br />

cíle, hodnota za lomítkem pak určuje počet významných bitů adresy. Uvedenému<br />

prefixu tedy vyhovuje každá adresa, která má v počátečních 16 bitech<br />

(čili prvních dvou bajtech) hodnotu 147.230.<br />

• akci určující, co provést s datagramy, jejichž adresa vyhovuje prefixu. Akce<br />

mohou být dvou typů: doručit přímo adresátovi (pokud je dotyčný stroj s<br />

adresátem přímo spojen) nebo předat některému ze sousedů (jestliže je adresát<br />

vzdálen).<br />

Směrovací rozhodnutí pak probíhá samostatně pro každý procházející datagram.<br />

Vezme se jeho cílová adresa a porovná se směrovací tabulkou následovně:<br />

• Z tabulky se vyberou všechny vyhovující záznamy (jejichž prefix vyhovuje<br />

cílové adrese datagramu).<br />

• Z vybraných záznamů se použije ten s nejdelším prefixem. Toto pravidlo vyjadřuje<br />

přirozený princip, že konkrétnější záznamy (jejichž prefix je delší, tedy<br />

přesnější; specielním případem je host-specific route) mají přednost před obecnějšími<br />

(co může být např. i default route; ps: agregace).<br />

Zajímavou otázkou je, jak vznikne a jak je udržována směrovací tabulka. Tento<br />

proces mají obecně na starosti směrovací algoritmy. Když jsou pak pro určitý algoritmus<br />

definována přesná pravidla komunikace a formáty zpráv nesoucích směrovací<br />

informace, vznikne směrovací protokol (routing protocol). Směrovací algoritmy<br />

můžeme rozdělit do dvou základních skupin: na statické a dynamické. Často se také<br />

mluví o statickém a dynamickém směrování, které je důsledkem činnosti příslušných<br />

protokolů.<br />

Při statickém (též neadaptivním) směrování se směrovací tabulka nijak nemění.<br />

Je dána konfigurací počítače a případné změny je třeba v ní provést ručně.<br />

Tato varianta vypadá jako nepříliš atraktivní, ve skutečnosti ale drtivá většina zařízení<br />

v Internetu směruje staticky.<br />

Dynamické (adaptivní) směrování průběžně reaguje na změny v síťové topologii<br />

a přizpůsobuje jim směrovací tabulky. Na vytváranie tabuliek existuje niekoľko<br />

algoritmov – routovacích protokolov (vector-distance/link-state) – RIP, BGP,<br />

OSPF.<br />

Distribuované směrování<br />

V distribuovaném směrování může výpočet cesty (směru předání paketu) provádět<br />

buď každý uzel nezávisle, nebo mohou uzly kooperovat (distribuovaný výpočet).<br />

Rozlišuje se také četnost aktualizace informací. Dva základní algoritmy distribuovaného<br />

směrování jsou:<br />

• vector distance – každý uzel si udržuje tabulku vzdáleností, přímí sousedé si<br />

vyměňují informace o cestách ke všem uzlům, tj. jde o distribuovaný výpočet,<br />

přenáší se dost informací. Trpí problémem „count-to-infinity� – tj. když 1<br />

uzel přestane existovat, postupně si jeho sousedé mezi sebou přehazují vzdálenost,<br />

postupně o 1 zvětšovanou (do nekonečna). Řeší se pomocí technik „split<br />

32


horizon� (neinzeruj vzdálenost zpět) a „poisoned reverse� (inzeruj zpět nekonečno),<br />

někde ale přesto selhává.<br />

• link state – každý uzel hledá změny svých sousedů a pokud k nějaké dojde,<br />

pošle floodem informaci do celé sítě. Výpočet vzdáleností dělá každý uzel sám.<br />

Tyto algoritmy se používají u některých známých směrovacích protokolů:<br />

• RIP (Routing Information Protocol) – protokol z BSD Unixu, typu vector distance.<br />

Počítá s max. 16 přeskoky, změny se updatují 2x za minutu. Informace<br />

ve směrovací tabulce může zahrnovat max. 25 sítí, používá split horizon &<br />

poisoned reverse. Hodí se ale jen pro malé sítě.<br />

• OSPF (Open Shortest Path First) – jde o protokol typu link state, uzly si<br />

počítají vzdálenosti do všech sítí Dijkstrovým algoritmem. Pro zjišťování změn<br />

se posílají pakety ”HELLO” a ”ECHO”. Má lepší škálovatelnost, hodí se pro<br />

větší sítě.<br />

Hierarchické směrování, autonomní systémy<br />

Hierarchické směrování znamená rozdělení sítě do oblastí (areas) a směrování mezi<br />

nimi jen přes vstupní body. Je vhodné pro velké, složitě propojené nebo různým<br />

způsobem spravované sítě. Nad oblastmi se vytvoří propojení – backbone area<br />

(páteřní systém), přes které se směrování mezi oblastmi provádí. Celému tomuto<br />

(areas + backbone area) se říká autonomní systém. Detailní směrovací informace<br />

neopouštějí jednotlivé oblasti.<br />

Pro směrování v rámci jedné oblasti i mezi oblastmi v rámci jednoho autonomního<br />

systému slouží jeden z tzv. interior gateway protocols, může být použit např.<br />

OSPF nebo RIP, případně další jako IGRP (interior gateway routing protocol,<br />

typu vector distance) nebo EIGRP (enhaced IGRP, hybrid mezi vector distance<br />

a link state). Mezi jednotlivými autonomními systémy (přes AS boundary routers)<br />

se směruje pomocí exterior gateway protocolu, jedním z nich je např. Border<br />

Gateway Protocol (BGP).<br />

Díky existenci autonomních systémů jde např. při peeringu stanovit, který<br />

provoz půjde přes peering a který výše po upstreamu do páteřních sítí.<br />

Fragmentace<br />

Maximum transmission unit (MTU) je maximální velikost paketu, který je<br />

možné přenést z jednoho síťového zařízení na druhé. Obvyklá hodnota MTU v<br />

případě Ethernetu je cca 1500 bajtů, nicméně mezi některými místy počítačové<br />

sítě (spojených například modemem nebo sériovou linkou) může být maximální<br />

délka přeneseného paketu nižší. Hodnotu MTU lze zjistit prostřednictvím protokolu<br />

ICMP. Při posílání paketů přes několik síťových zařízení je samozřejmě důležité<br />

nalézt nejmenší MTU na dané cestě. Hodnota MTU je omezena zdola na 576 bajtů.<br />

U přenosového protokolu TCP je při směrování paketu do přenosového kanálu<br />

s nižším MTU než je délka paketu, provedena fragmentace paketu. U protokolu<br />

UDP není fragmentace paketu podporována a paket je v takovém případě zahozen.<br />

Pokud dorazí na směrovač paket o velikosti větší, než kterou je přenosová trasa<br />

schopna přenést (např. při přechodu z Token Ringu používajícího 4 kByte pakety<br />

33


na Ethernet používajícího maximálně 1,5 kByte pakety), musí směrovač zajistit<br />

tzv. fragmentaci, neboli rozebrání paketu na menší části a cílový uzel musí zajistit<br />

opětovné složení, neboli defragmentaci.<br />

Fragmenty procházejí přes síť jako samostatné datagramy. Aby byl koncový uzel<br />

schopen fragmenty složit do originálního datagramu, musí být fragmenty příslušně<br />

označeny. Toto označování se provádí v příslušných polích IP hlavičky.<br />

Pokud nesmí být datagram fragmentován, je označen v příslušném místě IP hlavičky<br />

příznakem „Don‘t Fragment�. Jestliže takto označený paket dorazí na směrovač,<br />

který by jej měl poslat prostředím s nižším MTU a tudíž je nutnost provést<br />

fragmentaci, provede směrovač jeho zrušení a informuje odesílatele chybovou zprávou<br />

ICMP.<br />

Aby byl cílový uzel schopen složit originální datagram, musí mít dostatečný buffer<br />

do něhož jsou jednotlivé fragmenty ukládány na příslušnou pozici danou offsetem.<br />

Složení je dokončeno v okamžiku, kdy je vyplněn celý datagram začínající fragmentem<br />

s nulovým offsetem (identification a fragmentation offset v hlavičke) a končící<br />

segmentem s příznakem „More Data Flag� (resp. More Fragments) nastaveným na<br />

False.<br />

V IPv4 je možné fragmentované pakety ďalej deliť; naproti tomu v IPv6 musí<br />

fragmentáciu zabezpečiť odosielateľ – nevyhovujúce pakety sa zahadzujú.<br />

Spolehlivost, Flow control, Congestion control<br />

Keďže TCP/IP funguje nad obecne nespojovanými a nespoľahlivými médiami, spoľahlivosť<br />

ktorú TCP poskytuje nie je „skutočná�, ale len „softvérovo emulovaná�<br />

– medziľahlé uzly o spojení nič nevedia, fungujú nespojovane (pre komunikáciu sa<br />

používa sieťová vrstva, transportná „existuje� iba medzi koncovými uzlami). Je teda<br />

nutné ošetriť napr. nespoľahlivosť infraštruktúry (strácanie dát, duplicity – pričom<br />

stratiť sa môže aj žiadosť o vytvorenie pripojenia, potvrdenie...) a reboot uzlov<br />

(uzol stratí históriu, je potrebné ošetriť existujúce spojenia...).<br />

Používa sa celá rada techník, kde základom je kontinuálne potvrdzovanie: príjemca<br />

posiela kladné potvrdenia; odosielateľ po každom odoslaní spúšťa časovač a<br />

ak mu do vypršania nepríde potvrdenie, posiela dáta znovu. Potvrdzovanie nie je<br />

samostatné ale vkladá sa do paketov cestujúcich opačným smerom – piggybacking.<br />

TCP priebežne kontroluje „dobu obrátky� a vyhodnocuje vážený priemer a rozptyl<br />

dôb obrátky. Čakaciu dobu (na potvrdenie) potom vypočítava ako funkciu tohto<br />

váženého priemeru a rozptylu. Výsledný efekt je potom ten, že čakacia doba je tesne<br />

nad strednou dobou obrátky. V prípade konštantnej doby obrátky sa čakacia doba<br />

približuje strednej dobe obrátky; ak kolíše, čakacia doba sa zväčšuje.<br />

Dáta v TCP sa príjímajú/posielajú po jednotlivých byteoch – interne sa však<br />

bufferujú a posielajú až po naplnení buffera (pričom aplikácia si môže vyžiadať<br />

okamžité odoslanie – operácia PUSH). TCP si potrebuje označovať jednotlivé byty<br />

v rámci prúdu (keďže nepracuje s blokmi) – napr. kvôli potvrdzovaniu; používa sa<br />

na to 32-bitová pozícia v bytovom prúde (začína sa od náhodne zvoleného čísla).<br />

TCP sa snaží riadiť tok dát – aby odosielateľ nezahlcoval príjemcu a kvôli<br />

tomu nedochádzalo k stráte dát. Podstata riešenia je tzv. metóda okienka. Okienko<br />

udáva veľkosť voľných bufferov na strane prijímajúceho a odosielateľ môže posielať<br />

dáta až do „zaplnenia� okienka. Príjemca spolu s každým potvrdením posiela aj<br />

34


svoju ponuku – údaj o veľkosti okienka (window advertisment)., ktorý hovorí koľko<br />

ešte dát je schopný prijať (naviac k práve potvrdeným). Znovu – používa sa metóda<br />

kontinuálneho potvrďovania.<br />

Väčšina strát prenášaných dát ide skôr na vrub zahlteniu ako chybám HW a<br />

transportné protokoly môžu nevhodným chovaním zhoršovať dôsledky. TCP každú<br />

stratu dát chápe ako dôsledok zahltenia – nasadzuje opatrenia proti zahlteniu<br />

(congestion control). Po stráte paketu ho pošle znovu ale neposiela ďalšie a čaká<br />

na potvrdenie (tj. prechod z kontinuálneho potvrdzovania na jednotlivé ⇒ vysiela<br />

menej dát ako mu umožňuje okienko). Ak príde potvrdenie včas, zdvojnásobí množstvo<br />

odosielaných dát – a tak pokračuje kým nenarazí na aktuálnu veľkosti okienka<br />

(postupne sa tak vracia na kontinuálne potvrdzovanie).<br />

Dôležitou vlastnosťou je aj korektné chovanie pri naväzovaní a rušení spojenia<br />

(v prostredí, kde môže dôjsť k spomaleniu, strate, duplicite...) – používa sa tzv.<br />

3-fázový handshake. Vytvorenie spojenia prebieha nasledovne:<br />

1. Klient pošle serveru SYN paket (v pakete je nastavený príznak SYN) spolu s<br />

náhodným sequence number (X).<br />

2. Server tento paket prijme, zaznamená si sequence number (X) a pošle späť<br />

paket SYN-ACK. Tento paket obsahuje pole Acknowledgement, ktoré označuje<br />

ďalšie číslo (sequence number), ktoré tento host očakáva (X+1). Tento host<br />

rovno vytvorí spätnú session s vlastným sekvenčným číslom (Y).<br />

3. Klient odpovie so sekvenčným číslom (X+1) a jednoduchým Acknowledgement<br />

číslom (Y+1) – čo je sekvenčné číslo servera+1.<br />

Pak už spojení považováno za navázané. Rušenie spojenia funguje podobne, posílají<br />

se pakety FIN (finish), FIN+ACK a ACK. Pokud více než nějaký určitý počet<br />

pokusů o odeslání (po spočítaných time-outech) jednoho z 3-way handshake paketů<br />

selže (druhá strana neodešle to, co mělo následovat), spojení se považuje za přerušené<br />

(i u navazování, i u rušení).<br />

NAT<br />

TODO: přeložit ty copy & paste z Wiki<br />

Network address translation (zkráceně NAT, česky překlad síťových adres) je<br />

funkce síťového routeru pro změnu IP adres packetů procházejících zařízením, kdy se<br />

zdrojová nebo cílová IP adresa převádí mezi různými rozsahy. Nejběžnější formou je<br />

tzv. maškaráda (maskování), kdy router IP adresy z nějakého rozsahu mění na svoji<br />

IP adresu a naopak – tím umožňuje, aby počítače ve vnitřní síti (LAN) vystupovaly<br />

v Internetu pod jedinou IP adresou. Router si drží po celou dobu spojení v paměti<br />

tabulku překladu adres.<br />

Překlad síťových adres je funkce, která umožňuje překládání adres. Což znamená,<br />

že adresy z lokální sítě přeloží na jedinečnou adresu, která slouží pro vstup do jiné sítě<br />

(např. Internetu), adresu překládanou si uloží do tabulky pod náhodným portem,<br />

při odpovědi si v tabulce vyhledá port a pošle pakety na IP adresu přiřazenou k<br />

danému portu. NAT je vlastně jednoduchým proxy serverem (na sieťovej vrstve).<br />

35


Komunikace<br />

Klient odešle požadavek na komunikace, směrovač se podívá do tabulky a zjistí,<br />

zdali se jedná o adresu lokální, nebo adresu venkovní. V případě venkovní adresy<br />

si do tabulky uloží číslo náhodného portu, pod kterým bude vysílat a k němu si<br />

přiřadí IP adresu. Během přeposílání „ven� a změny adresy v paketu musí NAT<br />

také přepočítat CRC checksum TCP i IP (aby pakety nebyly zahazovány kvůli<br />

špatnému CRC, protože změněná adresa je jejich součástí).<br />

Výhodami NAT sú umožnenie pripojenie viacerých počítačov do internetu cez<br />

jednu zdieľanú verejnú IP adresu, a zvýšenie bezpečnosti počítačov za NATom (aj<br />

keď je to security through obscurity a nie je dobré postaviť bezpečnosť iba na<br />

NATe). Nevýhodami potom sú nefungujúce protokoly (napr. aktívne FTP) – čo<br />

je zrejmé z fungovania NATu.<br />

NAT Traversal<br />

NAT traversal refers to an algorithm for the common problem in TCP/IP networking<br />

of establishing connections between hosts in private TCP/IP networks that<br />

use NAT devices.<br />

This problem is typically faced by developers of client-to-client networking<br />

applications, especially in peer-to-peer and VoIP activities. NAT-T is commonly<br />

used by IPsec VPN clients in order to have ESP packets go through NAT.<br />

Many techniques exist, but no technique works in every situation since NAT<br />

behavior is not standardized. Many techniques require a public server on a wellknown<br />

globally-reachable IP address. Some methods use the server only when<br />

establishing the connection (such as STUN), while others are based on relaying all<br />

the data through it (such as TURN), which adds bandwidth costs and increases<br />

latency, detrimental to conversational VoIP applications.<br />

Druhy uspořádání NATu<br />

• Static NAT : A type of NAT in which a private IP address is mapped to a public<br />

IP address, where the public address is always the same IP address (i.e., it has<br />

a static address). This allows an internal host, such as a Web server, to have<br />

an unregistered (private) IP address and still be reachable over the Internet.<br />

• Dynamic NAT — A type of NAT in which a private IP address is mapped to<br />

a public IP address drawing from a pool of registered (public) IP addresses.<br />

Typically, the NAT router in a network will keep a table of registered IP<br />

addresses, and when a private IP address requests access to the Internet, the<br />

router chooses an IP address from the table that is not at the time being used<br />

by another private IP address. Dynamic NAT helps to secure a network as it<br />

masks the internal configuration of a private network and makes it difficult for<br />

someone outside the network to monitor individual usage patterns. Another<br />

advantage of dynamic NAT is that it allows a private network to use private<br />

IP addresses that are invalid on the Internet but useful as internal addresses.<br />

• PAT — PAT (NAT overloading) je další variantou NATu. U této varianty<br />

NATu se více inside local adres mapuje na jednu inside global adresu na různých<br />

portech. Tedy máme jednu veřejnou adresu a vnitřní síť oadresovanou<br />

36


ARP<br />

inside local adresami. Překladová tabulka je rozšířena o dvě položky: inside local<br />

port – port, ze kterého byl paket odeslán a inside global port – číslo portu,<br />

na který je paket odeslaný ze zdrojového portu počítače mapován. Výhodou<br />

je, že se tak připojuje více počítačů přes jednu IP adresu.<br />

Address Resolution Protocol (ARP) se v počítačových sítích s IP protokolem<br />

používá k získání ethernetové (MAC) adresy sousedního stroje z jeho IP adresy.<br />

Používá se v situaci, kdy je třeba odeslat IP datagram na adresu ležící ve stejné<br />

podsíti jako odesílatel. Data se tedy mají poslat přímo adresátovi, u něhož však<br />

odesílatel zná pouze IP adresu. Pro odeslání prostřednictvím např. Ethernetu ale<br />

potřebuje znát cílovou ethernetovou adresu.<br />

Proto vysílající odešle ARP dotaz (ARP request) obsahující hledanou IP adresu<br />

a údaje o sobě (vlastní IP adresu a MAC adresu). Tento dotaz se posílá linkovým<br />

broadcastem – na MAC adresu identifikující všechny účastníky dané lokální sítě<br />

(v případě Ethernetu na ff:ff:ff:ff:ff:ff). ARP dotaz nepřekročí hranice dané podsítě,<br />

ale všechna k ní připojená zařízení dotaz obdrží a jako optimalizační krok si zapíší<br />

údaje o jeho odesílateli (IP adresu a odpovídající MAC adresu) do své ARP cache.<br />

Vlastník hledané IP adresy pak odešle tazateli ARP odpověď (ARP reply) obsahující<br />

vlastní IP adresu a MAC adresu. Tu si tazatel zapíše do ARP cache a může odeslat<br />

datagram.<br />

Informace o MAC adresách odpovídajících jednotlivým IP adresám se ukládají do<br />

ARP cache, kde jsou uloženy do vypršení své platnosti. Není tedy třeba hledat MAC<br />

adresu před odesláním každého datagramu – jednou získaná informace se využívá<br />

opakovaně. V řadě operačních systémů (Linux, Windows XP) lze obsah ARP cache<br />

zobrazit a ovlivňovat příkazem arp.<br />

Alternativou pro počítač bez ARP protokolu je používat tabulku přiřazení MAC<br />

adres IP adresám definovanou jiným způsobem, například pevně konfigurovanou.<br />

Tento přístup se používá především v prostředí se zvýšenými nároky na bezpečnost,<br />

protože v ARP se dá podvádět – místo skutečného vlastníka hledané IP adresy může<br />

odpovědět někdo jiný a stáhnout tak k sobě jeho data.<br />

ARP je definováno v RFC 826. Používá se pouze pro IPv4. Novější verze IP protokolu<br />

(IPv6) používá podobný mechanismus nazvaný Neighbor Discovery Protocol<br />

(NDP, „objevování sousedů�).<br />

Ačkoliv se ARP v praxi používá téměř výhradně pro překlad IP adres na MAC<br />

adresy, nebyl původně vytvořen pouze pro IP sítě. ARP se může použít pro překlad<br />

MAC adres mnoha různých protokolů na síťové vrstvě. ARP byl také uzpůsoben tak,<br />

aby vyhodnocoval jiné typy adres fyzické vrstvy: například ATMARP se používá k<br />

vyhodnocení ATM NSAP adres v protokolu Classical IP over ATM.<br />

ICMP<br />

ICMP protokol (anglicky Internet Control Message Protocol) je jeden z<br />

jádrových protokolů ze sady protokolů internetu. Používají ho operační systémy po-<br />

37


čítačů v síti pro odesílání chybových zpráv – například pro oznámení, že požadovaná<br />

služba není dostupná nebo že potřebný počítač nebo router není dosažitelný.<br />

ICMP se svým účelem liší od TCP a UDP protokolů tím, že se obvykle nepoužívá<br />

sítovými aplikacemi přímo. Jedinou výjimkou je nástroj ping, který posílá ICMP<br />

zprávy „Echo Request� (a očekává příjem zprávy „Echo Response�) aby určil, zda<br />

je cílový počítač dosažitelný a jak dlouho paketům trvá, než se dostanou k cíli a<br />

zpět.<br />

ICMP protokol je součást sady protokolů internetu definovaná v RFC 792. ICMP<br />

zprávy se typicky generují při chybách v IP datagramech (specifikováno v RFC 1122)<br />

nebo pro diagnostické nebo routovací účely. Verze ICMP pro IPv4 je známá jako<br />

ICMPv4. IPv6 používá obdobný protokol: ICMPv6.<br />

ICMP zprávy se konstruují nad IP vrstvou; obvykle z IP datagramu, který ICMP<br />

reakci vyvolal. IP vrstva patřičnou ICMP zprávu zapouzdří novou IP hlavičkou<br />

(aby se ICMP zpráva dostala zpět k původnímu odesílateli) a obvyklým způsobem<br />

vzniklý datagram odešle. Například každý stroj (jako třeba mezilehlé routery), který<br />

forwarduje IP datagram, musí v IP hlavičce dekrementovat políčko TTL („time to<br />

live�, „zbývající doba života�) o jedničku. Jestliže TTL klesne na 0 (a datagram není<br />

určen stroji provádějícímu dekrementaci), router přijatý paket zahodí a původnímu<br />

odesílateli datagramu pošle ICMP zprávu „Time to live exceeded in transit� („během<br />

přenosu vypršela doba života�).<br />

Každá ICMP zpráva je zapouzdřená přímo v jediném IP datagramu, a tak (jako<br />

u UDP) ICMP nezaručuje doručení. Ačkoli ICMP zprávy jsou obsažené ve standardních<br />

IP datagramech, ICMP zprávy se zpracovávají odlišně od normálního zpracování<br />

prokolů nad IP. V mnoha případech je nutné prozkoumat obsah ICMP zprávy<br />

a doručit patřičnou chybovou zprávu aplikaci, která vyslala původní IP paket, který<br />

způsobil odeslání ICMP zprávy k původci.<br />

Mnoho běžně používaných síťových diagnostických utilit je založeno na ICMP<br />

zprávách. Příkaz traceroute je implementován odesíláním UDP datagramů se speciálně<br />

nastavenou životností v TTL políčku IP hlavičky a očekáváním ICMP odezvy<br />

„Time to live exceeded in transit� nebo „Destination unreachable�. Příbuzná utilita<br />

ping je implementována použitím ICMP zpráv „Echo� a „Echo reply�.<br />

Nejpoužívanější ICMP datagramy:<br />

• Echo: požadavek na odpověď, každý prvek v síti pracující na IP vrstvě by na<br />

tuto výzvu měl reagovat. Často to z různých důvodů není dodržováno.<br />

• Echo Reply: odpověď na požadavek<br />

• Destination Unreachable: informace o nedostupnosti cíle, obsahuje další upřesňující<br />

informaci<br />

– Net Unreachable: nedostupná cílová síť, reakce směrovače na požadavek<br />

komunikovat se sítí, do které nezná cestu<br />

– Host Unreachable: nedostupný cílový stroj<br />

– Protocol Unreachable: informace o nemožnosti použít vybraný protokol<br />

– Port Unreachable: informace o nemožnosti připojit se na vybraný port<br />

• Redirect: přesměrování, používá se především pokud ze sítě vede k cíli lepší<br />

cesta než přes defaultní bránu. Stanice většinou nepoužívají směrovací protokoly<br />

a proto jsou informovány touto cestou. Funguje tak, že stanice pošle<br />

38


datagram své, většinou defaultní, bráně, ta jej přepošle správným směrem a<br />

zároveň informuje stanici o lepší cestě.<br />

– Redirect Datagram for the Network: informuje o přesměrování datagramů<br />

do celé sítě<br />

– Redirect Datagram for the Host: informuje o přesměrování datagramů<br />

pro jediný stroj<br />

• Time Exceeded: vypršel časový limit<br />

– Time to Live exceeded in Transit: během přenosu došlo ke snížení TTL<br />

na 0 aniž byl datagram doručen<br />

– Fragment Reassembly Time Exceeded: nepodařilo se sestavit jednotlivé<br />

fragmenty v časovém limitu(např pokud dojde ke ztrátě části datagramů)<br />

Ostatní datagramy jsou používány spíše vzácně, někdy je používání ICMP znemožněno<br />

zcela špatným nastavením firewallu.<br />

UDP, TCP<br />

UDP – nespoľahlivý nespojovaný prenos datagramov... pridáva len porty<br />

TCP – porty+spoľahlivý spojovaný prenos streamov...<br />

...ďalšie info viď kapitolu o BSD Sockets :-)<br />

5.14 Spojované a nespojované služby, spolehlivost, zabezpečení<br />

protokolu<br />

TODO: všechno<br />

39

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!