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

Show last authors
1 = 09.02. Maršrutēšanas principi =
2
3 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.
4
5 [[03.03.nodaļā>>03_03]] mēs pārskaitījām soļus, ko IP veic, meklējot maršrutēšanas tabulā:
6
7 1. Meklē atbilstošu mītnes adresi
8 1. Meklē atbilstošu tīkla adresi
9 1. 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.)
10
11 Atbilstoša mītnes adrese vienmēr tiek lietota ar augstāku prioritāti nekā atbilstoša tīkla adrese.
12
13 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.
14
15 == Vienkārša maršrutēšanas tabula. ==
16
17 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.
18
19 {{code language="none"}}
20 svr4 % netstat -rn
21 Routing tables
22 Destination Gateway Flags Refcnt Use Interface
23 140.252.13.65 140.252.13.35 UGH 0 0 emd0
24 127.0.0.1 127.0.0.1 UH 1 0 lo0
25 default 140.252.13.33 UG 0 0 emd0
26 140.252.13.32 140.252.13.34 U 4 25043 emd0
27 {{/code}}
28
29 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.
30
31 Konkrētam //maršrutam// maršrutēšanas tabulā var izvadīt piecus dažādus karodziņus:
32
33 {{velocity filter="none"}}
34 {{html clean="false" wiki="true"}}
35 <table>
36 <tr>
37 <td>U</td><td>Maršruts ir ieslēgts (//route is **up**//)</td>
38 </tr>
39 <tr>
40 <td>G</td><td>Marš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.</td>
41 </tr>
42 <tr>
43 <td>H</td><td>Marš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.</td>
44 </tr>
45 <tr>
46 <td>D</td><td>Šo maršrutu dinamiski izveidoja virzienmaiņas process (//route **dynamically** installed by daemon or redirect//) ([[09.05.nodaļa>>09_05]]).</td>
47 </tr>
48 <tr>
49 <td>M</td><td>Maršrutu izmainīja virzienmaiņas process (//**modified** by routing daemon or redirect//) ([[09.05.nodaļa>>09_05]]).</td>
50 </tr>
51 </table>
52 <p/>
53 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 (##140.252.13.65##), bet datuposma slāņa adresei ir jāatbilst maršrutētājam ##140.252.13.35##.
54 <p/>
55 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.
56 <p/>
57 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 - ##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.
58 <p/>
59 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.
60 <p/>
61 Otrā izvades rindiņa ir priekš //atcilpas// interfeisa ([[02.07.nodaļa>>02_07]]), 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.
62 <p/>
63 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.
64 <p/>
65 {{info}}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 //apļkārtes// algoritmu starp tiem. To, piemēram, dara Solaris 2.2.{{/info}}
66 <p/>
67 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.
68 <p/>
69 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>>3.7]]) 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##.
70 <p/>
71 Mītnes maršrutēšanas tabulas sarežģītība ir atkarīga no tīklu topoloģijas, uz kuriem mītnei ir piekļuve.
72
73 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.
74 1. 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).
75 1. 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.
76 1. 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.
77 <p/>
78 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##.
79
80 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ēļ //datu posma slāņa// adrese būs arī galamērķa adrese.
81 1. 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##.
82 1. Š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##.
83 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:
84
85 {{code language="none"}}
86 ftp svr4
87 ftp 140.252.13.34
88
89 ftp localhost
90 ftp 127.0.0.1
91 {{/code}}
92
93 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 //atcilpas// draiverim, kas to nosūta IP ievades rindā.
94 <p/>
95 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.
96 <p/>
97 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.
98
99 == Maršrutēšanas tabulas inicializācija ==
100
101 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. //Divpunktu// saitēm un //atcilpas// 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.
102 <p/>
103 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 ##svr4## sekojošās divas komandas tika izpildītas, lai pievienotu ierakstus, kurus jau esam apsprieduši:
104
105 {{code language="none"}}
106 route add default sun 1
107 route add slip bsdi 1
108 {{/code}}
109
110 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 ##G## karodziņu, ja metrika ir lielāka nekā 0, vai arī bez ##G## karodziņa, ja metrika ir 0.
111 <p/>
112 {{info}}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##.{{/info}}
113 <p/>
114 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.
115 <p/>
116 Citi veidi, kā inicializēt maršrutēšanas tabulu ir - darbināt maršrutēšanas dēmonu ([[10.nodaļa>>10]]) vai izmantot jaunāku maršrutu atklāšanas protokolu ([[09.06.nodaļa>>09_06]]).
117
118 == Sarežģītāka maršrutēšanas tabula ==
119
120 Mītne ##sun## ir noklusētais maršrutētājs visām mītnēm mūsu //apakštīklā//, jo tai ir iezvanpieejas SLIP //saite//, kas to pievieno Internetam (sk. attēlu uz #picref("f_COVER_1.gif", "iekšējā vāka")).
121 {{/html}}
122 {{/velocity}}
123
124 {{code language="none"}}
125 sun % netstat -rn
126 Routing tables
127 Destination Gateway Flags Refcnt Use Interface
128 140.252.13.65 140.252.13.35 UGH 0 171 le0
129 127.0.0.1 127.0.0.1 UH 1 766 lo0
130 140.252.1.183 140.252.1.29 UH 0 0 sl0
131 default 140.252.1.183 UG 1 2955 sl0
132 140.252.13.32 140.252.13.33 U 8 99551 le0
133 {{/code}}
134
135
136
137 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.
138
139 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:
140
141 {{code language="none"}}
142 sun % ifconfig sl0
143 Sl0: flags=105<UP,POINTOPOINT,RUNNING>
144 inet 140.252.1.29 --> 140.252.1.183 netmask ffffff00
145 {{/code}}
146
147 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.)
148
149 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.
150
151 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.
152
153 == Nav maršruta uz galamērķi ==
154
155 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?
156
157 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ļā.