Sot do të fillojmë studimin e rrugëzimit përmes protokollit OSPF. Ky temë, ashtu si shqyrtimi i protokollit EIGRP, është tepër e rëndësishme në të gjithë kursin CCNA. Siç e shihni, kapitulli 2.4 quhet "Konfigurimi, verifikimi dhe zgjidhja e problemeve të zonës së vetme dhe shumëzonave OSPFv2 për protokollin IPv4 (përjashtuar autentifikimin, filtrimin, grumbullimin manual të rrugëve, rikthimin, zonat e verbra, rrjetin virtual dhe LSA)".

Tematika OSPF është mjaft e gjerë, prandaj do të zgjasë 2, ndoshta 3 video mësimore. Mësimi i sotëm do të përqendrohet në anën teorike, do t'ju tregoj se çfarë përfaqëson ky protokoll në mënyrë të përgjithshme dhe si funksionon. Në videon e ardhshme do të kalojmë në modalitetin e konfigurimit OSPF duke përdorur Packet Tracer.
Pra këtij mësimi, do të shqyrtojmë tri gjëra: çfarë është OSPF, si funksionon dhe çfarë janë zonat OSPF. Në mësimin e kaluar, ne diskutuan se OSPF është një protokoll routing i tipit Link State, i cili shqyrton kanalet e komunikimit midis router-ve dhe merr vendime të bazuara në shpejtësinë e këtyre kanaleve. Një kanal i gjatë me shpejtësi më të madhe, pra me kapacitet më të madh do të ketë prioritet mbi një kanal të shkurtër me kapacitet më të ulët.
Protokolli RIP, si një protokoll distancë-vektori, do të zgjedhë rrugën me një hop, edhe nëse ky kanal ka shpejtësi të ulët, ndërsa protokolli OSPF do të zgjedhë një rrugë të gjatë me disa hop, nëse shpejtësia totale në këtë rrugë është më e lartë se shpejtësia e trafikut në rrugën e shkurtër.

Më vonë do të shqyrtojmë algoritmin e vendimmarrjes, për momentin duhet të mbani mend se OSPF është një protokoll i gjendjes së kanaleve Link State. Ky standard i hapur u krijua në vitin 1988, kështu që çdo prodhues pajisjesh rrjeti dhe çdo ofrues shërbimi rrjeti mund ta përdorë. Prandaj, OSPF është shumë më i njohur se EIGRP.
Protokolli OSPF versioni 2 mbështet vetëm protokollin IPv4, ndërsa një vit më vonë, në vitin 1989, zhvilluesit shpallën lëshimin e versionit 3, i cili mbështet IPv6. Megjithatë, versi i plotë i tretë i OSPF për IPv6 u shfaq vetëm në vitin 2008. Pse u zgjodh OSPF? Në mësimin e fundit ne mësuam se ky protokoll i brendshëm i kalimit realizon konvergjencën e rrugëve shumë më shpejt se RIP. Ky është një protokoll pa klasë.
Nëse e mbani mend, RIP është një protokoll me klasë, që do të thotë se nuk dërgon informacion për maskën e nënrrjetit dhe nëse has një adresë IP të klasës A\/24, ai nuk do ta pranojë atë. Për shembull, nëse i paraqisni atij një adresë IP si 10.1.1.0\/24, ai do ta interpretojë si rrjet 10.0.0.0, sepse nuk e kupton kur rrjeti ndahet në nënrrjeta duke përdorur më shumë se një maskë nënrrjeti.
OSPF është një protokoll të sigurt. Për shembull, kur dy routera shkëmbejnë informacion OSPF, ju mund ta konfiguroni autentikimin në mënyrë që të ndani informacionin me routerin fqinj vetëm pas futjes së fjalëkalimit. Siç e përmendëm, ky është një standard i hapur, ndaj shumë prodhues të pajisjeve rrjetin e përdorin OSPF.
Në një kuptim global, OSPF është një mekanizëm për shkëmbimin e njoftimeve mbi gjendjen e lidhjes, të njohura si Link State Advertisements, ose LSA. Mesazhet LSA gjenerohen nga router-i dhe përmbajnë shumë informacione: një identifikues unik të router-it (router-id), të dhëna mbi rrjetet që i janë të njohura router-it, të dhëna mbi koston e tyre dhe kështu me radhë. Të gjitha këto informacione nevojiten për që router-i të marrë vendime për rrugëzimin.

Router-i R3 dërgon informacionin e tij LSA tek router-i R5, ndërsa router-i R5 ndan informacionin e tij LSA me R3. Këto LSA përfaqësojnë një strukturë të dhënash që formojnë bazën e të dhënave të gjendjes së lidhjeve, të njohur si Link State Data Base, ose LSDB. Router-i grumbullon të gjitha LSA-të e marra dhe i vendos ato në LSDB-në e tij. Pas krijimit të bazave të dhënave nga të dy router-at, ata shkëmbejnë mesazhe Hello, të cilat shërbejnë për zbulimin e fqinjëve dhe fillojnë procedurën për krahasimin e LSDB-ve të tyre.
Routeri R3 i dërgon routerit R5 një mesazh DBD, ose "përshkrim të bazës së të dhënave", dhe R5 i kthen DBD-në routerit R3. Këto mesazhe përmbajnë indekset LSA që janë në bazat e secilit router. Pas marrjes së DBD-së, routeri R3 dërgon një kërkesë për gjendjen e rrjetit LSR routerit R5, ku thotë: "është e qartë që kam mesazhet 3, 4 dhe 9, kështu që më dërgoni vetëm 5 dhe 7."
Po ashtu vepron R5, duke i njoftuar routerit të tretë: "kam informacionin 3, 4 dhe 9, kështu që më dërgoni 1 dhe 2." Pas marrjes së kërkesave LSR, routerët dërgojnë paketa për azhurnimin e gjendjes së rrjetit LSU, që do të thotë se në përgjigje të LSR-së së tyre, routeri i tretë merr LSU nga routeri R5. Pas azhurnimit të bazave të dhënave nga routerët, të gjithë ata, edhe nëse keni 100 routerë, do të kenë të njëjtat baza LSDB. Sa herë që në routerë krijohen bazat e të dhënave LSDB, secili prej tyre do të dijë për tërë rrjetin si një tërësi. Protokolli OSPF përdor algoritmin e Rrugëtimit më të Shkurtër për të krijuar tabelën e rrugëve, prandaj kushti më i rëndësishëm për funksionimin e tij të saktë është sinkronizimi i LSDB të të gjithë pajisjeve në rrjet.

Në skemën e dhënë janë të vendosura 9 routerë, secili prej të cilëve shkëmben mesazhe LSR, LSU dhe kështu me radhë me fqinjët e tij. Të gjithë ata janë të lidhur me njëri-tjetrin me interface p2p, ose "pikë-pikë", që mbështesin funksionimin sipas protokollit OSPF dhe bashkëveprojnë me njëri-tjetrin për të krijuar një LSDB të njëjtë.

Sapan e bazat të jenë sinkronizuar, çdo router, duke përdorur algoritmin e rrugës më të shkurtër, formon tabelën e tij të rrugëtimit. Të gjitha routerët e ndryshëm do të kenë tabela të ndryshme. Kështu, të gjithë routerët përdorin të njëjtën LSDB, por krijojnë tabela rrugëtimi në përputhje me arsyetimet e tyre për rrugët më të shkurtëra. Për të përdorur këtë algoritëm, OSPF ka nevojë për përditësimin e rregullt të bazës së LSDB.
Pra ndaj, për të funksionuar vetë, OSPF duhet së pari të sigurojë 3 kushte: të gjejë fqinjët, të krijojë dhe të përditësojë LSDB-në dhe të formojë tabelën e rutimit. Për të përmbushur kushtin e parë, admini rrjetit mund të ketë nevojë të konfigurojë manualisht router-id, kohët ose wildcard mask. Në videon tjetër do të shqyrtojmë konfigurimin e pajisjes për të punuar me OSPF, për tani duhet të dini se ky protokoll përdor maskën inverse, dhe nëse ajo nuk përputhet, nëse subnetet tuaja nuk përputhen, ose nuk përputhet autentikimi, fqinjësia e routerëve nuk do të mund të formohet. Prandaj, kur zgjidhni problemet e punës së OSPF, duhet të zbulojë se përse kjo fqinjësi nuk formohet, domethënë të kontrolloni përputhshmërinë e parametrave të mësipërm.
Si admin i rrjetit, nuk merrni pjesë në procesin e krijimit të LSDB-së. Përditësimi i bazave të të dhënave ndodh automatikisht pas krijimit të fqinjësisë së routerëve, ashtu siç është ndërtimi i tabelave të rutimit. Të gjitha këto bëhen nga pajisja vetë, e cila është konfigurur për të punuar me protokollin OSPF.
Давайте рассмотрим пример. У нас имеются 2 роутера, которым я для упрощения присвоил идентификаторы RID 1.1.1.1 и 2.2.2.2. Как только мы соединим их, канал link сразу же перейдет в состояние up, потому что сначала я настроил эти роутеры на работу с OSPF. Как только будет образован канал связи, роутер А немедленно оправит второму пакет Hello. В этом пакете будет содержаться информация, что данный роутер еще никого не «видел» на этом канале, потому что отсылает Hello впервые, а также его собственный идентификатор, данные о подсоединенной к нему сети и другая информация, которой он может поделиться с соседом.

Pasi e merr këtë paketë, ruter B do të thotë: «po shoh se në këtë kanalin e komunikimit ka një kandidat të mundshëm për fqinjësi sipas protokollit OSPF» dhe do të kalojë në gjendjen e inicializimit të quajtur Init state. Paketa Hello është një paketë multicast, e dërguar në adresën multicast OSPF IP 224.0.0.5. Disa njerëz pyesin për maskën e nënrrjetit për multicast. E vërteta është se multicast nuk ka maskë nënrrjeti, ai shpërndahet si një sinjal radio që e dëgjojnë të gjitha pajisjet që janë të konfiguruara për këtë frekuencë. Për shembull, nëse dëshironi të dëgjoni radio FM që transmeton në frekuencën 91,0, duhet ta rregulloni pranuesin tuaj radio në këtë frekuencë.
Po ashtu, ruter B është i konfiguruar për të pranuar mesazhe për adresën multicast 224.0.0.5. Ndërsa dëgjon këtë kanal, ai pranon paketën Hello, e cila është dërguar nga ruter A, dhe i përgjigjet me mesazhin e tij.

Dhe, fqia e përfshirë mund të vendoset vetëm nëse përgjigjja B përmbush një grup kriteresh. Kriteri i parë është frekuenca e dërgimit të mesazheve Hello dhe intervali i pritjes për përgjigje në këtë mesazh, Dead Interval, duhet të përputhen për të dy ruterët. Zakonisht, Dead Interval është i barabartë me disa vlera të timer-it Hello. Kështu, nëse Hello Timer i ruteri A është 10 s dhe ruteri B i dërgon një mesazh pas 30 s, ndërsa Dead Interval është 20 s, fqia nuk do të ngushtohet.
Kriteri i dytë është që të dy ruterët duhet të përdorin llojin e njëjtë të autentifikimit. Kështu, fjalëkalimet e autentifikimit gjithashtu duhet të përputhen.
Kriteri i tretë është përputhja e identifikatorëve të zonës Arial ID, kriteri i katërt – përputhja e gjatësi të prefiksit të rrjetit. Nëse ruteri A raporton një prefiks /24, atëherë ruteri B gjithashtu duhet të ketë një prefiks rrjeti /24. Në videon e mëposhtme do ta shqyrtojmë këtë më në detaje, për tani vërej se kjo nuk është maskë nënrrjeti, këtu ruterët përdorin maskën inverse Wildcard mask. Dhe sigurisht, flamujt e zonës stub Stub area gjithashtu duhet të përputhen, nëse ruterët ndodhen në këtë zonë.
Pas shqyrtimit të këtyre kritereve, nëse ato përputhen, routeri B i dërgon routerit A paketën e tij Hello. Ndryshe nga mesazhi A, routeri B njofton se ka parë routerin A dhe paraqitet vetë.

Në përgjigje të këtij mesazhi, routeri A përsëri dërgon Hello routerit B, duke konfirmuar se gjithashtu e ka parë routerin B, kanali i komunikimit midis tyre përbëhet nga pajisjet 1.1.1.1 dhe 2.2.2.2, dhe ai vetë është pajisja 1.1.1.1. Kjo është një fazë shumë e rëndësishme për vendosjen e fqinjësisë. Në këtë rast përdoret një lidhje e dyanshme 2-WAY, por çfarë do të ndodhë nëse kemi një switch me një rrjet të shpërndarë prej 4 routerash? Në një mjedis të tillë "të ndarë", një nga routerat duhet të luajë rolin e routerit të caktuar Designated router D.R, ndërsa tjetri – routerit rezervë të caktuar Backup designated router B.D.R.

Secila nga këto pajisje do të krijojë një lidhje të plotë, ose një gjendje të plotësisë fqinjësore, më vonë do ta shqyrtojmë çfarë është kjo, megjithatë lidhja e tillë do të vendoset vetëm me D.R. dhe B.D.R, ndërsa dy routerat e poshtëm D dhe B do të vazhdojnë të komunikojnë në skemën e lidhjes dyanshme "point-to-point".
Kjo do të thotë se me D.R. dhe B.D.R. të gjithë routerat krijojnë një marrëdhënie fqinjësie të plotë, ndërsa mes tyre – një lidhje lloj point-to-point. Kjo është shumë e rëndësishme, sepse gjatë një lidhjeje dypalëshe të pajisjeve fqinje, të gjitha parametrat e paketës Hello duhet të përputhen. Në rastin tonë, të gjitha përputhen, prandaj pajisjet krijojnë fqinjësi pa asnjë problem.
Sa herë që lidhja dypalëshe është krijuar, routeri A i dërgon routerit B një paketë përshkrimi të bazës së të dhënave, ose 'përshkrimi i bazës së të dhënave', dhe kalon në gjendjen ExStart — fillimi i shkëmbimit, ose pritja për ngarkesë. Përshkruesi i Bazës së Dhënave përbën informacion të ngjashëm me përmbajtjen e një libri – është një renditje e të gjitha atyre që ka në bazën e të dhënave të rrugës. Në përgjigje, routeri B dërgon përshkrimin e tij të bazës së të dhënave për routerin A dhe kalon në gjendjen e shkëmbimit të të dhënave mbi kanalet Exchange. Nëse në gjendjen Exchange routeri ka zbuluar se i mungon ndonjë informacion në bazën e të dhënave, ai do të kalojë në gjendjen e ngarkesës LOADING dhe do të fillojë të shkëmbejë mesazhet LSR, LSU dhe LSA me fqinjën.

Kështu, ruteri A do të dërgojë një LSR te fqinjët, ata do të përgjigjen me një paketë LSU, dhe pastaj ruteri A do t'i dërgojë ruteri B një mesazh LSA. Ky shkëmbim do të ndodhë sa herë që pajisjet duan të shkëmbejnë mesazhe LSA. Shteti LOADING do të thotë që përditësimi i plotë i bazës së të dhënave LSA ende nuk ka ndodhur. Pas ngarkimit të të dhënave, të dy pajisjet do të kalojnë në një gjendje të plotë ngushtësie FULL.
Vërej se në një lidhje dyanshmerrëse, pajisjet ndodhen thjesht në një gjendje fqinjësie, ndërsa gjendja e plotë ngushtësie është e mundur vetëm midis ruterëve, D.R. dhe B.D.R. Kjo do të thotë se çdo ruter njofton D.R. për ndryshimet në rrjet, dhe të gjithë ruterët e dinë për këto ndryshime nga D.R.
Zgjedhja e D.R. dhe B.D.R është një çështje e rëndësishme. Le të shohim se si ndodh zgjedhja e D.R. në një mjedis të zakonshëm. Supozoni se në skemën tonë ka tre ruterë dhe një switch. Së pari, pajisjet OSPF krahasojnë prioritetin në mesazhet Hello, pastaj krahasojnë Router ID-në.
Pajisja me prioritetin më të lartë bëhet D.R. Nëse prioritetet e dy pajisjeve janë të barabarta, atëherë prej tyre do të zgjidhet pajisja me Router ID-në më të lartë, e cila do të bëhet D.R.
Ruter i rezervës B.D.R është pajisja me prioritetin e dytë më të lartë ose me Router ID me rëndësi të dytë. Nëse D.R. dështon, B.D.R. do ta zëvendësojë menjëherë. Ai do të fillojë të luajë rolin e D.R, ndërsa sistemi do të zgjedhë një tjetër B.D.R.

Shpresoj se keni kuptuar se si të zgjidhni D.R. dhe B.D.R, nëse jo, do të ri-kthehem te ky çështje në një nga videot e ardhshme dhe do ta shpjegoj këtë proces.
Pra, ne shqyrtuam se çfarë përfaqëson Hello, përshkrimi i databazës Database Descriptor dhe mesazhet LSR, LSU dhe LSA. Para se të kalojmë në temën e ardhshme, le të flasim pak për koston OSPF.

Në Cisco, kostoja e rrugës llogaritet sipas formulës së raportit të shpejtësisë së referencës bandwidth, e cila pranohet si 100 mbit/s si parazgjedhje, ndaj kostos së kanalit. Për shembull, kur pajisjet lidhen përmes një porte seriale me shpejtësi 1.544 mbit/s, kostoja do të jetë 64. Ndërsa, për një lidhje Ethernet me shpejtësi 10 mbit/s, kostoja është 10, dhe kostoja e lidhjes FastEthernet me shpejtësi 100 mbit/s do të jetë 1.
Kur përdorni Gigabit Ethernet, ne kemi një shpejtësi prej 1000 Mbit/s, megjithatë në këtë rast, shpejtësia gjithmonë pranohet të jetë 1. Prandaj, nëse keni Gigabit Ethernet në rrjet, duhet të ndryshoni vlerën e paracaktuar Ref. BW në 1000. Në këtë rast, kostoja do të jetë 1 dhe e gjithë tabela do të ripohohet me rritje të vlerave të kostos 10 herë. Pasi të kemi formuar fqinjësinë dhe ndërtuar bazën e të dhënave LSDB, kalojmë në ndërtimin e tabelës së rrugës.

Pasi të ketë marrur LSDB, secili nga routerët menjëherë fillon të formojë listën e rrugëve duke përdorur algoritmin SPF. Në skemën tonë, routeri A do të krijojë një tabelë të tillë për vete. Për shembull, ai llogarit kostot e rrugës A-R1 dhe e përcakton atë të barabartë me 10. Për ta simplifikuar kuptimin e skemës, le të supozojmë se routeri A përcakton rrugën optimale drejt routerit B. Kostoja e lidhjes A-R1 është 10, lidhja A-R2 është 100, dhe kostoja e rrugës A-R3 është 11, e cila është shuma e rrugës A-R1(10) dhe R1-R3(1).
Nëse routeri A dëshiron të arrijnë në routerin R4, ai mund ta bëjë këtë ose nëpërmjet rrugës A-R1-R4, ose në rrugën A-R2-R4, dhe në të dy rastet kosto e rrugëve do të jetë e njëjtë: 10+100 =100+10=110. Rruga A-R6 do të kushtojë 100+1= 101, që është më mirë. Më pas shqyrtohet rruga drejt routerit R5 nëpërmjet rrugës A-R1-R3-R5, kosto e së cilës do të jetë 10+1+100 = 111.
Rruga drejt routerit R7 mund të kalojë nëpër dy rruge: A-R1-R4-R7 ose A-R2-R6-R7. Kosto e së parës do të jetë 210, ndërsa e dytës 201, kështu që duhet të zgjidhet 201. Pra, për të arritur routerin B, routeri A mund të përdorë 4 rrugë.

Kosto e rrugës A-R1-R3-R5-B do të jetë 121. Rruga A-R1-R4-R7-B do të kushtojë 220. Rruga A-R2-R4-R7-B kushton 210, ndërsa A-R2-R6-R7-B ka kosto 211. Duke u bazuar në këtë, routeri A do të zgjedhë rrugën me koston më të ulët, e barabartë me 121, dhe do ta vendosë atë në tabelën e rutimit. Kjo është një skemë shumë e thjeshtuar e mënyrës se si funksionon algoritmi SPF. Në të vërtetë, në tabelë vendoset jo vetëm emrat e routerëve përmes të cilëve kalon rruga optimale, por edhe emrat e porteve që i lidhin ata dhe gjithë informacionin tjetër të nevojshëm.
Le të shqyrtojmë një temë tjetër që ka të bëjë me zonat e ruterit. Zakonisht, gjatë konfigurimit të pajisjeve OSPF, të gjitha ato ndodhen në një zonë të përbashkët.

Çfarë do të ndodhë nëse një pajisje e lidhur me routerin R3 papritur dështon? Routeri R3 do të fillojë menjëherë të dërgojë mesazhe në adresë të routerëve R5 dhe R1 duke njoftuar se kanali me këtë pajisje nuk funksionon më, dhe të gjithë routerët do të fillojnë të shkëmbejnë përditësime në lidhje me këtë ngjarje.

Nëse keni 100 routera, të gjithë do të përditësojnë informacionin mbi statusin e kanaleve, pasi ndodhen në një zonë të përbashkët. E njëjta gjë do të ndodhë në rast se një nga routerat fqinj dështon – të gjitha pajisjet në zonë do të shkëmbejnë azhurnimet LSA. Pas shkëmbimit të atyre mesazheve, topologjia e rrjetit do të ndryshojë. Sa herë që kjo ndodh, SPF përratanon tabelat e routing-ut sipas kushteve të ndryshuara. Ky është një proces shumë i madhe, dhe nëse keni një mijë pajisje në një zonë, duhet të kontrolloni madhësinë e memories së routerave për të siguruar që ajo është e mjaftueshme për të ruajtur të gjitha LSA-të dhe bazën e dhënave të gjendjes së kanaleve LSDB. Sa herë që ndodhin ndryshime në një pjesë të zonës, algoritmi SPF menjëherë përratanon rrugët. Në mënyrë default, LSA përditësohet çdo 30 minuta. Ky proces ndodh në të gjitha pajisjet jo njëkohësisht, megjithatë në çdo rast azhurnimet bëhen nga çdo router me një interval prej 30 minutash. Sa më shumë pajisje rrjetesh të keni, aq më shumë memorie dhe kohë kërkohet për të përditësuar LSDB.
Problemi mund të zgjidhet duke ndarë një zonë të përbashkët në disa zona të veçanta, që do të thotë të përdorni multi-zonimin. Për këtë, duhet të keni një plan ose skemë të tërë rrjetit që menaxhoni. Zona zero AREA 0 është zona juaj kryesore Main area. Kjo është ajo ku ndodh lidhja me rrjetin e jashtëm, për shembull, dalja në Internet. Kur krijoni zona të reja, duhet të drejtoheni nga rregulli: në çdo zonë duhet të ketë një ruter kufitar ABR, Area Border Router. Ruteri kufitar ka një ndërfaqe në një zonë dhe ndërfaqen tjetër në një zonë tjetër. Për shembull, ruteri R5 ka ndërfaqe në zonën 1 dhe zonën 0. Siç thashë, çdo zonë duhet të lidhë me zonën zero, pra të ketë një ruter kufitar, një nga ndërfaqet e të cilit është e lidhur me AREA 0.

Supozoni se lidhja R6-R7 ka dështuar. Në këtë rast, përditësimi LSA do të përhapen vetëm në zonën AREA 1 dhe do të lidhet vetëm me këtë zonë. Pajisjet në zonën 2 dhe në zonën 0 as që do ta dinë se ndodhi kjo. Routeri kufitar R5 përmbledh informacionin për atë që po ndodh në zonën e tij dhe dërgon në zonën kryesore AREA 0 informacionin e përmbledhur mbi gjendjen e rrjetit. Pajisjet në një zonë nuk kanë nevojë të dinë për të gjitha ndryshimet LSA brenda zonave të tjera, sepse routeri ABR do të përcjellë informacionin e përmbledhur mbi rrugët nga një zonë në tjetrën.
Nëse nuk po e kuptoni plotësisht konceptin e zonave, mund të mësoni më shumë në mësimet e ardhshme, kur do të merremi me konfigurimin e rrugëzimit OSPF dhe do të shqyrtojmë disa shembuj.

Faleminderit që jeni me ne. Ju përqejnë artikujt tanë? Doni të shihni më shumë materiale interesante? Na mbështesni me një porosi ose duke na rekomanduar miqve tuaj, 30% zbritje për përdoruesit e Habra për një alternativë unike të serverëve entry-level, e cila është krijuar nga ne për ju: (disponohen variante me RAID1 dhe RAID10, deri në 24 bërthama dhe deri në 40GB DDR4).
Dell R730xd për dy herë më lirë? Vetëm këtu në Holandë! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — nga $99! Lexoni rreth
Burimi: habr.com
