|
|
Zverejnené 24. 9. 2019 18:07:57
|
|
|
|

1. Pozadie:
- Pretrvávajúce problémy s pripojením: Pri neperzistentných pripojeniach môže prehliadač definovať hranice žiadajúcej alebo odpovedajúcej entity podľa toho, či je spojenie nefunkčné alebo nie; Pri kontinuálnych spojeniach tento prístup samozrejme nefunguje. Niekedy, aj keď som poslal všetky dáta, prehliadač nevie, či neprídu nové dáta na otvorené pripojenie, takže jednoducho čaká.
- Rieš s obsahovou dĺžkou: Vypočítaj dĺžku entity a povedz druhej strane cez hlavu. Prehliadač môže zistiť, že entita odpovede je over podľa informácií o dĺžke obsahu
- Nový problém s dĺžkou obsahu: Keďže pole Obsah-Dĺžka musí skutočne odrážať dĺžku entity, dĺžka je pre dynamicky generovaný obsah neznáma, kým nie je obsah vytvorený. V tomto čase, aby ste presne zistili dĺžku, môžete otvoriť len dostatočne veľký buffer a počkať, kým sa vygeneruje všetok obsah, než začnete počítať. Na jednej strane to však vyžaduje väčšiu pamäťovú záťaž a na druhej strane to spôsobí, že klient bude musieť čakať dlhšie.
- Potrebujeme nový mechanizmus, ktorý nezávisí od dĺžky hlavičky a pozná hranice entít – Transfer-Encoding: chunked.
2. Prenosové kódovanie (rozdelené)
- Transfer-Encoding je pole HTTP hlavičky (pole hlavičky odpovede), čo doslova znamená "kódovanie prenosu". Najnovšia špecifikácia HTTP definuje len jeden typ kódovacieho transportu: chunked.
- Kódovanie prenosu v častiach je mechanizmus prenosu dát v protokole Hypertext Transfer Protocol (HTTP), ktorý umožňuje rozdeliť HTTP dáta posielané webovým serverom klientovi na viacero častí. Kódovanie blokového transportu je dostupné iba vo verzii HTTP protokolu 1.1 (HTTP/1.1).
- Dáta sa rozkladajú na sériu blokov a odosielajú sa v jednej alebo viacerých častiach, aby server mohol posielať dáta bez toho, aby vopred vedel o celkovej veľkosti odoslaného obsahu.
Špecifické metódy
- Po pridaní Transfer-Encoding: chunked do hlavičky znamená, že paket je chunkovaný. V tomto prípade je potrebné entity v pakete prenášať v sérii častí.
- Každý chunk obsahuje hexadecimálnu hodnotu dĺžky a údaje, pričom hodnota dĺžky je exkluzívna pre jeden riadok, pričom dĺžka nezahŕňa CRLF na jeho konci ani CRLF na konci rozdelených dát.
- Posledná hodnota dĺžky bloku musí byť 0 a zodpovedajúce dáta bloku neobsahujú, čo naznačuje koniec entity.
asp.net Základný testovací kód:
|
Predchádzajúci:Dĺžka obsahu protokolu HttpBudúci:Tri faktory, ktoré ma nútia Chrome odsudzovať
|