Pull to refresh

HTTP заголовки – не много ли мусора?

Reading time4 min
Views4.2K
HTTP протокол явлется основным протоколом передачи данных во всемирной сети (www).
Разрабатывали его достаточно давно по меркам IT индустрии, спецификация версии 1.0 издана в 1996, а текущей версии 1.1 – в 1999 (RFC 2616).

Общий объём ежедневного http трафика не поддаётся исчислению. Я вижу проблему в том, что большую часть этих передаваемых данных составляют HTTP заголовки, в основном, ненужные.
Кто-то может сказать, что это не так важно в наш век высоких скоростей и безлимитных тарифов, и будет отчасти прав. Но есть и другие соображения.


Что отсылают браузеры


Рассмотрим, например, yandex.ru.
При первой загрузке главной странички браузер загружает 19 ресурсов по HTTP протоколу, общим объёмом 44Kb (добавьте к этому ещё заголовки, в зависимости от браузера). Можно сказать, инжененры яндекса хорошо поработали над оптимизацией загрузки. Но, по приблизительным расчётам, 10% (около 4-5Кб) информации в заголовках излишни.

Казалось бы, 10% незначительны, но на это можно посмотреть с разных сторон.
Со стороны пользователя, ускорение загрузки страницы на 10% (привет регионам на диалапе).
Со стороны владельца сайта, возможно сокращение трафика на 10%, что также значит возможность обслуживать на 10% больше пользователей или, если рассматривать кластерную систему, купить 9 серверов вместо 10.
А по отношению в веб-разработчикам вообще некрасиво получается – ужимаешь png до минимально возможного размера в (например) 250 байт, и получаешь ещё столько же прицепом в заголовках.

Ниже приведены заголовки, отсылаемые современными браузерами (для примера взял заглавную страницу yandex.ru). Ещё ниже – дальнейшие размышления по этому поводу.

Firefox 3.0
GET / HTTP/1.1
Host: yandex.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive


IE7
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, */*
Accept-Language: ru
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)
Host: yandex.ru
Connection: Keep-Alive


Safari 3.1
GET / HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21
Accept-Encoding: gzip, deflate
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ru-RU
Connection: keep-alive
Host: yandex.ru


Opera 9
GET / HTTP/1.1
User-Agent: Opera/9.63 (Windows NT 5.1; U; en) Presto/2.1.1
Host: yandex.ru
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Cache-Control: no-cache
Connection: Keep-Alive, TE
TE: deflate, gzip, chunked, identity, trailers


Chrome
GET / HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.48 Safari/525.19
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Encoding: gzip,deflate,bzip2,sdch
Accept-Language: ru-RU,ru,en-US,en
Accept-Charset: windows-1251,*,utf-8
Host: yandex.ru
Connection: Keep-Alive


Вот примерно это отсылают наши браузеры при загрузке каждого ресурса (html страницы, javascript, css, картинки). Добавьтие к этому ещё куки (cookie), которые зачастую присутствуют.
Т.к. HTTP протокол не имеет состояния (stateless protocol), то заголовки приходится повторять при каждом запросе.

При всём этом минимальный “валидный” HTTP/1.1 запрос выглядит следующим образом:
GET / HTTP/1.1
Host: yandex.ru
Accept: */*
Accept-Encoding: gzip,deflate
Connection: keep-alive


Запрос HTTP/1.0 и того меньше:
GET / HTTP/1.0

но использовать его нецелесообразно, т.к. не поддерживаются сжатие, прокси и т.п.

Подробный разбор заголовков


User-Agent – исторически присутствует всегда и теоретически позволяет определить тип браузера. Но почему-то вместо строки “MSIE 7.0.5730.13” браузер отсылает неимоверной длины строку с данными, которые никто, в принципе, и не использует.

Accept – ненужный заголовок. Укажите хоть десяток сайтов, которые фильтруют входящие запросы по этому параметру (я не знаю даже где это могло бы пригодиться). По идее должен служить указателем серверу, какие типы файлов может обработать браузер. Практически же всегда передаётся “*/*”, что означает, что браузер готов принять любые файлы, что и делает заголовок бессмысленным.

Accept-Language – есть смысл передавать для указания языка по умолчанию для многоязыковых сайтов. Практически это значение используется сайтами крайне редко, и даже такие гиганты как google используют геолокацию (geoIP) для определения языка отображения.

Accept-Charset – также практически не используется. В реальности браузеры принимают любой charset, даже те которые не присутствуют в списке.

Вывод


Было бы замечательно, если бы разработчики браузеров исключили ненужные заголовки из отсылаемых http запросов, чтобы не увеличивать энтропию интернета сверх необходимого.
Думаю, суровые супервайзоры пресекут такие вольности.

У веб-разработчика один выход — оптимизировать. Без этого результаты могут быть плачевными (подгрузка 50 мелких картинок при загрузке страницы даёт ощутимую задержку). Подробнее ознакомиться с методами оптимизации можно, например, на webo.in

Кстати, информация, приведённая в этой статье, может пригодиться разработчику веб-парсеров (robots, crawlers), неотличимых от реального браузера. Советую честно отсылать “User-Agent: crawler”, но иногда необходимо отправить запрос, идентичный реальному.
Tags:
Hubs:
Total votes 62: ↑27 and ↓35-8
Comments59

Articles