Понякога верният измервател на прогреса при изтегляне на браузъра (или друго приложение) просто хвърля ръцете си във въздуха и се отказва от показването на оставащото време за изтегляне. Защо понякога се натрупва планираното време за изтегляне и понякога не се съобщава всичко заедно?
Днешната сесия за въпроси и отговори ни идва с любезното съдействие на SuperUser - подразделение на Stack Exchange - обединяване на уеб сайтове с въпроси и отговори.
Reader на SuperUser Coldblackice иска да разбере защо браузърът му не винаги измива мръсотията:
Понякога, когато изтегляте файл в уеб браузър, прогресирането на изтеглянето не "знае" общия размер на файла или колко далече по време на изтеглянето - то просто показва скоростта, с която се изтегля, с общо като "неизвестен".
Защо браузърът няма да знае окончателния размер на някои файлове? Къде получава тази информация на първо място?
Къде наистина?
Сътрудникът на SuperUser Gronostaj предлага следната представа:
За да заявят документи от уеб сървъри, браузърите използват HTTP протокола. Това име може да е известно от адресната лента (може да е скрито сега, но когато кликнете върху адресната лента, копирайте URL адреса и го поставете в някой текстов редактор, ще видите
HTTP: //
в началото). Това е прост текстов протокол и работи по следния начин:Първо, браузърът ви се свързва със сървъра на уебсайта и изпраща URL адрес на документа, който иска да изтегли (уеб страниците са документи), както и някои подробности за самия браузър (User-Agent и т.н.). Например, за да заредите основната страница в сайта на SuperUser,
http://superuser.com/
, моят браузър изпраща заявка, която изглежда така:GET / HTTP / 1.1 Хост: superuser.com Връзка: поддържане на живо Приемане: текст / html, приложение / xhtml + xml, приложение / xml; Windows NT 6.1, WOW64) Приемане-кодиране: gzip, deflate, sdch Приемане на език: pl-PL, pl = : 1 Ако-Променен-От: Тю, 09 Jul 2013 07:14:17 GMT
Първият ред посочва кой документ да се върне на сървъра. Другите редове се наричат заглавки; те изглеждат така:
Име на заглавката: Стойност на заглавката
Тези редове изпращат допълнителна информация, която помага на сървъра да реши какво да прави.
Ако всичко е наред, сървърът ще отговори, като изпрати искания документ. Отговорът започва със съобщение за състоянието, следвано от някои заглавки (с подробности за документа) и накрая, ако всичко е наред, съдържанието на документа. Ето как изглежда отговорът на сървъра на SuperUser за моята заявка:
HTTP / 1.1 200 ОК Кеш-контрол: публичен, макс. Възраст = 60 Тип съдържание: текст / html; charset = utf-8 Изтича след: Tue, 09 Jul 2013 07:27:20 GMT Последно променен: Tue, 09 Jul 2013 07:26:20 GMT Vary: * X-Frame Опции: SAMEORIGIN Дата: Tue, 09 Jul 2013 07:26:19 GMT Съдържание-Length: 139672 [... snip ...]
След последния ред сървърът на SuperUser затваря връзката.
Първият ред (
HTTP / 1.1 200 ОК
) съдържа кода на отговора, в този случай това е200 ОК
, Това означава, че сървърът ще върне документ, както се изисква. Когато сървърът не успее да направи това, кодът ще бъде нещо друго - вероятно сте я виждали404 Страницата не е намерена
, иЗабранено
е доста обичайно. След това заглавията следват.Когато браузърът открие празен ред в отговора, той знае, че всичко, минало по този ред, е съдържанието на документа, който е поискал. Така че в този случай
е първият ред от кода на началната страница на SuperUser. Ако исках документ, който да се изтегли, вероятно ще са някакви ненормални знаци, тъй като повечето формати на документи са нечетливи без предварителна обработка.
Обратно към заглавията. Най-интересното за нас е последното,
Content-Length
, Тя информира браузъра колко байта данни трябва да очаква след празната линия, така че основно това е размерът на документа, изразен в байтове. Този хедър не е задължителен и може да бъде пропуснат от сървъра. Понякога размерът на документа не може да бъде предвиден (например, когато документът се генерира в движение), понякога мързеливите програмисти не го включват (доста често на сайтовете за изтегляне на драйвери), понякога уебсайтовете се създават от начинаещи, които не знаят на такова заглавие.Както и да е, независимо от причината, заглавката може да липсва. В този случай браузърът не знае колко данни сървърът ще изпрати и по този начин показва размера на документа катонеизвестен, чакайки сървъра да затвори връзката. И това е причината за неизвестни размери на документи.
Имате ли нещо, което да добавите към обяснението? Звучи в коментарите. Искате ли да прочетете повече отговори от други потребители на Stack Exchange? Вижте цялата тема на дискусията тук.