Защо моят уеб браузър понякога не успява да покаже оставащите времена за изтегляне?

защо-моят-уеб-браузър-понякога-неуспешно-показване-оставащи-време за изтегляне снимка 1

Понякога верният измервател на напредъка на изтегляне във вашия браузър (или друго приложение) просто вдига ръце и се отказва от показването на оставащото време за изтегляне. Защо понякога достига предвиденото време за изтегляне, а понякога не успява да отчете всичко заедно?

Днешната сесия на въпроси и отговори идва при нас с любезното съдействие на SuperUser – подразделение на Stack Exchange, управлявана от общността група от уеб сайтове за въпроси и отговори.



Въпроса

Читателят на SuperUser Coldblackice иска да знае защо неговият браузър не винаги измива мръсотията:

Понякога, когато изтегляте файл в уеб браузър, напредъкът на изтегляне не знае общия размер на файла или колко далече в изтеглянето му - той просто показва скоростта, с която се изтегля, с общо като Неизвестно .

Защо браузърът не знае крайния размер на някои файлове? Откъде получава тази информация на първо място?

къде наистина?

Отговорите

Сътрудникът на SuperUser Gronostaj предлага следната представа:

За да изискват документи от уеб сървъри, браузърите използват HTTP протокола. Може да знаете това име от вашата адресна лента (това може да е скрито сега, но когато щракнете върху адресната лента, копирате URL адреса и го поставите в някакъв текстов редактор, ще видите |_+_| в началото). Това е прост протокол, базиран на текст и работи по следния начин:

Първо, вашият браузър се свързва със сървъра на уебсайта и изпраща URL на документа, който иска да изтегли (уеб страниците също са документи) и някои подробности за самия браузър (User-Agent и т.н.). Например, за да заредя главната страница на сайта на SuperUser, |_+_|, моят браузър изпраща заявка, която изглежда така:

|_+_|

Първият ред указва кой документ трябва да върне сървърът. Другите редове се наричат ​​заглавия; изглеждат така:

|_+_|

Тези линии изпращат допълнителна информация, която помага на сървъра да реши какво да прави.

Ако всичко е наред, сървърът ще отговори, като изпрати искания документ. Отговорът започва със съобщение за състояние, последвано от някои заглавки (с подробности за документа) и накрая, ако всичко е наред, съдържанието на документа. Ето как изглежда отговорът на сървъра на SuperUser за моята заявка:

|_+_|

След последния ред сървърът на SuperUser затваря връзката.

Първият ред (|_+_|) съдържа кода на отговора, в този случай това е |_+_|. Това означава, че сървърът ще върне документ, както е поискано. Когато сървърът не успее да го направи, кодът ще бъде нещо друго: вероятно сте виждали |_+_| и |_+_| също е доста често срещано явление. След това следват заглавките.

Когато браузърът намери празен ред в отговора, той знае, че всичко след този ред е съдържанието на документа, който е поискал. Така че в този случай |_+_| е първият ред от кода на началната страница на SuperUser. Ако исках документ за изтегляне, той вероятно щеше да има някакви безсмислени знаци, защото повечето формати на документи са нечетими без предварителна обработка.

Обратно към заглавките. Най-интересният за нас е последният, |_+_|. Той информира браузъра колко байта данни трябва да очаква след празния ред, така че основно това е размерът на документа, изразен в байтове. Тази заглавка не е задължителна и може да бъде пропусната от сървъра. Понякога размерът на документа не може да бъде предвиден (например когато документът се генерира в движение), понякога мързеливите програмисти не го включват (доста често срещано в сайтовете за изтегляне на драйвери), понякога уебсайтовете се създават от начинаещи, които не знаят на такова заглавие.

Както и да е, каквато и да е причината, заглавката може да липсва. В този случай браузърът не знае колко данни ще изпрати сървърът и по този начин показва размера на документа като неизвестен, чакайки сървърът да затвори връзката. И това е причината за неизвестни размери на документа.