Для запиту документів з веб-серверів браузери використовують протокол HTTP. Ви можете знати це ім’я з адресного рядка (воно може бути приховано зараз, але, натиснувши адресний рядок, скопіюйте URL-адресу та вставте її в якийсь текстовий редактор, ви побачите http://
на початку). HTTP - це простий текстовий протокол. Це працює так:
По-перше, ваш браузер підключається до сервера веб-сайту та надсилає URL-адресу документа, який він хоче завантажити (веб-сторінки теж є документами) та деякі деталі щодо самого браузера ( User-Agent тощо). Наприклад, щоб завантажити головну сторінку на сайт SuperUser http://superuser.com/
, мій браузер надсилає запит, який виглядає приблизно так:
GET / HTTP/1.1
Host: superuser.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.0 Safari/537.36
Accept-Encoding: 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
If-Modified-Since: Tue, 09 Jul 2013 07:14:17 GMT
Перший рядок визначає, який документ повинен повернути сервер. Інші рядки називаються заголовками; вони виглядають так:
Header name: Header value
Ці рядки надсилають додаткову інформацію, яка допомагає серверу вирішити, що робити.
Якщо все добре, сервер відповість, надіславши запитуваний документ. Відповідь починається з повідомлення про стан, за яким слідують деякі заголовки (з деталями щодо документа) і, нарешті, якщо все добре, вміст документа. Ось так виглядає відповідь сервера SuperUser на мій запит:
HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Content-Type: text/html; charset=utf-8
Expires: Tue, 09 Jul 2013 07:27:20 GMT
Last-Modified: Tue, 09 Jul 2013 07:26:20 GMT
Vary: *
X-Frame-Options: SAMEORIGIN
Date: Tue, 09 Jul 2013 07:26:19 GMT
Content-Length: 139672
<!DOCTYPE html>
<html>
[...snip...]
</html>
Після останнього рядка сервер SuperUser закриває з'єднання.
Перший рядок ( HTTP/1.1 200 OK
) містить код відповіді , в цьому випадку це 200 OK
. Це означає, що сервер вирішив, що він може повернути документ, як вимагається, і обіцяє, що вміст, який слідує за ним, буде таким документом. Якщо це не так, код буде чимось іншим, і він надасть деяку вказівку причини, по якій сервер не просто повертає документ як відповідь: наприклад, якщо він не може знайти запитуваний документ, він повинен повернути 404 Not Found
, і якщо вам не дозволяють отримати доступ до відповідного вмісту, він повинен повернутися 403 Forbidden
.
Після цього першого рядка стану слідують заголовки відповідей; вони надають більше інформації про вміст, що повертається, наприклад його Content-type
.
Далі - порожній рядок. Це сигналізує про те, що більше заголовків відповідей не буде слідувати. Все, що минуло за цим рядком, - це зміст документа, який він запитував. Отже, у наведеному вище прикладі <!DOCTYPE html>
- це перший рядок домашньої сторінки SuperUser (HTML-документ). Якби я просив завантажити документ, це, ймовірно, було б певні символи, оскільки більшість форматів документів не читаються без попередньої обробки.
Повернутися до заголовків. Найбільш цікавим для нас є останнім, Content-Length
. Він інформує браузер, скільки байтів даних він повинен очікувати після порожнього рядка, тому в основному це розмір документа, виражений у байтах. Цей заголовок не є обов'язковим і сервер його може опустити. Іноді розмір документа неможливо передбачити (наприклад, коли документ генерується на льоту), іноді ледачі програмісти не включають його (досить часто на сайтах із завантаження драйверів), іноді веб-сайти створюються новачками, які не знають такого заголовка.
Як би там не було, заголовок може бути відсутнім. У такому випадку браузер не знає, скільки даних надсилатиме сервер, і таким чином відображає розмір документа як невідомий , чекаючи, коли сервер закриє з'єднання. І це причина невідомих розмірів документів.