14Sep
Uneori, contorul de progres descărcări credincios din browser( sau altă aplicație) aruncă mâinile în aer și renunță la afișarea timpului de descărcare rămas. De ce, uneori, unghiile proiectate de descărcare de timp și, uneori, nu reușește să raporteze toate împreună?
Întrebarea de astăzi &Sesiunea de răspuns vine de la amabilitatea SuperUser - o subdiviziune a Stack Exchange, o grupare bazată pe comunitate a site-urilor web Q & A.
Întrebarea
Cititorul SuperUser Coldblackice dorește să știe de ce browserul său nu întotdeauna mănâncă mizeria:
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, saucât de departe în descărcare este - arată doar viteza cu care se descarcă, cu un total de "Necunoscut".
De ce nu cunoștea browserul dimensiunea finală a anumitor fișiere? De unde primește această informație în primul rând?
Unde într-adevăr?
Contributor
SuperUser Gronostaj oferă următoarea informație:
Pentru a solicita documente de la servere web, browserele utilizează protocolul HTTP.S-ar putea să știți acest 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-o într-un editor de text, veți vedea http: // la început).Este un protocol simplu bazat pe text și funcționează astfel:
În primul rând, browserul dvs. se conectează la serverul site-ului web și trimite o adresă URL a documentului pe care dorește să îl descarce( paginile web sunt și documente) și câteva detalii despre browserul în sineUser-Agent 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 Host: superuser.com Conectare: Keep-alive Accept: text / html/xhtml+xml,application/xml;q=0.9,****q=0.8 User-Agent: Mozilla / 5.0( Windows NT 6.1; WOW64) Accept-Encoding: gzip, deflate, sdch, q = 0,8, en-US, q = 0,6, en; q = 0,4 Cookie: [eliminat pentru securitate] DNT: 1 If-Modified-Since:line specifică ce document ar trebui să revină serverul. Celelalte linii sunt numite anteturi;acestea arata astfel: Nume antet: Valoarea headeruluiAceste linii trimit informatii suplimentare care ajuta serverul sa decida ce trebuie sa faca.
Dacă totul este bine, serverul va răspunde prin trimiterea documentului solicitat. Răspunsul începe cu un mesaj de stare, urmat de unele antete( cu detalii despre document) și, în final, dacă totul este bine, conținutul documentului. Acesta este răspunsul serverului SuperUser pentru solicitarea mea:
HTTP / 1.1 200 OK Cache-Control: public, max-age = 60 Tip de conținut: text / html;charset = utf-8 Expiră: Tue, 09 Jul 2013 07:27:20 GMT Ultima modificare: Tue, 09 Jul 2013 07:26:20 GMT Vary: * X-Frame-Opțiuni: SAMEORIGIN Data: Tue, 09 Jul 201307:26:19 GMT Content-Length: 139672 & lt;! DOCTYPE html & gt;& Lt; html & gt;[... snip. ..] & lt; / html & gt;După ultima linie, serverul serverului SuperUser închide conexiunea.
Prima linie( HTTP / 1.1 200 OK) conține codul de răspuns, în acest caz este 200 OK.Înseamnă că serverul va returna un document, conform cerințelor. Când serverul nu reușește să facă acest lucru, codul va fi altceva: ați văzut probabil 404 Nu a fost găsit, iar 403 Interzis este destul de comună.Apoi, anteturile urmează.
Când browserul găsește o linie goală în răspuns, știe că tot ce trece de acea linie este conținutul documentului pe care l-a solicitat. Deci, în acest caz & lt;! DOCTYPE html & gt;este primul rând al codului de pornire al SuperUser. Dacă aș fi solicitat un document pentru a descărca, probabil că ar fi niște caractere grosolane, pentru că majoritatea formatelor de documente nu pot fi citite fără o prelucrare prealabilă.
Înapoi la anteturi. Cel mai interesant pentru noi este ultimul, Content-Length. Acesta informează browserul câte octeți de date ar trebui să se aștepte după linia goală, deci în esență este dimensiunea documentului exprimată în octeți. Acest antet nu este obligatoriu și poate fi omis de către server. Uneori, dimensiunea documentului nu poate fi prevăzută( de exemplu când documentul este generat în zbor), uneori programele leneș nu îl includ( destul de frecvente pe site-urile de descărcare a driverului), uneori site-urile sunt create de începători care nu știua unui astfel de antet.
Oricum, oricare ar fi motivul, antetul poate lipsi.În acest caz, browserul nu știe câte date are serverul să trimită și astfel afișează dimensiunea documentului ca necunoscut , așteptând serverul să închidă conexiunea.Și acesta este motivul pentru dimensiunile necunoscute ale documentelor.
Aveți ceva de adăugat la explicație? Sunați în comentariile. Doriți să citiți mai multe răspunsuri de la alți utilizatori de tehnologie Stack Exchange? Check out discuția completă aici.