24.05. Laikspiedoga opcija

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

24.05. Laikspiedoga opcija

Laikspiedoga opcija ļauj sūtītājam ievietot laikspiedoga vērtību ikvienā segmentā. Saņēmējs atspoguļo šo vērtību #term("apstiprinājumā", "acknowledgement"), ļaujot sūtītājam aprēķināt #term("aprites laiku", "round_trip_time") (RTT) katram saņemtam apstiprinājumam. (Mēs šeit sakām "katram saņemtam apstiprinājumam (ACK'am)", nevis "katram segmentam", jo TCP parasti apstiprina vairākus segmentus ar vienu ACK'u.) Daudzas esošās implementācijas mēra vienīgi RTT uz visu logu, kas ir pietiekami logiem, kuri satur astoņus segmentus. Lielāki logu izmēri tomēr prasa labākus RTT aprēķinus.

RFC 1323 3.1.nodaļa izklāsta signālu apstrādes iemeslus, lai prasītu labākus RTT novērtējumus lielākiem logiem. Galvenokārt RTT tiek mērīts, #term("iztverot", "sample") datu signālu (datu segmentus) zemākā frekvencē (vienreiz uz visu logu). Tas ievieš atsauces nevis uz īsto RTT, bet uz RTT novērtējumu. Tad, ja logā ir tikai astoņi segmenti, iztvēruma biežums ir viena astotā daļa no datu biežuma, kas ir izturami. Savukārt, ja ir 100 segmenti uz vienu logu, tad iztvēruma biežums ir 1/100 no datu biežuma. Tas var izraisīt RTT novērtējumu neprecizitātes, kas noved pie nevajadzīgas #term("atkalsūtīšanas", "retransmission"). Ja segments pazūd, kļūst vēl sliktāk.

#picref("f_18_20.gif", "18.20.attēls") parādīja laikspiedoga opcijas formātu. Sūtītājs novieto 32 bitu vērtību pirmajā laukā, un saņēmējs atbalso to savā atbildes laukā. TCP sākumposmi, kuri satur šo opciju pieaugs no parastajiem 20 baitiem līdz 32 baitiem.

Laikspiedogs ir monotoni pieaugoša vērtība. Tā kā saņēmējs atbalso to, ko tas ir saņēmis, saņēmējam ir vienalga, kādas ir laikspiedoga mērvienības. Šī opcija neprasa nekāda veida pulksteņu sinhronizāciju starp abām mītnēm. RFC 1323 ieteic, laikspiedoga vērtību palielināt par 1 ik pēc 1ms vai ik pēc 1s (vai arī izvēlēties kādu citu mērvienību, kas ir starp milisekundi un sekundi).

4.4BSD palielina laikspiedoga skaitītāju ik pēc 500 milisekundēm un šo laikspiedoga pulksteni #term("nomet", "reset") uz 0 pēc atsāknēšanas.

#picref("f_24_7.gif", "24.7.attēlā"), ja aplūkojam laikspiedogu 1.segmentā un laikspiedogu 11.segmentā, starpība (89 vienības), pieņemot 500 ms uz vienību, atbilst laika atstarpei 44.5 sekundes.

Šīs opcijas norādīšana savienojuma veidošanas brīdī tiek apstrādāta tāpat kā loga mērogošanas opcija iepriekšējā nodaļā. Savienojuma gals, kurš veic #term("aktīvo atvēršanu", "active_open") norāda opciju savā SYN. Tikai tad, ja tas saņem šo opciju SYN segmentā, kas sūtīts no otra gala, šo opciju var sūtīt arī turpmākos segmentos.

Esam redzējuši, ka saņemošajam TCP nav jāapstiprina katrs datu segments, kuru tas saņem. Daudzas implementācijas sūta ACK'u uz katru otro datu segmentu. Ja saņēmējs sūta ACK'u, kas apstiprina uzreiz divus saņemtus datu segmentus, kuru no abiem saņemtajiem laikspiedogiem būtu jāsūta atpakaļ atbildē, norādot laikspiedoga atbalsi?

Lai samazinātu uzturamo stāvokli abos galos, katram savienojumam tiek uzturēta tikai viena laikspiedoga vērtība. Algoritms, ar kuru izvēlas, kad #term("pārlabot", "update") šo vērtību ir vienkāršs:

  1. TCP fiksē laikspiedoga vērtību, kuru sūtīt nākamajā ACK'ā (mainīgais, ko sauc tsrecent) un apstiprinājuma virknes numuru no pēdējā ACKa, kas tika nosūtīts (mainīgais, ko sauc lastack). Šis virknes numurs ir nākamais virknes numurs, kuru sagaida saņēmējs.
  2. Kad ierodas kārtējais segments, ja šis segments satur baitu, kura numurs ir lastack, tad laikspiedoga vērtību no segmenta noglabā tsrecent.
  3. Allaž, nosūtot laikspiedoga opciju, tsrecent tiek izmantots kā laikspiedoga atbalss vērtība, un virknes numura lauks tiek noglabāts mainīgajā lastack.
Algoritms apstrādā sekojošus divus gadījumus:

  1. Ja saņēmējs aizkavēja ACK'us, atbalss laikspiedoga vērtība atbildīs agrākajam no apstiprināmajiem segmentiem.
    Piemēram, ja ierodas divi segmenti, kuri satur attiecīgi baitus 1-1024 un 1025-2048 kuriem abiem ir laikspiedoga opcija un saņēmējs apstiprina tos abus ar ACK 2049, tad laikspiedogs šajā ACK'ā būs vērtība no pirmā segmenta, kurš saturēja baitus 1-1024. Tas ir pareizi, jo sūtītājam ir jāaprēķina #term("atkalsūtīšanas", "retransmission") #term("noildze", "timeout"), ņemot vērā aizkavētos ACK'us.
  2. Ja saņemtais segments ir loga iekšienē bet ārpus virknes numuru secības (netieši norādot, ka iepriekšējais segments ir pazudis), tad gadījumā, ja šis pazudušais segments tiek saņemts, tiks atbalsots tieši pazudušā segmenta laikspiedogs, nevis laikspiedogs segmentam, kurš pienāca ārpus numuru secības.
    Piemēram, pieņemsim, ka trīs segmenti, katrs pa 1024 baitiem, tiek saņemti sekojošā kārtībā: 1.segments ar baitiem 1-1024, 3.segments ar baitiem 2049-3072, un visbeidzot 2.segments ar baitiem 1025-2048. ACK'i, ko sūta atpakaļ būs ACK 1025 ar laikspiedogu no 1.segmenta (normāls ACK's gaidītajiem datiem), vēl viens ACK 1025 ar laikspiedogu no 1.segmenta (ACK'a dublikāts atbildot uz loga iekšienē bet ārpus virknes numuriem saņemtu segmentu), visbeidzot 3073 ar laikspiedogu no 2.segmenta (nevis no pēdējā - 3.segmenta). Tas izraisa RTT #term("paaugstinātu novērtējumu", "overestimate"), kad segmenti pazūd, kas ir labāk nekā #term("pazemināts novērtējums", "underestimate"). Turklāt, ja pēdējais ACK's saturētu laikspiedogu no 3.segmenta, tas varētu ietvert laiku, kas vajadzīgs atkārtota ACK'a atgriešanai un 2.segmenta atkalsūtīšanai, vai arī tas var iekļaut laiku sūtītāja atkalsūtīšanas noildzei, kas nozīmē 2.segmenta #term("izbeigšanos", "expire"). Abos gadījumos 3.segmenta laikspiedoga atbalsošana varētu radīt tendenciozitāti sūtītāja RTT aprēķinos.

Lai gan laikspiedoga opcija ļauj veikt labākus #term("aprites laika", "round_trip_time") (RTT) aprēķinus, tas arī dod iespēju saņēmējam izvairīties no veciem segmentiem un sākt nepareizi uzskatīt tos par daļu no eksistējošiem datu segmentiem. Nākošā nodaļa to apraksta.

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