UNIX 7. Meziprocesová komunikace a sítě © Milan Keršlágerhttp:// Obsah: ● meziprocesová komunikace, soubor, sdílená paměť ● mapování souborů do paměti, signály, zasílání zpráv ● roura, pojmenovaná roura, IPC soket ● zamykání souborů, souborové zámky ● TCP/IP, RFC, BSD socket API, síťové rozhraní ● směrovací tabulka, DNS, resolver, diagnostika sítě ● superserver xinetd, firewall
Účely komunikace ● Inter-Process Communication (IPC) ● multiprogramování – úloha je rozdělena na více samostatných úloh, aby mohly být zpracovávány odděleně – je nutné zajistit synchronizaci, signalizaci a výměnu dat ● clustery – výpočty probíhají na oddělených počítačích – je nutné zajistit synchronizaci, signalizaci a výměnu dat při využití počítačové sítě
Meziprocesová komunikace ● soubor ● sdílená paměť ● mapování souborů do paměti ● signály ● zasílání zpráv ● roura ● pojmenovaná roura ● IPC socket ● zamykání souborů
Soubor ● nejjednodušší výměna dat mezi procesy ● dočasné soubory ● v unixových systémech v adresáři /tmp, /var/tmp – všichni mají právo zápisu → mohou si vzájemně škodit ● používá se sticky bit → nelze si vzájemně mazat i přes „w“ ● i tak vyžaduje vytváření dočasných souborů speciální zacházení ● zejména u privilegovaných procesů je riziko poměrně velké ● též problém souběhu → náhodné názvy, zamykání ● komunikace je však poměrně těžkopádná ● velká režie (zápis na HDD) ● mají však všechny systémy → přenositelnost
Sdílená paměť ● procesy jsou normálně odděleny ● kromě threadů, které mají sdílenou paměť záměrně ● sdílená paměť je shodná s částí jiného procesu ● při zápisu problém souběhu – řeší se zamykáním, synchronizačními primitivy ● funkce pro ovládání definuje POSIX – definuje vytvoření, připojení, získání ukazatele – pak zápisy i čtení, odpojení, zrušení sdílené paměti – zaručuje přenositelnost
Mapování souborů do paměti ● původně metoda nahrazující klasické operace ● otevření, čtení, zápis, posun ukazatele, zavření – nevýhodou je neustále kopírování dat mezi cache, bufferem a paměťovým prostorem procesu ● využívá mechanismu „výpadku stránky“ – odkládání nepoužívaných částí paměti na disk – využíváno u stránkování paměti ● lze využít i pro meziprocesovou komunikaci ● namapovaný soubor může být sdílen více procesy ● samozřejmě je nutné řešit souběh atp.
Signály ● jednoduchá meziprocesová komunikace ● implementováno v jádře OS ● asynchronní signalizace mezi procesy – v unixových OS může odesílat signál i jádro OS ● lze poslat jen vlastním procesům – správce (root) může poslat signál všem procesům ● proces zpracovává signál vyvoláním procedury – implicitní akce, ignorování signálu, vlastní obsluha signálu – ne všel lze předefinovat (KILL bohužel, resp. naštěstí nejde) – při zpracování volat jen bezpečné funkce (! reentrantnost) ● odesláním signálu systémovým voláním kill()
Syscall: kill() ● název podle signálu KILL ● signály odlišeny názvy, ty mapovány na čísla – HUP – „zavěšení“ + ukončení, dnes rekonfigurace – INT – přerušení (z terminálu CTRL+c) – QUIT – ukončení + core dump – KILL – nepodmíněné ukončení procesu („vražda“) ● nelze ve stavu D (proces je v jádře, čeká na dokončení I/O) – SEGV – porušení ochrany paměti – PIPE – signalizace rozpadu roury (ukončení skupiny) – TERM – slušná žádost o ukončení procesu – STOP – pozastavení procesu – CONT – obnovení běhu procesu
Příkaz kill ● zasílání signálů z příkazového řádku ● kill -l → vypíše seznam signálů + jejich čísla ● kill – zaslání signálu TERM (žádost o ukončení) – je číslo procesu – signál lze posílat jen svým procesům, root může všem ● kill -1 nebo kill -HUP – dnes někdy znovunačtení konfigurace (rekonfigurace) ● kill -9 nebo kill -KILL – bezpodmínečné ukončení procesu
Zasílání zpráv ● univerzálnější, než signály ● mezi procesy lze přenášet i data ● implementace v jádře nebo jako sdílená paměť ● řešení mezních situací ● synchronní a asynchronní ● jednosměrné, obousměrné ● spolehlivý přenos nebo bez záruk – nutnost implementovat fronty, potvrzování zpráv ● řešení duplikace, ztráty, příjemce skončil atd.
Kolona (roura) ● propojení příbuzných procesů ● propojení přes deskriptory – jednosměrné spojení (jeden zapisuje, druhý čte) ● vytváří se skupina procesů – jádro posílá při přerušení roury signál SIGPIPE – skupina reaguje ukončením („broken pipe“) ● v paměti kruhový vyrovnávací paměť – buffer ● typicky se využívá v příkazovém řádku grep ro /etc/passwd | sort
Pojmenovaná roura ● umožňuje spojení nepříbuzných procesů ● definuje POSIX ● styčné místo je speciální soubor typu roura – název lze nějak předat nepříbuzným procesům – vytvořená pojmenovaná roura „přežije“ ukončení procesů ● data vyměňována v paměti (buffer) ● pouze jednosměrná komunikace (FIFO) – jeden proces zapisuje, další čte
IPC socket ● též tzv. Unix Domain Socket, definuje POSIX ● speciální soubor, ale implementováno v RAM ● obdoba síťové komunikace – od roury přidává obousměrnou komunikaci – navíc možnost více klientů ● například PostgreSQL server + klient – /tmp/.s.PGSQL.5432 – klient otevře a připojí se
Zamykání souborů ● pro zabránění souběhu ● v unixových systémech jen informativní (advisory) – i když je na soubor aplikován zámek, jádro ho nevynutí – všechny programy musí zámky respektovat – funkce fcntl() a flock() → též na části souboru ● sdílené zámky – též nazývány jako zámky pro čtení ● exkluzivní zámky – též nazývány jako zámky pro zápis ● souborové zámky
Souborové zámky ● soubor signalizující zamčeno ● např. /etc/shadow.lock – znamená: někdo si mění heslo, tak počkáme – někdy název včetně PID procesu, který ho vytvořil ● opět jde o záležitost respektu, jádro nevynucuje ● používá se ve shellu a na FS bez podpory zámků – např. starší verze NFS bez lock démona ● vytvoření musí být atomická operace – v shellu „noclobber“ nebo vytvoření adresáře – v zásadě poměrně komplikovaná logika – problém „opuštěných zámků“ (anglicky: stale lock file)
Historie počítačových sítí ● první pokusy dálkového spojení již 1940 ● ovládání kalkulátoru dálnopisem v USA (Stibitz) ● 60. léta → různé pokusy ● systémy podporující multitasking – 1964 time-sharing systémy ● USA: Dartmouth – pro 300 studentů, Berkeley (Thompson) – 1967 IBM: OS/360 s MFT ● řízení telefonní ústředny počítačem ● 1969 ARPANET – 50kbps – 1975 – počátek vývoje TCP/IP – 1983: ARPANET adoptoval TCP/IP (IPv4)
TCP/IP ● celá rodina protokolů ● základem je IPv4, dnes nástup IPv6 – přenos pomocí datagramů („salámová metoda“) – používání IP adres (např ) ● systém vrstev – vrstvy nezávislé, zaměnitelné, snadnější implementace – definována vzájemná komunikace vrstev (API) ● za přenos neodpovídá síť, ale koncové počítače – zjednodušení propojovacích prvků sítě – využívá se přepojování (přeposílání) datagramů
RFC ● Request Foc Comments ● neformální standardy pro Internet – též žertovná aprílová vydání ● vydává je RFC editor podle pokynů IAB – označována vzestupnou řadou čísel (první 1969) ● již vydané se neruší, jen nahradí novějším RFC ● dostupné na ● nejprve je vydán draft (návrh) – formulují experti na daný problém – osvědčí-li se, dostane přiděleno číslo a je vydáno
Implementace ● 1983: BSD socket API ● de fakto standard pro síťovou komunikaci – socket() → vytvoření socketu – bind() → připojení na lokální port (server) – listen() → zahájení naslouchání (server) – connect() → vytvoření nového spojení (klient) – accept() → přijmutí příchozího spojení (server) – send(), recv(), write(), read(), recvfrom(), sendto() – close() → uzavření spojení – gethostbyname(), gethostbyaddr() → převod IP – DNS – pool() → kontrola stavu socketu – select() → zjištění stavu více socketů (deskriptorů)
TCP/IP stack ● implementace umístěna v jádře OS ● společný kód pro všechny aplikace – snadněji se odstraňují chyby – je možné centrálně opravit chybu, doplnit novou vlastnost – např. DOS neměl, takže každá aplikace vlastní implem. ● velký rozsah řešených situací – ne všechny stavy definovány (pomocí RFC) – odchylky chování na nezvyklé situace → rozpoznání OS ● nástroj nmap ● umí odesílat a přijímat IP datagramy – též zajišťuje vyšší vrstvy pro ICMP, UDP, TCP
Součásti TCP/IP ● ICMP ● signalizace a řízení sítě – povinná součást implementace TCP/IP ● UDP ● systém „otázka → odpověď“, bez záruk ● např. DNS, ale i VoIP (Skype & spol.) ● TCP ● zajišťuje nad „nespolehlivou“ sítí zaručený přenos – tj. zachování pořadí, vyřešení ztrát a duplicit ● přenos ů, WWW,...
Síťové rozhraní ● slouží k realizaci komunikačního rozhraní ● určena IP adresa, maska sítě, MTU ● může být fyzické (síťová karta) nebo virtuální – označeno názvem (eth0, eth1, wlan0,...) – obsluhováno jádrem (resp. TCP/IP stackem) ● konfigurace příkazem ifconfig ifconfig – výpis všech aktivovaných rozhraní ifconfig eth0 up (nebo down ) ifconfig eth netmask
Příklad výpisu ~]$ LANG=C ifconfig lo Link encap:Local Loopback inet addr: Mask: UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets: errors:0 dropped:0 overruns:0 frame:0 TX packets: errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes: (13.1 MiB) TX bytes: (13.1 MiB) wlan0 Link encap:Ethernet HWaddr 00:1F:3B:58:43:EF inet addr: Bcast: Mask: UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets: errors:0 dropped:0 overruns:0 frame:0 TX packets: errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes: (24.8 MiB) TX bytes: (3.3 MiB)
Směrovací tabulka ● routing table ● definuje způsob odeslání IP datagramů – význam zejména u routerů (směrovačů) – koncová stanice jen k rozlišení ● přímý soused (ve stejné podsíti) ● odeslání přes bránu, resp. router („do Internetu“) ● součást TCP/IP stacku route -n route add č.sítě netmask maska gw IPbrány route add default gw Ipbrány route del č.sítě netmask maska
Příklad výpisu ~]$ LANG=C route -n Kernel IP routing table Destination Gateway Genmask Flag Metr Ref Use Iface U wlan UG wlan0
DNS ● Domain Name System ● hierarchický systém doménových jmen ● převod doménové jméno → IP adresa (a zpět) ● na počítači knihovna → resolver – viz dříve zméněné BSD socket API ● realizace DNS servery – pro dotaz používáme co nejbližší → nižší latence – využívá se cachování dotazů ● stanice musí znát IP adresu DNS serveru – typicky 2 různé (jako záložní)
Resolver ● knihovna pro podporu DNS ● převod doménové jméno → IP adresa (a zpět) – tj. odeslání a příjem patřičného UDP datagramu – viz zmíněné funkce gethostbyname()... ● nastavení uloženo v souboru /etc/resolv.conf ● nameserver ● nameserver ● domain mojedomena.cz ● search mojedomena.cz
Nastavení v počítači 1) manuální ● všechny údaje do konfiguračních souborů ● nastavení aktivováno při startu (skriptem) ● používá se typicky na serverech 2) automatické ● rozhraní obsluhuje DHCP klient – získá konfigurační informace z DHCP serveru – typicky pro uživatelské stanice – výhoda: nemusí se nikam nic zapisovat
Postup testování sítě 1) lokální IP adresa (v rámci svého počítače) – test loopbacku ( ping –n ) – test vlastních aktivních síťových rozhraní 2) ve stejné podsíti – schopnost komunikace s přímými sousedy – brána do Internetu je též ve stejné podsíti 3) mimo podsíť – kontakt s routerem a počítači za ním (Internet) – např.: ping –n ) test DNS ping seznam.cz
Příklady testů ping -n ping -n ping -n ping -n ping -n ping seznam.cz seznam.cz telnet telnet seznam.cz 80 GET / HTTP/1.0 {Enter}
Poskytování služeb ● každá služba typicky vlastního démona ● WWW → httpd ● FTP → vsftpd ● DNS → named ● DHCP → dhcpd ● Samba → smbd, nmbd ● atd. ● spouštěno pomocí skriptů ● /etc/init.d/httpd a skript chkconfig
Superserver xinetd ● nahrazuje trvale běžící síťové démony ● někdy nevýhodné mít neustále spuštěného démona – jde o úsporu systémových prostředků ● xinetd obsadí příslušný síťový TCP port ● při příchodu požadavku spustí obslužný program – musí být přizpůsoben funkci přes xinetd – po obsloužení požadavku skončí – není výhodné pro často využívané služby (WWW) ● konfigurace v adresáři /etc/xinetd.d/ chkconfig –-list atd.
Firewall ● firewall filtruje datagramy ● na vstupu, výstupu, procházející (router) – akce: přijme, odmítne, zahodí ● firewall umístěn mezi aplikací a síťovým rozhraním – v jádře (součást TCP/IP stacku) nebo formou aplikace 1) nestavový ● posuzuje jednotlivé datagramy 2) stavový ● posuzuje akci na základě předchozích – součást TCP spojení, limit za jednotku času atd.
Firewall v Linuxu ● iptables ● implementováno jako součást TCP/IP stacku – dostatečně kvalitní, rozšiřitelný ● nastavování stejnojmenným příkazem – nastavení z příkazového řádku – též nastavování přes GUI rozhraní ● je to nestavový i stavový firewall – je možno zapojit i externí aplikaci ● připravuje se náhrada – sjednocení podpory IPv4, IPv6, bridge