Увеличение числа параллельных соединений браузера к одному домену из HTML

Большинство разработчиков сайтов уже знают, что число соединений к серверу у браузеров лимитированно. Старые версии браузеров используют только два соединения на сервер, более свежие побольше (например, «Опера» 11.10 — аж 16).

В общем случае алгоритм использования этих соединений достаточно сложен и отличается от браузера к браузеру (имеется ввиду будут ли параллельно загружаются стилевые таблицы, скрипты и прочее), но общее правило неизменно — больше своего лимита браузер соединений к серверу не плодит.

Между тем, это не всегда хорошо, ведь если все соединения заняты, то браузер ждёт данных по ним, не инициируя новые, даже если канал до сервера позволяет загрузить что-то ещё.

Если сайт и канал вполне выдержат и большее количество соединений от одного пользователя (с учётом посещаемости), то есть хитрость, которую часто используют — загружать статику (картинки, файлы стилей и прочее) с других доменов. Их не обязательно располагать на других серверах, достаточно дать одному серверу несколько имён и использовать их для загрузки.

Выглядеть это может так: static1.example.org, static2.example.org и так далее. «Яндекс», к примеру, грузит свои данные с домена yandex.st. Как видите, подходит другой домен любого уровня.

Хорошо, когда есть возможность завести любое количество доменов какого-нибудь уровня на своём хостинге. Далеко не все хостеры предоставят такую возможность бесплатно, а простому блогеру платить за ещё одно имя только ради ускорения загрузки вряд ли захочется.

Ничего страшного, чаще всего у пользователя такого хостинга аж четыре домена, просто мало кто об этом подозревает. Первые два достаточно очевидны — хостер часто, кроме какого-нибудь example.org, заводит ещё и www.example.org. Но ведь это два разных домена!

Ещё два не так очевидны— это домены «example.org.» и «www.example.org.». Обратите внимание на точку в конце домена.

Мои эксперименты (проверял на сервисе BrowserShots, операционные системы Linux, Windows XP, Mac OS X) говорят о том, что браузеры умеют с ними работать, то есть картинки с URL, где имя домена кончалось на точку, грузились нормально.

Для того, чтобы проверить считают ли браузеры домены с точкой в конце и без различными, я создал небольшой скрипт, который отдаёт картинку без кеширования с секундной задержкой.

В эксперименте я выставил максимальное количество соединений к серверу в единицу («Опера» и «FireFox» позволяют это сделать, где это делается в браузерах на WebKit я не знаю, подскажите, если знаете) и создал две HTML-страницы: одну, где две картинки из моего скрипта грузятся с одного домена, вторую, где одна из них грузится с домена с точкой.

Варианты загрузки (49.40КиБ)

На скриншоте хорошо заметен результат и видно где какой эксперимент (по колонке «Домен»). По скриншоту видно, что я использовал хорошо всем знакомый FireBug, но на Dragonfly из «Оперы» картина такая же.
18 апреля 2011 02:37

mr-simm (mr-simm.livejournal.com)
18 апреля 2011, 07:06

Между тем, это не всегда хорошо, ведь если все соединения заняты, то браузер ждёт данных по ним, не инициируя новые, даже если канал до сервера позволяет загрузить что-то ещё.
Давно интересует, как можно прервать все соединения под виндой принудительно? Если это можно сделать по конкретновзятому порту/от конкретновзятого приложения - было бы вообще замечательно.

indeec17 (инкогнито)
18 апреля 2011, 08:08

Круто! Спасибо за инфу!

Roman Ryltsov (alax.myopenid.com)
18 апреля 2011, 08:37, ответ предназначен mr-simm (mr-simm.livejournal.com):

Давно интересует, как можно прервать все соединения под виндой принудительно?
- TcpView http://technet.microsoft.com/en-us/sysinternals/bb897437
- выбрать соединения
- right click + "Close Connection"

Roman Ryltsov (alax.myopenid.com)
18 апреля 2011, 08:39

Информация по количеству соединений для IE:

http://weblogs.asp.net/mschwarz/archive/2008/07/21/internet-explorer-8-and-maximum-concurrent-connections.aspx
http://support.microsoft.com/kb/282402

bolk (bolknote.ru)
18 апреля 2011, 09:05, ответ предназначен Roman Ryltsov (alax.myopenid.com):

Спасибо! Доберусь до Windows, попробую.

mr-simm (mr-simm.livejournal.com)
18 апреля 2011, 09:16, ответ предназначен Roman Ryltsov (alax.myopenid.com):

Спасибо.

greli (greli.livejournal.com)
18 апреля 2011, 11:05, ответ предназначен bolk (bolknote.ru):

А это не баг? Вдруг исправят?

Alex Ostapov (инкогнито)
18 апреля 2011, 12:35

IMHO проблема кроется в сессии. У PHP в session_start стоит семафор по id сессии, т.е. пока выполняется один вызов скрипта, все остальные запущенные паралельно стоят и ждут. Сравните результат с выключенными сессиями. При вызове скрипта с разных доменов, сессии у них тоже будут разные и блокировки не происходит.

bolk (bolknote.ru)
18 апреля 2011, 12:44, ответ предназначен greli (greli.livejournal.com):

А это не баг? Вдруг исправят?
Существование домена с точкой — не баг, более того, на самом деле он ровно так и записывается. То, что домены считаются разными — баг, возможно на тех браузерах, которые я ещё не проверил (IE, WebKit-based), это не работает. В любом случае, хуже от этого не станет.

bolk (bolknote.ru)
18 апреля 2011, 12:45, ответ предназначен Alex Ostapov

IMHO проблема кроется в сессии
Вы не правы, более того, вы совершенно не в том направлении думаете. Сессии и PHP тут совершенно не причём.

jankkhvej (jankkhvej.blogspot.com)
18 апреля 2011, 13:36, ответ предназначен bolk (bolknote.ru):

Вы не правы, более того, вы совершенно не в том направлении думаете. Сессии и PHP тут совершенно не причём.
Судя по картинке с firebug, таки при чём. Рискну предположить, что серое на шкале - ожидание, синее - приём. И из этого следует, что запрос браузер в обеих случаях послал одновременно.

jankkhvej (jankkhvej.blogspot.com)
18 апреля 2011, 13:38

Впрочем, идея-то грузить картинки с "разных" доменов конечно правильная. Но вот тест – похоже ошибочен.

bolk (bolknote.ru)
18 апреля 2011, 15:18, ответ предназначен jankkhvej (jankkhvej.blogspot.com):

Судя по картинке с firebug, таки при чём. Рискну предположить, что серое на шкале - ожидание, синее - приём. И из этого следует, что запрос браузер в обеих случаях послал одновременно.
Нет, непричём.

Серое — это «блокировка» (занят канал соединения к серверу).

maxim-zotov (инкогнито)
18 апреля 2011, 15:56

Экономия на спичках. Сделать запутанную неочевидную схему ради выигрыша в 0.1%.

Как Гугл недавно порадовал изобретением собственного http-протокола, выигрыш которого в том, что в последовательных запросах не передаются поля типа user-agent.

bolk (bolknote.ru)
18 апреля 2011, 17:06, ответ предназначен maxim-zotov

У вас есть аргументы или вы «так чувствуете», что это «экономия на спичках»? Польза такой экономии давно посчитана, есть куча статей на эту тему.

jankkhvej (jankkhvej.blogspot.com)
18 апреля 2011, 17:31, ответ предназначен bolk (bolknote.ru):

Может, всё-таки стоит провести эксперимент со статическими картинками, без PHP?

jankkhvej (jankkhvej.blogspot.com)
18 апреля 2011, 17:39

Ок, не нужно, уже сделал сам. Действительно, теперь firebug показывает blocking таким цветом...

maxim-zotov (инкогнито)
18 апреля 2011, 17:40, ответ предназначен bolk (bolknote.ru):

Так чувствую. Что такое "старые браузеры"? 10-летней давности? 5-летней? 2-летней? MSIE 6? Opera 4?

Одно дополнительное имя (с точкой в конце) не даст ничего кроме раздувания и нечитаемости html-кода. Вместо src=/i/img.gif писать через раз src=http://pupkin.ru./i/img.gif? Ради одного процента пользователей MSIE 6? У которых ваша страница загрузится на 100 мс быстрее.

maxim-zotov (инкогнито)
18 апреля 2011, 17:46, ответ предназначен maxim-zotov

И еще нужно не забыть прибавить время на dns-резолвинг дополнительного имени.

bolk (bolknote.ru)
18 апреля 2011, 18:21, ответ предназначен maxim-zotov

Так чувствую. Что такое "старые браузеры"? 10-летней давности? 5-летней? 2-летней? MSIE 6? Opera 4?
Почитайте статьи на эту тему, можно начать вот с этой: http://webo.in/articles/habrahabr/32-parallel-downloads-optimization/

Очень рекомендую к прочтению книгу Коли Мациевского «Разгони свой веб-сайт», вот тут её можно взять бесплатно: http://speedupyourwebsite.ru/books/speed-up-your-website/

bolk (bolknote.ru)
18 апреля 2011, 18:22, ответ предназначен maxim-zotov

Вместо src=/i/img.gif писать через раз src=http://pupkin.ru./i/img.gif?
Шаблонизаторы вас выручат.

bolk (bolknote.ru)
18 апреля 2011, 21:16, ответ предназначен jankkhvej (jankkhvej.blogspot.com):

Ок, не нужно, уже сделал сам. Действительно, теперь firebug показывает blocking таким цветом…
Можно было не утруждаться, теория явно ошибочна — сессии просто не могут влиять таким образом.

Roman Ryltsov (alax.myopenid.com)
19 апреля 2011, 09:31

Я думаю, что это недурный инструмент, который позволяет сделать загрузку страницы (последовательность элементов) управляемой.

Недавно был свидетелем такой истории - сайт сделан, все чудно, но загрузка в IE сильно пробуксовывает там, где есть определенные элементы. Пока они не будут загружены все до конца, броузер показывает чистый лист и не может выполнить разметку. Хотя, возможно, присутствует проблема с броузером и/или сайтом (по-моему проблема была с используемым на сайте fancybox), тем не менее выведя загрузку этих важных элементов на другой домен можно вполне оперативно исправить неприятность с длительной загрузкой.

bolk (bolknote.ru)
19 апреля 2011, 16:08, ответ предназначен Roman Ryltsov (alax.myopenid.com):

Мне не удалось заставить IE9 на Windows 7 ходить через одно соединение к серверу, но ощущение такое (смотрел в Developer Tools, вызывается по F12), что домены с точкой и без он, всё же, считает различными.

bolk (bolknote.ru)
20 апреля 2011, 00:21

Я придумал другой тест.

Согласно ему, «Хром», который стоит у меня на системе, так же различает домены с точкой и без. Завтра попробую проверить IE.

bolk (bolknote.ru)
20 апреля 2011, 01:21

Проверил новым способом IE8, Opera 8.54, Safari 4.0 и FireFox 3.0.10, все эти браузеры различают домены с точкой и без.

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)