Pieņemsim, ka HTTP atbilde pēc iziešanas caur Squid parādās vairākos ierakstītos TCP segmentos. Tā var būt parasta TCP uzvedība, nevis pierādījums, ka atbilde sadalīta nepareizi.

Uz priekšu vērstam starpniekserverim parasti ir divi savienojumi:

client ⇄ TCP connection A ⇄ proxy ⇄ TCP connection B ⇄ origin

Katram savienojumam ir savs TCP stāvoklis, secības numuri un pakešu veidošana. Starpniekserveris var lasīt datus no viena savienojuma un rakstīt tos otrā, nesaglabājot sākotnējos segmenta izmērus. Buferēšana, sūtīšanas laiks, sastrēgumi un ceļa izmēra ierobežojumi var radīt citu grupējumu.

Trīs robežas, ko vērts turēt atsevišķi

RobežaKas to nosaka
TCP segmentsTransporta un tīkla ceļš
Ligzdas lasījuma rezultātsPieejamie straumes baiti un izsaucēja buferis
HTTP ziņojums vai kadrsHTTP protokola iekadrēšanas noteikumi

Viens lasījums var saturēt daļu galvenes, visu galveni kopā ar ķermeņa baitiem vai datus, kas šķērso vairāk nekā vienu lietojumprogrammas līmeņa robežu. TCP nesaista “HTTP atbildes beigas” ar veiksmīga lasījuma beigām.

Tāpēc HTTP/1.1 parsētājs uzkrāj galvenes un piemēro attiecīgos ķermeņa iekadrēšanas noteikumus, tostarp garumu, pārsūtīšanas kodējumu vai atļauto savienojuma aizvēršanu. HTTP/2 kadrs ir protokola struktūra, kas pati var šķērsot TCP segmentus; tas nav cits tīkla paketes nosaukums.

Veiksmīgs CONNECT tunelis saglabā tunelēto baitu plūsmu, taču joprojām izmanto divus TCP posmus. Tā segmentu robežas var atšķirties arī tad, ja starpniekserveris nav mainījis baitus tuneļa iekšpusē.

Izmeklējot bojājumus, salīdziniet no jauna samontētos lietojumprogrammas datus. Pakešu skaita salīdzināšana vai vienādu pakešu garumu gaidīšana abās pusēs pieprasa no TCP robežu garantiju, ko tas nesniedz.

Saistītie raksti