09.02. Maršrutēšanas principi

Pēdējais mainījis Administrator 2011-06-06 17:16

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 #term("maršrutēšanas mehānisms", "routing_mechanism"). Tas jāatšķir no #term("maršrutēšanas politikas", "routing_policy"), 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 #term("vārteju", "gateway") (#term("maršrutētāju", "router")) 140.252.13.35 (bsdi). To varēja paredzēt, jo mītne slip ir piesaistīta bsdi ar SLIP #term("saiti", "link"), un bsdi ir tanī pašā Ethernetā kā šī mītne.

Konkrētam #term("maršrutam", "route") 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 #term("datu posma slāņa", "link_layer") 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 (140.252.13.65), bet datuposma slāņa adresei ir jāatbilst maršrutētājam 140.252.13.35.

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. #term("Savienojumu orientēts protokols", "connection_oriented_protocol"), kā piemēram TCP, pieturas pie maršruta kamēr tiek veidots savienojums. Ja izveidotu Telnet'a savienojumu starp divām mītnēm - svr4 un slip, mēs redzētu atsauču skaita pieaugumu līdz 1. Izveidojot vēl vienu Telnet'a savienojumu, atsauču skaits palielinātos līdz 2, u.t.t.

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š #term("atcilpas", "loopback") interfeisa (02.07.nodaļa?), ko vienmēr sauc lo0. Karodziņš "G" nav uzstādīts, jo maršruts nav uz vārteju. Karodziņš "H" norāda, ka galamērķa adrese (127.0.0.1) ir mītnes adrese, nevis tīkla adrese. Ja nav uzstādīts karodziņš "G", kas apzīmē tiešu maršrutu, tad vārtejas kolonnā attēlo izejošās saskarnes IP adresi.

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 140.252.13.33 (sun), ja nevar atrast specifiskāku maršrutu. Tas nozīmē, ka mūsu mītne (svr4) var piekļūt citām sistēmām visā Internetā caur sun maršrutētāju (un tajā izmantoto SLIP saiti), izmantojot šo vienīgo tabulas ierakstu. Iespēja uzstādīt noklusēto maršrutu ir ārkārtīgi noderīga, lai maršrutēšanas tabulas varētu būt vienkāršas. Karodziņi pie šī maršruta (UG) norāda, ka tas ir maršruts uz vārteju, kā jau bija sagaidāms.

Te ar nodomu saucam sun par maršrutētāju nevis par mītni, jo tad, ja to izmanto kā noklusēto maršrutētāju, ir izmantota tā IP pārsūtīšanas funkcija, nevis mītnes funkcija.
Mītņu prasību RFC ir rakstīts, ka IP slānim jāatbalsta vairāki noklusētie maršruti. Vairums implementāciju tomēr to neatbalsta. Tad, ja pastāv vairāki noklusētie maršruti, izplatīta pieeja ir izmantot #term('apļkārtes', 'round_robin') algoritmu starp tiem. To, piemēram, dara Solaris 2.2.

Izvades pēdējā rindiņa atbilst Ethernet pieslēgumam. Karodziņš H nav uzstādīts, norādot, ka galamērķa adrese (140.252.13.32) ir tīkla adrese ar mītnes sadaļu vienādu ar 0. Tiešam, jaunākie 5 biti ir 0 (#picref("f_3_11.gif", "3.11.attēls"). Tā kā tas ir tiešs maršruts (G karodziņš nav uzstādīts), tad vārtejas kolonna norāda IP adresi izejošajai saskarnei.

Pēdējā ierakstā netieši tiek izmantota, bet netiek parādīta netstat izvadē, ir maska, kas saistīta ar šī galamērķa adresi (140.252.13.32). Ja šo galamērķi salīdzina ar IP adresi 140.252.13.33, tad tai vispirms pielieto loģisko konjunkciju (AND operāciju) ar galamērķa masku (saskarnes apakštīkla maska, 0xffffffe0, sk. 03.07.nodaļu?) pirms veikt salīdzināšanu. Tīkla maršrutam uz tieši pievienotu tīklu, maršrutēšanas tabulas maskas noklusētā vērtība ir interfeisa apakštīkla maska. Bet vispārīgā gadījumā, maršrutēšanas tabulas maska var pieņemt jebkuru 32 bitu vērtību. Vērtību, kura atšķiras no noklusētās, var uzstādīt kā opciju komandai route.

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 #term("atcilpas saskarnei", "loopback_interface"), 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 slop caur maršrutētāju bsdi ir šāds piemērs.
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 svr4.

  1. Pieņemsim, ka galamērķa adrese ir mītne sun, 140.252.13.33. Vispirms meklējam atbilstošu mītnes ierakstu. Divi mītņu ieraksti tabulā (slip un localhost) neatbilst, tādēļ maršrutēšanas tabulu meklē otrreiz - lai atrastu vismaz atbilstošu tīkla ierakstu. Tiek atrasta atbilstība ar ierakstu 140.252.13.32 (tīkla IDi un apakštīklu IDi atbilst), tādēļ tiek lietota emd0 saskarne. Šis ir tiešais maršruts, tādēļ #term("datu posma slāņa", "link_layer") adrese būs arī galamērķa adrese.
  2. Pieņemsim, ka galamērķa adrese ir mītne slip, 140.252.13.65. Pirmoreiz - meklējot maršrutēšanas tabulā atbilstošu mītnes adresi, tiek atrasta atbilstība. Tas ir netiešais maršruts, tādēļ galamērķa IP adrese paliek 140.252.13.65, bet datuposma slāņa (MAC) adresei ir jābūt vārtejas 140.252.13.35, un izmantotā saskarne joprojām ir emd0.
  3. Šoreiz sūtām datagrammu cauri internetam uz mītni aw.com (192.207.117.2). Pirmā meklēšana neizdodas - t.i. maršrutēšanas tabulā nav atrodama atbilstoša mītnes adrese, gluži tāpat kā otrā meklēšana atbilstošai tīkla adresei. Beidzamais solis ir noklusētā ieraksta meklēšana, un tas ir sekmīgs. Maršruts ir netiešais maršruts caur vārteju 140.252.13.33, izmantojot saskarni emd0.
  4. 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 140.252.13.32, un paketi sūta Ethernet'a draiverim. Kā parādījām #picref("f_2_4.gif", "2.4.attēlā"), šī pakete ir domāta pašas mītnes IP adresei, un paketi nosūta #term("atcilpas", "loopback") draiverim, kas to nosūta IP ievades rindā.

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.

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 ifconfig komanda), tiek automātiski izveidots tiešs ceļš šai saskarnei. #term("Divpunktu", "point_to_point") saitēm un #term("atcilpas", "loopback") saskarnei izveidojas maršruts uz mītni (t.i. uzstādīts H karodziņš). Apraides saskarnēm, piemēram, Ethernet'am, maršruts ir uz attiecīgo tīklu.

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 #term("sāknē", "bootstrap"). Uz mītnes svr4 sekojošās divas komandas tika izpildītas, lai pievienotu ierakstus, kurus jau esam apsprieduši:

route add default sun 1
route add slip bsdi 1

Trešie argumenti ("default" un "slip") ir galamērķi, ceturtais arguments norāda #term("vārteju", "gateway") (#term("maršrutētāju", "router")), 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 G karodziņu, ja metrika ir lielāka nekā 0, vai arī bez G karodziņa, ja metrika ir 0.

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 /etc/netstart, sistēmai SVR4 tas ir /etc/inet/rc.inet, priekš Solaris 2.x tas ir /etc/rc2.d/S69inet, SunOS 4.1.x izmanto /etc/rc.local, un AIX 3.2.2 izmanto /etc/rc.net.

Dažas sistēmas ļauj norādīt noklusēto maršrutētāju failā, piemēram, /etc/defaultrouter, un šī noklusētā vērtība tiek pievienota maršrutēšanas tabulai pie katras pārsāknēšanas.

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 ir noklusētais maršrutētājs visām mītnēm mūsu #term("apakštīklā", "subnet"), jo tai ir iezvanpieejas SLIP #term("saite", "link"), kas to pievieno Internetam (sk. attēlu uz #picref("f_COVER_1.gif", "iekšējā vāka")).

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 #term("divpunktu", "point_to_point") 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 #term("galamērķa adrese", "destination_address") maršrutēšanas tabulā ir otrs #term("divpunktu", "point_to_point") 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. #term("Vārtejas", "gateway") 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 #term("galamērķim", "destination") 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ļā.

Tagi:
Izveidojis Kalvis Apsītis 2008-06-25 11:27
    
This wiki is licensed under a Creative Commons 2.0 license
XWiki Enterprise 6.4 - Documentation