09.02. Maršrutēšanas principi

Last modified by Valdis Vītoliņš on 2018/01/15 21:44

09.02. Maršrutēšanas principi

Labs veids kā sākt apspriest IP maršrutēšanu ir saprast, ko uztur kodols savā maršrutēšanas tabulā. Informācija, kas atrodas maršrutēšanas tabulā vada visus IP veiktos maršrutēšanas lēmumus. 

03.03.nodaļā mēs pārskaitījām soļus, ko IP veic, meklējot maršrutēšanas tabulā: 

  1. Meklē atbilstošu mītnes adresi
  2. Meklē atbilstošu tīkla adresi
  3. Meklē noklusēto ierakstu (Noklusētais ieraksts parasti ir norādīts maršrutēšanas tabulā kā tīkla ieraksts ar tīkla ID = 0.)

Atbilstoša mītnes adrese vienmēr tiek lietota ar augstāku prioritāti nekā atbilstoša tīkla adrese. 

Maršrutēšana, ko veic IP, kad tas meklē maršrutēšanas tabulā un izlemj, pa kuru interfeisu izsūtīt paketi, ir maršrutēšanas mehānisms. Tas jāatšķir no maršrutēšanas politikas, kas ir likumu kopums, kas izlemj, kuri maršruti rakstāmi maršrutēšanas tabulā. IP veic maršrutēšanas mehānismu kamēr maršrutēšanas dēmons parasti nodrošina maršrutēšanas politiku. 

Vienkārša maršrutēšanas tabula.

Aplūkosim dažas tipiskas mītņu maršrutēšanas tabulas. Uz mītnes svr4 izpildām komandu netstat ar -r opciju, lai izvadītu maršrutēšanas tabulu un -n opciju, kas drukā IP adreses skaitliskā formātā nevis kā vārdus. (Mēs to darām, jo daži ieraksti maršrutēšanas tabulā ir tīkliem, nevis mītnēm. Bez -n opcijas, netstat komanda pārmeklē failu /etc/networks, lai atrastu tīklu vārdus. Pievienojot vēl jaunu vārdu kopumu (tīklu vārdus paralēli mītņu vārdiem) var nevajadzīgi sarežģīt diskusiju. 

svr4 % netstat -rn
Routing tables
Destination       Gateway            Flags    Refcnt  Use    Interface
140.252.13.65     140.252.13.35      UGH      0       0      emd0
127.0.0.1         127.0.0.1          UH       1       0      lo0
default           140.252.13.33      UG       0       0      emd0
140.252.13.32     140.252.13.34      U        4       25043  emd0

Pirmā rindiņa galamērķim 140.252.13.65 (mītnei slip) izmanto vārteju (maršrutētāju) 140.252.13.35 (bsdi). To varēja paredzēt, jo mītne slip ir piesaistīta bsdi ar SLIP saiti, un bsdi ir tanī pašā Ethernetā kā šī mītne. 

Konkrētam maršrutam maršrutēšanas tabulā var izvadīt piecus dažādus karodziņus: 

UMaršruts ir ieslēgts (route is up)
GMaršruts ir uz vārteju (maršrutētāju) (route is to gateway). Ja karodziņš nav uzstādīts, tad galamērķis ir tieši pievienots mūsu datoram.
HMaršruts ir uz mītni, t.i. galamērķis ir pilna mītnes adrese. Ja šis karodziņš nav uzstādīts, tad maršruts ir uz tīklu un galamērķis ir tīkla adrese: tīkla ID, vai kombinācija ar tīkla ID un apakštīkla ID.
DŠo maršrutu dinamiski izveidoja virzienmaiņas process (route dynamically installed by daemon or redirect) (09.05.nodaļa).
MMaršrutu izmainīja virzienmaiņas process (modified by routing daemon or redirect) (09.05.nodaļa).

Karodziņš "G" ir svarīgs, jo tas palīdz atšķirt starp netiešu ceļu un tiešu maršrutu. ("G" karodziņu neuzstāda tiešam maršrutam.) Atšķirība ir tā, ka paketei, kas iet ārā pa tiešo maršrutu, gan IP adrese, gan datu posma slāņa adrese norāda galamērķi (#picref("f_3_3.gif", "3.3.attēls")). Kad paketi izsūta pa netiešu maršrutu, tad IP adrese norāda galamērķi, bet datuposma slāņa adrese norāda vārteju (t.i. nākamā lēciena maršrutētāju). Mēs šādu piemēru redzējām #picref("f_3_4.gif", "3.4.attēlā"). Sajā maršrutēšanas tabulas piemērā mums ir netiešais ceļš (ir uzstādīts G karodziņš), tādēļ IP adrese paketei, kas izmanto šo maršrutu, norāda uz galamērķi (

Ir svarīgi saprast atšķirību starp G un H karodziņiem. Karodziņš "G" parāda atšķirību starp tiešu un netiešu ceļu, kā augstāk aprakstīts. Toties karodziņš "H" norāda, ka galamērķa adrese (pirmā kolonna "netstat" komandas izvadē) ir pilna mītnes adrese. Karodziņa "H" prombūtne nozīmē, ka galamērķa adrese ir tīkla adrese (mītnes ID'a daļa būs 0). Kad maršrutēšanas tabulā meklējam maršrutu uz galamērķa IP adresi, tad mītnes-tipa adreses ierakstam ir burtiski jāatbilst galamērķa adresei, toties tīkla-tipa adresei vienīgi ir jāatbilst tīkla ID'am un jebkādam ID'am no galamērķa adreses. Dažas "netstat" komandas implementācijas drukā visus mītņu-tipa ierakstus vispirms, un tiem seko tīkla-tipa ieraksti.

Atsauču skaita kolonna uzrāda katra maršruta aktīvo lietojumu skaitu. Savienojumu orientēts protokols, kā piemēram TCP, pieturas pie maršruta kamēr tiek veidots savienojums. Ja izveidotu Telnet'a savienojumu starp divām mītnēm -

Nākamā kolonna ("use") attēlo pakešu skaitu, kas ir izsūtīts pa šo maršrutu. Ja mēs esam vienīgie maršruta lietotāji un darbinām "ping" komandu, lai tā izsūtītu 5 paketes, tad skaits pieaugs līdz 5. Beigu kolonna "interface" ir attiecīgā lokālā interfeisa vārds.

Otrā izvades rindiņa ir priekš atcilpas interfeisa (02.07.nodaļa), ko vienmēr sauc

Trešā izvades rindiņa ir noklusētajam maršrutam. Katrai mītnei var būt viens vai vairāki noklusētie maršruti. Šis ieraksts nosaka pakešu sūtīšanu maršrutētājam

Te ar nodomu saucam <p/>
Izvades pēdējā rindiņa atbilst Ethernet pieslēgumam. Karodziņš H nav uzstādīts, norādot, ka galamērķa adrese (<p/>
Pēdējā ierakstā netieši tiek izmantota, bet netiek parādīta <p/>
Mītnes maršrutēšanas tabulas sarežģītība ir atkarīga no tīklu topoloģijas, uz kuriem mītnei ir piekļuve. 

  1. Vienkāršākais (bet neinteresantākais) gadījums ir mītne, kura nav pievienota nekādiem tīkliem. Šajā mītnē var lietot TCP/IP protokolus, bet tikai, lai sazinātos ar sevi! Maršrutēšanas tabula šajā gadījumā sastāv no viena ieraksta atcilpas saskarnei. 
  2. Nākošais gadījums - mītne ir pievienota LAN tīklam, un var sasniegt mītnes šajā LANā. Maršrutēšanas tabula sastāv no diviem ierakstiem: viens atcilpas saskarnei, un otrs LAN tīklam (piemēram, Ethernet'am). 
  3. Nākošais solis sarežģītības virzienā - ja citi tīkli (piemēram, Internets) ir sasniedzami caur konkrētu maršrutētāju. To parasti apstrādā ar noklusēto ierakstu, kurš norāda uz šo maršrutētāju. 
  4. Vissarežģītākais gadījums ir tad, kad pievieno citus specifiskus maršrutus - citām mītnēm vai citiem tīkliem. Mūsu piemērā maršruts uz mītni <p/>
    Pārskatīsim soļus, ko izpilda IP, kad izmanto maršrutēšanas tabulu, lai maršrutētu dažas testu paketes uz mītnes 
  5. Pieņemsim, ka galamērķa adrese ir mītne 1. Pieņemsim, ka galamērķa adrese ir mītne 1. Šoreiz sūtām datagrammu cauri internetam uz mītni 1. Pēdējā piemērā sūtām datagrammu uz mūsu pašu mītni. Ir četri veidi, kā to izdarīt - izmantot vai nu mītnes vārdu, mītnes IP adresi, atcilpas vārdu vai atcilpas IP adresi:
ftp svr4
ftp 140.252.13.34

ftp localhost
ftp 127.0.0.1

Pirmajos divos gadījumos, otrā maršrutēšanas tabulas meklēšana sniedz atbilstošo tīklu ar <p/>
Divos pēdējos gadījumos, norādot atcilpas saskarnes vārdu vai arī tās IP adresi, pirmā maršrutēšanas tabulas pārmeklēšana atgriež atbilstošu mītnes adreses ierakstu, un paketi nosūta atcilpas draiverim, kurš to nosūta IP ieejas rindai.
<p/>
Visos 4 gadījumos paketi nosūta atcilpas draiverim, bet, atkarībā no tā, kā norāda mītnes adresi, tiek izdarīti divu dažādu veidu maršrutēšanas lēmumi. 

Maršrutēšanas tabulas inicializācija

Neesam apsprieduši, kā tiek veidoti maršrutēšanas tabulu ieraksti. Ikreiz, kad tiek inicializēta kāda saskarne (parasti, kad saskarnes adresi uzstāda  <p/>
Maršruti uz mītnēm vai tīkliem, kuri nav tieši pievienoti, arī kaut kā ir jāizveido. Viens parasts veids ir izpildīt "route" komandu no inicializācijas failiem, kad sistēmu sāknē. Uz mītnes
route add default sun 1
route add slip bsdi 1

Trešie argumenti ("default" un "slip") ir galamērķi, ceturtais arguments norāda vārteju (maršrutētāju), un pēdējais arguments ir maršrutēšanas metrika. Viss, ko "route" komanda dara ar šo metriku - instalē maršrutu ar uzstādītu <p/>

Diemžēl sistēmu vidū nav vienotības par to, kurš sāknēšanas fails satur šādas 'route' komandas. Sistēmām 4.4BSD un BSD/386 tas ir <p/>
Dažas sistēmas ļauj norādīt noklusēto maršrutētāju failā, piemēram, <p/>
Citi veidi, kā inicializēt maršrutēšanas tabulu ir - darbināt maršrutēšanas dēmonu (10.nodaļa) vai izmantot jaunāku maršrutu atklāšanas protokolu (09.06.nodaļa).

Sarežģītāka maršrutēšanas tabula

Mītne 

sun % netstat -rn
Routing tables
Destination       Gateway            Flags    Refcnt Use       Interface
140.252.13.65     140.252.13.35      UGH      0      171       le0
127.0.0.1         127.0.0.1          UH       1      766       lo0
140.252.1.183     140.252.1.29       UH       0      0         sl0
default           140.252.1.183      UG       1      2955      sl0
140.252.13.32     140.252.13.33      U        8      99551     le0

 

Pirmie divi maršrutu ieraksti ir identiski pirmajiem diviem, kurus jau redzējām mītnei svr4: pirmais ir mītnei specifisks likums, lai tiktu cauri maršrutētājam bsdi, un otrais - atcilpas maršruts.

Trešā rindiņa ir jauna. Tas ir tiešs maršruts (karodziņš "G" nav uzstādīts) uz konkrētu mītni (ir uzstādīts H karodziņš), un tas atbilst mūsu divpunktu saitei, jeb SLIP saskarnei. Salīdzinām to ar ifconfig komandas izvadi:

sun % ifconfig sl0
Sl0: flags=105<UP,POINTOPOINT,RUNNING>
        inet 140.252.1.29 --> 140.252.1.183 netmask ffffff00

Redzam, ka galamērķa adrese maršrutēšanas tabulā ir otrs divpunktu saites gals (maršrutētājs netb) un vārtejas adrese patiesībā ir izejošās saskarnes vietējā IP adrese (140.252.1.29). (Kā jau agrāk teicām - vārtejas adrese, ko drukā netstat tiešam maršrutam ir lokālā IP adrese tai saskarnei, kuru šis maršruts izmanto.)

Noklusētais ieraksts ir netiešais maršruts (G karodziņš) uz tīklu (t.i. nav H karodziņa), kā jau bija sagaidāms. Vārtejas adrese ir maršrutētāja adrese (140.252.1.183 - otrs SLIP saites gals), nevis SLIP saites lokālā IP adrese (140.252.1.29). Atkal - tas ir tādēļ, ka šis ir netiešs maršruts, nevis tiešs. 

Jāatzīmē arī, ka trešā un ceturtā rindiņa, ko izvada "netstat" (tās ar saskarni "sl0") ir izveidojušās pateicoties SLIP programmatūrai. Tās izveidojas, kad SLIP sakaru līnija sāk darboties un tiek izdzēstas, kad SLIP saite pārtrūkst.

Nav maršruta uz galamērķi

Visi mūsu līdzšinējie piemēri pieņem, ka meklēšana maršrutēšanas tabulā atgriež atbilstošu rezultātu, pat ja atbilstošais rezultāts būtu noklusētais maršruts. Kas notiek, ja nav definēts noklusētais maršruts un netiek atrasts galamērķim atbilstošs maršruts? 

Atbild ir atkarīga no tā, vai maršrutējama IP datagramma bija ģenerēta uz paša mītnes datora vai arī tiek pārsūtīta (t.i. mēs darbojamies kā maršrutētājs). Ja datagramma ir ģenerēta uz pašas mītnes, lietotne, kura to ģenerēja, saņem kļūdu - vai nu "nesasniedzama mītne" (host unreachable) vai "nesasniedzams tīkls" (network unreachable). Ja datagrammu pārsūtīja, tad ICMP "nesasniedzamas mītnes kļūda" (host unreachable error) tiek nosūtīta atpakaļ sākotnējam sūtītājam. Šo kļūdu aplūkosim nākamajā nodaļā.