Digitális és informatikai

Részleges HTTP-letöltés: a bájttartomány két végpontja is beleszámít

A HTTP bájttartomány első és utolsó pozíciója is a kért részhez tartozik. Pontos példák mutatják meg a darabolást, a megszakadt letöltés folytatási pontját és a részleges válasz ellenőrzését.

Dajka Gábor4 perc olvasás
Dajka Gábor portréja sárga háttérrel
Dajka Gábor

Egy megszakadt letöltést onnan szeretnél folytatni, ahol abbamaradt. Ehhez a már megőrzött bájtok számát és a következő bájt pozícióját kell megadni. A két szám szorosan összefügg, de a nullától induló pozíciószámozás miatt könnyű eggyel elcsúszni.

Csatlakoztatott kábelek és jelzőfények hálózati kapcsolón
Illusztráció: Pixabay · Felhasználási feltételek

A HTTP részleges letöltésénél a bájttartomány két végpontja is beleszámít a kért részbe. A képlet rövid, a hibás határok viszont ismétlődő vagy hiányzó bájtot okozhatnak az összeállított fájlban.

Nullától induló helyek, mindkét végponttal

Az RFC 9110 HTTP-szabvány bájttartományokra vonatkozó része nullától induló eltolásokat és a két végpontot magában foglaló tartományt ír le. Az egyszerű, érvényes, teljesen létező tartomány hosszának képlete:

Bájtszám = utolsó pozíció − első pozíció + 1.

A 0–999 tartomány ezért 999 − 0 + 1 = 1000 bájt. Az 1000–1999 tartomány szintén ezer bájtot tartalmaz. A két rész együtt a 0–1999 pozíciókat fedi le, hézag és átfedés nélkül.

Ha egy fájl teljes mérete N bájt, utolsó pozíciója N − 1. Egy egymillió bájtos fájl érvényes pozíciói tehát 0-tól 999 999-ig terjednek. A fájl mérete és a legutolsó pozíció külön szám.

Egy fájl két egyenlő részben

Az 1 000 000 bájtos fájlt két 500 000 bájtos részre osztjuk. Az első tartomány 0–499 999. A második 500 000–999 999.

RészElső pozícióUtolsó pozícióBájtszám
Első0499 999500 000
Második500 000999 999500 000
Együtt0999 9991 000 000

Ha az első tartományt tévedésből 0–500 000-nek írod, az 500 001 bájtot jelent. A második rész 500 000-es kezdete ekkor egy bájttal átfed. Ha mindkét választ egyszerűen összefűzöd, a fájl mérete egy bájttal nagyobb lesz, és a tartalma is sérül.

Általános, fix méretű darabolásnál a rész utolsó pozíciója az első pozíció + kívánt darabméret − 1, legfeljebb a fájl N − 1 végpontjáig. Az utolsó darab rövidebb lehet.

Folytatás egy megszakadt átvitel után

Második példánkban a teljes fájl ugyanúgy egymillió bájtos, és pontosan 612 345 egymást követő bájtot őriztünk meg az elejéről. Ezek a 0–612 344 pozíciók. A következő szükséges bájt pozíciója 612 345.

A hátralévő rész 612 345–999 999, hossza 999 999 − 612 345 + 1 = 387 655 bájt. Ellenőrzésként 612 345 + 387 655 = 1 000 000. A folytatási kezdőpozíció tehát a már meglévő bájtok számával egyenlő, ha a helyi fájl hiánytalan prefixumot tartalmaz.

Ha a részleges fájlban hézag van, vagy az utolsó blokk csak részben íródott ki, a puszta fájlméret félrevezető lehet. A ténylegesen biztonságosan eltárolt prefixumot kell figyelembe venni. Az adatmennyiség-átváltó az egységek ellenőrzéséhez segíthet, de a tartományhatárokat egész bájtban érdemes vezetni.

A válasz valóban a kért rész legyen

A szerver figyelmen kívül hagyhatja a részleges kérést, és teljes választ is küldhet. A kliens ezért ellenőrizze a válasz státuszát és a visszaadott tartomány leírását. A 206-os részleges válasz és a Content-Range adat segít azonosítani, hogy melyik rész érkezett. Egy 200-as teljes választ nem szabad automatikusan a meglévő részfájl mögé fűzni.

A forrás közben megváltozhat. A régi első rész és az új második rész összefűzése hibás állományt adhat akkor is, ha a méret egyezik. A dokumentált változatazonosító és feltételes kérés, például megfelelő ETag és If-Range használata segíthet a változat következetes kezelésében.

A tartomány ugyanannak az adatábrázolásnak a bájtjaira vonatkozzon. Tömörített és kitömörített változat méretei eltérhetnek. A letöltési folyamat végén ezért a teljes méret és lehetőség szerint a hiteles forrásból ismert ellenőrző összeg is vizsgálandó.

A letöltési idő kalkulátor a hátralévő adatmennyiségből becsült idő ellenőrzéséhez adhat általános segítséget. A számítás mellett a kapcsolódás, az ellenőrzés és az esetleges újraküldés ideje is hozzáadódhat.

Tudáspróba

1. Hány bájt tartozik a 0–999 tartományhoz?

  • A: 999.
  • B: 1000.
  • C: 1001.

2. Mi a következő bájt pozíciója 612 345 megőrzött, elejétől hiánytalan bájt után?

  • A: 612 344.
  • B: 612 346.
  • C: 612 345.

3. Mi a helyes eljárás, ha a részleges kérésre a szerver teljes, 200-as választ ad?

  • A: Ellenőrizni és teljes válaszként kezelni; automatikusan nem fűzhető a részfájl mögé.
  • B: Ellenőrzés nélkül hozzáfűzni.
  • C: Az első bájtját mindig eldobni, majd hozzáfűzni.

Megoldások és következő lépés

1. B. Mindkét végpont beleszámít: 999 − 0 + 1 = 1000.

2. C. A meglévő utolsó pozíció 612 344, a következő 612 345.

3. A. A teljes válasz az elejétől tartalmazza a fájlt, így hozzáfűzése ismétlődést okozna.

0–1 pont: írd fel öt bájt pozícióját nullától négyig. 2 pont: számold újra az egymillió bájtos fájl két részének határait. 3 pont: saját letöltődben ellenőrizd a státuszt, a tartományt, a változatazonosítót és az összeállított fájl teljes méretét.

További cikkek

Kapcsolódó olvasnivalók

Gyorskereső

Kalkulátorok és útmutatók keresése

↑↓ választásEnter megnyitásEsc bezárás