Защо в моя уеб браузър понякога не се показват оставащите времена за изтегляне?
Понякога верният метър за изтегляне на вашия браузър (или друго приложение) просто хвърля ръцете си във въздуха и се отказва да покаже оставащото време за изтегляне. Защо понякога приковава прогнозираното време за изтегляне и понякога не успява да съобщи всичко заедно?
Днешната сесия за въпроси и отговори идва при нас с любезното съдействие на SuperUser - подразделение на Stack Exchange, групирано от общността уеб сайтове за въпроси и отговори.
Въпроса
Четецът на суперпотребителя Coldblackice иска да знае защо браузърът му не винаги яде мръсотията:
Понякога, когато изтегляте файл в уеб браузър, напредъкът при изтеглянето не „знае“ общия размер на файла, нито колко далеч в изтеглянето е той - той само показва скоростта, с която се изтегля, с общо като „Неизвестно“.
Защо браузърът не знае окончателния размер на някои файлове? Къде първо получава тази информация?
Където наистина?
Отговорите
Сътрудникът на SuperUser Gronostaj предлага следната информация:
За да поискате документи от уеб сървъри, браузърите използват протокола HTTP. Може да знаете това име от адресната лента (може да е скрито сега, но когато кликнете върху адресната лента, копирайте URL адреса и го поставете в някой текстов редактор, ще видите
HTTP: //
в началото). Това е прост текстов протокол и работи по следния начин:Първо, вашият браузър се свързва със сървъра на уебсайта и изпраща URL на документа, който иска да изтегли (уеб страниците също са документи) и някои подробности за самия браузър (User-Agent и т.н.). Например, за да заредите главната страница на сайта на SuperUser,
http://superuser.com/
, браузърът ми изпраща заявка, която изглежда така:GET / HTTP / 1.1 Хост: superuser.com Връзка: запазване на живо Приемане: text / html, application / xhtml + xml, application / xml; q = 0.9, * / *; q = 0.8 Потребителски агент: Mozilla / 5.0 ( Windows NT 6.1; WOW64) Приемам-кодиране: gzip, deflate, sdch Приемам-Език: pl-PL, pl; q = 0.8, en-US; q = 0.6, en; q = 0.4 Cookie: [премахнато за сигурност] DNT : 1 If-Modified-Since: Tue, 09 Jul 2013 07:14:17 GMT
Първият ред определя кой документ трябва да върне сървърът. Другите линии се наричат заглавия; те изглеждат така:
Име на заглавието: Стойност на заглавката
Тези редове изпращат допълнителна информация, която помага на сървъра да реши какво да прави.
Ако всичко е наред, сървърът ще отговори, като изпрати искания документ. Отговорът започва със съобщение за състояние, последвано от някои заглавия (с подробности за документа) и накрая, ако всичко е наред, съдържанието на документа. Ето как изглежда отговорът на сървъра на SuperUser:
HTTP / 1.1 200 OK Cache-Control: public, max-age = 60 Content-Type: text / html; charset = utf-8 Изтича: Tue, 09 Jul 2013 07:27:20 GMT Вари: * X-Frame-Options: SAMEORIGIN Дата: Вт, 09 Юли 2013 07:26:19 GMT Дължина на съдържанието: 139672 [… изрезка…]
След последния ред сървърът на SuperUser затваря връзката.
Първият ред (
HTTP / 1.1 200 OK
) съдържа кода за отговор, в този случай200 OK
. Това означава, че сървърът ще върне документ, както се изисква. Когато сървърът не успее да го направи, кодът ще бъде нещо друго: вероятно сте го видели404 Страницата не е намерена
, и403 Забранено
също е често срещано явление. След това следват заглавките.Когато браузърът намери празен ред в отговора, той знае, че всичко, което минава през тази линия, е съдържанието на искания от него документ. Така че в този случай
е първият ред от кода на началната страница на SuperUser. Ако исках документ за изтегляне, вероятно ще има някакви безсмислени символи, защото повечето формати на документи са нечетливи без предварителна обработка.
Обратно към заглавията. Най-интересното за нас е последното,
Content-Length
. Той информира браузъра колко байта данни трябва да очаква след празния ред, така че в основата си това е размерът на документа, изразен в байтове. Тази заглавка не е задължителна и може да бъде пропусната от сървъра. Понякога размерът на документа не може да се предвиди (например, когато документът се генерира в движение), понякога ленивите програмисти не го включват (доста често на сайтовете за изтегляне на драйвери), понякога сайтовете се създават от начинаещи, които не знаят на такава глава.Както и да е, каквато и да е причината, заглавието може да липсва. В този случай браузърът не знае колко данни ще изпрати сървърът и по този начин ще покаже размера на документа като неизвестен, изчаква сървъра да затвори връзката. И това е причината за неизвестни размери на документи.
Имате ли какво да добавите към обяснението? Звукът е изключен в коментарите. Искате ли да прочетете повече отговори от други технологични потребители на Stack Exchange? Вижте пълната тема за дискусия тук.