Uneori, contorul de progres fidel al descărcării pe browserul dvs. (sau altă aplicație) aruncă mâinile în aer și renunță la afișarea timpului de descărcare rămas. De ce unește timpul de descărcare proiectat și uneori nu reușește să raporteze totul împreună?
Sesiunea de Întrebări și Răspunsuri de astăzi ne vine prin amabilitatea SuperUser - o subdiviziune a Stack Exchange, un grup de site-uri web de întrebări și răspunsuri bazat pe comunitate.
Intrebarea
Cititorul SuperUser Coldblackice vrea să știe de ce browserul său nu elimină întotdeauna murdăria:
Ocazional, când descărcați un fișier într-un browser web, progresul descărcării nu „cunoaște” dimensiunea totală a fișierului sau cât de departe este descărcarea - arată doar viteza cu care descarcă, cu un total ca „Necunoscut”.
De ce nu ar cunoaște browserul dimensiunea finală a unor fișiere? De unde primește aceste informații în primul rând?
Unde într-adevăr?
Raspunsurile
Contribuitorul SuperUser Gronostaj oferă următoarele informații:
Pentru a solicita documente de la servere web, browserele folosesc protocolul HTTP. Este posibil să știți acel nume din bara de adrese (poate fi ascuns acum, dar când faceți clic pe bara de adrese, copiați adresa URL și inserați-l într-un editor de text, veți vedea
http: //la inceput). Este un protocol simplu bazat pe text și funcționează astfel:Mai întâi, browserul dvs. se conectează la serverul site-ului web și trimite o adresă URL a documentului pe care dorește să îl descarce (și paginile web sunt documente) și câteva detalii despre browserul însuși ( Agent utilizator etc). De exemplu, pentru a încărca pagina principală pe site-ul SuperUser,
http://superuser.com/, browserul meu trimite o cerere care arată astfel:GET / HTTP / 1.1 Gazdă: superuser.com Conexiune: păstrați-vii Acceptați: text / html, aplicație / xhtml + xml, aplicație / xml; q = 0,9, * / *; q = 0,8 User-Agent: Mozilla / 5.0 (Windows NT 6.1; WOW64) Acceptare-codificare: gzip, deflate, sdch Accept-Language: pl-PL, pl; q = 0.8, en-US; q = 0.6, en; q = 0.4 Cookie: [removed for security] DNT: 1 Dacă-s-a modificat-din: marți, 09 iul 2013 07:14:17 GMTPrima linie specifică ce document ar trebui să returneze serverul. Celelalte linii se numesc anteturi; arată așa:
Numele antetului: valoarea antetuluiAceste linii trimit informații suplimentare care ajută serverul să decidă ce să facă.
Dacă totul este bine, serverul va răspunde prin trimiterea documentului solicitat. Răspunsul începe cu un mesaj de stare, urmat de unele anteturi (cu detalii despre document) și, în cele din urmă, dacă totul este bine, conținutul documentului. Iată cum arată răspunsul serverului SuperUser pentru solicitarea mea:
HTTP / 1.1 200 OK Control cache: public, vârstă maximă = 60 Tip conținut: text / html; charset = utf-8 Expiră: marți, 09 iulie 2013 07:27:20 GMT Ultima modificare: marți, 09 iulie 2013 07:26:20 GMT Variați: * X-Frame-Options: SAMEORIGIN Data: marți, 09 iulie 2013 07:26:19 GMT Lungime conținut: 139672 <! DOCTYPE html> <html> [...snip...] </html>După ultima linie, serverul SuperUser închide conexiunea.
Prima linie (
HTTP / 1.1 200 OK) conține codul de răspuns , în acest caz este200 OK. Înseamnă că serverul va returna un document, după cum sa solicitat. Când serverul nu reușește să facă acest lucru, codul va fi altceva: probabil ați văzut404 Nu a fost gasit, și403 Interziseste destul de obișnuit, de asemenea. Apoi urmează anteturile.Când browserul găsește o linie goală în răspuns, știe că tot ce a trecut de acea linie este conținutul documentului solicitat. Deci, în acest caz
<! DOCTYPE html>este prima linie a codului paginii de pornire a SuperUser. Dacă aș solicita descărcarea unui document, ar fi vorba, probabil, de niște caractere tâmpite, deoarece majoritatea formatelor de documente nu pot fi citite fără prelucrare prealabilă.Înapoi la anteturi. Cel mai interesant pentru noi este ultimul,
Lungimea conținutului. Acesta informează browserul la câte octeți de date ar trebui să se aștepte după linia goală, deci practic este dimensiunea documentului exprimată în octeți. Acest antet nu este obligatoriu și poate fi omis de server. Uneori, dimensiunea documentului nu poate fi prevăzută (de exemplu, atunci când documentul este generat din mers), uneori programatorii leneși nu îl includ (destul de obișnuit pe site-urile de descărcare a driverelor), uneori site-urile web sunt create de începători care nu știu a unui astfel de antet.Oricum, oricare ar fi motivul, antetul poate lipsi. În acest caz, browserul nu știe cât de multe date va trimite serverul și astfel afișează dimensiunea documentului necunoscut , așteptând ca serverul să închidă conexiunea. Și acesta este motivul pentru dimensiuni necunoscute ale documentelor.