predhovor
HTTP protokol je jedným z najdôležitejších protokolov na internete, hoci sa zdá jednoduchý, v praxi často naráža na problémy a my sme sa s ním stretli niekoľkokrát. Sú tam dlhé spojenia a parsovanie paketov. O HTTP protokole nemôžete nič vedieť, musíte mu dôkladne rozumieť. Preto som napísal túto sériu, aby som sa podelil o problémy a skúsenosti s HTTP protokolom.
HTTP protokol má hlavičku a telo pre požiadavky aj odpovede, pričom telo je zdroj, ktorý chcete získať, napríklad html stránka, jpeg obrázok a hlavička sa používa na vytvorenie určitých konvencií. Napríklad klient a server sa dohodnú na niektorých prenosových formátoch, klient najprv získa hlavičku, pozná nejaké informácie o formáte a potom začne čítať jadro prenosu.
Klient: Accept-Encoding:gzip (skomprimuj mi to, používam traffic, najprv si to stiahni a potom pomaly rozbaľ)
Server 1: Content-Encoding: null (No Content-Encoding header.) Nedávam kompresiu, CPU nie je voľný, chceš ho)
Server 2: Content-Encoding:gzip (ušetrí vám prevádzku, skomprimuje ju) Klient: Pripojenie: keep-alive (Veľký brat, konečne sme vytvorili TCP pripojenie, použijeme ho nabudúce)
Server 1: Pripojenie: udržiavaj nažive (nie je ľahké, pokračuj v používaní)
Server 2: Pripojenie: uzavreté (Kto ho s vami naďalej používa, náš TCP je jednorazový a nabudúce ho budeme musieť znovu pripojiť) HTTP protokol nemá tri handshake a keď klient požiada server o zdroje, serverová strana zvíťazí. Existujú aj niektoré hlavičky, ktoré nemajú proces vyjednávania, ale server priamo hovorí klientovi, čo má robiť. Napríklad vyššie uvedený obsah-dĺžka je to, čo server klientovi hovorí, aká je veľkosť tela. Ale! Server vám nemusí vedieť vopred presne povedať, aké veľké telo je. Server musí najprv napísať hlavičku a potom telo, ak chcete napísať hlavný prípad do hlavičky, musíte vopred poznať veľkosť tela. Ak je telo dynamicky generované, server dokončí a začne písať hlavičku, čo si vyžaduje veľa dodatočnej režijnej záťaže, takže v hlavičke nemusí byť dĺžka obsahu.
Ako teda klient pozná veľkosť tela? Server vám to povie tromi spôsobmi.
1. Server už pozná veľkosť zdroja a informuje vás cez hlavičku dĺžky obsahu.
Content-Length:1076(body的大小是1076B,你读取1076B就可以完成任务了)
Transfer-Encoding: null
2. Server nemôže vopred poznať veľkosť zdroja, alebo nie je ochotný vynaložiť zdroje na výpočet veľkosti zdroja vopred, preto pridá hlavičku k http odpovednej správe nazvanú Transfer-Encoding:chunked, čo znamená blokový prenos. Každý blok používa pevný formát, s veľkosťou bloku vpredu, dátami za ním a posledným blokom s veľkosťou 0. Týmto spôsobom, keď klient analyzuje, musí venovať pozornosť odstraňovaniu niektorých zbytočných polí.
Content-Length:null
Transfer-Encoding:chunked (接下来的body我要一块一块的传,每一块开始是这一块的大小,等我传到大小为0的块时,就没了)
3. Server nepozná veľkosť zdroja a nepodporuje režim prenosu v častiach, takže neexistuje ani hlavička dĺžky obsahu, ani hlavička kódovania prenosu. V tomto momente musí byť hlavička vrátená serverom blízko.
Content-Length:null
Transfer-Encoding:null
Connection:close(我不知道大小,我也用不了chunked,啥时候我关了tcp连接,就说明传输结束了)
|