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

Show last authors
1 = 24.04. Loga mērogošanas opcija =
2
3 Loga mērogošanas //opcija// jeb izvēle palielina TCP loga definīciju no 16 līdz 32 bitiem. Tai vietā, lai mainītu TCP sākumposmu, lai varētu tajā ievietot lielāku logu, sākumposms joprojām glabā 16 bitu vērtību un ir definēta opcija, kura pielieto mērogošanas operāciju 16 bitu vērtībai. TCP tad iekšēji uztur "īsto" loga izmēru kā 32 bitu vērtību.
4
5 {{velocity filter="none"}}
6 {{html clean="false" wiki="true"}}
7 Šīs iespējas piemēru redzējām #picref("f_18_20.gif", "18.20.attēlā"). 1-baita nobīdes skaitītājs ir starp 0 (nav mērogošanas) līdz 14. Šī maksimālā vērtība (14) atbilst logam, kurš ir 1,073,725,440 baiti (65535 x 214).
8 <p/>
9 Šī loga mērogošanas opcija var parādīties tikai SYN segmentā; tātad mēroga reizinātājs ir fiksēts katrā virzienā, kad izveidojas savienojums. Lai iespējotu logu mērogošanu, abiem galiem ir jānosūta šī opcija savos SYN segmentos. Tas komunikācijas gals, kurš veic //aktīvo atvēršanu//, sūta opciju savā SYN, bet gals, kurš veic //pasīvo atvēršanu// var sūtīt opciju tikai, ja saņemtais SYN norāda šo opciju. Mēroga reizinātājs var būt katrā no virzieniem atšķirīgs.
10 <p/>
11 Ja savienojuma gals, kurš veic aktīvo atvēršanu, sūta nenulles mēroga faktoru, bet nesaņem loga mēroga opciju no otra gala, tas uzstāda tā sūtīšanas un saņemšanas nobīdes skaitītāju uz 0. Tas ļauj jaunākām sistēmām sadarboties ar vecākām sistēmām, kuras nesaprot šo jauno opciju.
12 <p/>
13 Mītņu Prasību RFC prasa, lai TCP akceptētu opciju jebkurā segmentā. (Vienīgā agrāk definētā opcija, maksimālais segmenta izmērs parādījās vienīgi SYN segmentos.) RFC prasa TCP ignorēt jebkuru opciju, ko tas nesaprot. Tas ir viegli panākams, jo visām jaunajām opcijām ir garuma (length) lauks (#picref("f_18_20.gif", "18.20.attēls")).
14 <p/>
15 Pieņemsim, ka izmantojam loga mēroga opciju ar nobīdes skaitītāju S sūtīšanai un nobīdes skaitītāju R saņemšanai. Tad katrs 16 bitu //reklamētais logs//, ko saņemam no otra gala tiek nobīdīts pa kreisi R bitus, lai iegūtu patieso reklamētā loga izmēru. Ikreiz, kad sūtām loga reklāmu uz otru galu, ņemam mūsu patieso 32 bitu loga izmēru un nobīdām to pa labi par S bitiem, novietojot iegūtu 16 bitu vērtību TCP sākumposmā.
16 <p/>
17 Nobīdes skaitītāju automātiski izvēlas TCP, balstoties uz saņemšanas bufera izmēru. Šī bufera izmēru uzstāda sistēma, bet lietotnei parasti ir dota spēja to izmainīt (mēs šo buferi apspriedām [[20.04.nodaļā>>20_04]].
18
19 == Piemērs ==
20
21 Ja mēs uzsākam savienojumu, izmantojot mūsu ##sock## programmu no 4.4BSD mītnes ##vangogh.cs.berkeley.edu##, varam redzēt, ka tās TCP implementācija rēķina loga mēroga reizinātāju. Šajā interaktīvajā izvadē var redzēt divas secīgas programmas izpildes - viena norāda saņemšanas buferi 128000 baiti, un pēc tam saņemšanas buferi ar 220000 baitiem:
22
23 {{code language="none"}}
24 vangogh % sock -v -R128000 bsdi.tuc.noao.edu echo
25 SO_RCVBUF = 128000
26 connected on 128.32.130.2.4107 to 140.252.13.35.7
27 TCP_MAXSEG = 512
28 hello, world šo rakstām paši
29 hello, world atbalsota rindiņa
30 ^D drukājam faila beigu simbolu, lai beigtu
31
32 vangogh % sock -v -R220000 bsdi.tuc.noao.edu echo
33 SO_RCVBUF = 220000
34 connected on 128.32.130.2.4108 to 140.252.13.35.7
35 TCP_MAXSEG = 512
36 bye, bye šo rakstām paši
37 bye, bye atbalsota rindiņa
38 ^D drukājam faila beigu simbolu, lai beigtu
39 {{/code}}
40
41 24.7.attēls rāda ##tcpdump## izvadi šiem diviem savienojumiem. (Esam izmetuši 2.savienojuma pēdējās 8 rindiņas, jo nekas jauns tur neparādās.)
42 <p/>
43 #pic("f_24_7", "500")
44 //24.7.attēls: Loga mēroga opcijas piemērs//
45 {{/html}}
46 {{/velocity}}
47
48 ~1. rindiņā ##vangogh## reklamē logu ar izmēru 65535 un norāda loga mēroga opciju ar nobīdes skaitītāju 1. Šis reklamētais logs ir lielākā iespējamā vērtība, kura ir mazāka nekā saņemšanas bufera izmērs (128000), jo loga lauks SYN segmentā netiek mērogots.
49
50 Mēroga reizinātājs 1 nozīmē, ka ##vangogh## gribētu sūtīt loga reklāmas līdz pat 131070 (65535 x 21). Ar to pietiktu mūsu saņemšanas bufera izmēram (128000). Tā kā ##bsdi## nenosūta loga mēroga opciju savā SYN (2.rindiņa), opcija netiek izmantota. Ievērojiet, ka ##vangogh## turpina izmantot lielāko iespējamo logu (65535) uz atlikušo konekcijas laiku.
51
52 Otrai konekcijai ##vangogh## pieprasa nobīdes skaitītāju 2, kas nozīmē, ka tas gribētu sūtīt logu reklāmas līdz 262140 (65535 x 22), kas ir lielāks nekā saņemšanas bufera izmērs (220000).