24.04. Loga mērogošanas opcija

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

24.04. Loga mērogošanas opcija

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. 

Šī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).

Šī 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.

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.

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")).

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ā.

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ļā.

Piemērs

Ja mēs uzsākam savienojumu, izmantojot mūsu vangogh % sock -v -R128000 bsdi.tuc.noao.edu echo
SO_RCVBUF = 128000
connected on 128.32.130.2.4107 to 140.252.13.35.7
TCP_MAXSEG = 512
hello, world                šo rakstām paši
hello, world                atbalsota rindiņa
^D                          drukājam faila beigu simbolu, lai beigtu

vangogh % sock -v -R220000 bsdi.tuc.noao.edu echo
SO_RCVBUF = 220000
connected on 128.32.130.2.4108 to 140.252.13.35.7
TCP_MAXSEG = 512
bye, bye                    šo rakstām paši
bye, bye                    atbalsota rindiņa
^D                          drukājam faila beigu simbolu, lai beigtu
24.7.attēls rāda

#pic("f_24_7", "500") 24.7.attēls: Loga mēroga opcijas piemērs

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. 

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.

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).