Http постоянный лимит соединений - PullRequest
3 голосов
/ 12 июня 2011
Clients that use persistent connections SHOULD limit the number of simultaneous
connections that they maintain to a given server. A single-user client SHOULD 
NOT maintain more than 2 connections with any server or proxy.

[..]

Я особенно не уверен насчет "СЛЕДУЕТ" ... в чем смысл? Anw Почему?

Я знаю, что постоянные соединения HTTP, также называемые HTTP keep-alive, представляют собой идею использования одного и того же TCP-соединения для отправки и получения нескольких HTTP-запросов / ответов, в отличие от открытия нового для каждой отдельной пары запрос / ответ , Я знаю, что использование постоянных соединений очень важно для повышения производительности HTTP.

  • Предопределено ли ограничение на 2 соединения на сервер или нет?
  • Когда запрос будет использовать существующее соединение или получать новое?

допустим, у меня есть HTML-страница, содержащая следующие ссылки на изображения:

<img src="http://example.com/image1.gif"/>
<img src="http://example.com/image2.gif"/>
<img src="http://example.com/image3.gif"/>
<img src="http://example.com/image4.gif"/>

Включена директива keep-alive моего сервера: что здесь происходит с точки зрения постоянных соединений? Правило / трюк оптимизации, относящиеся к ограничению на 2 одновременных соединения на сервер, как указано ниже, действительно?

<img src="http://example.com/image1.gif"/>
<img src="http://example.com/image2.gif"/>
<img src="http://example2.com/image3.gif"/>
<img src="http://example2.com/image4.gif"/>

спасибо

Ответы [ 2 ]

2 голосов
/ 12 июня 2011

Клиент может использовать более одного подключения для параллельной загрузки ресурсов.В вашем примере, например, он может решить загрузить image1.gif и image2.gif одновременно по двум соединениям.Если мы предположим, что image1.gif завершится первым, он будет помещен в очередь image3.gif для этого соединения.И так далее.

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

Предел двух подключений - это соглашение больше всего на свете.Ничто не мешает браузеру открывать 50, если он этого хочет.Однако на этом уровне использование полосы пропускания является ограничивающим фактором, поэтому большинство браузеров (я подозреваю) ограничивают себя несколькими подключениями.

Опять же, ничего конкретного не останавливает их, однако при наличии большого количества подключений уменьшается отдача.

1 голос
/ 12 июня 2011

Не принимайте это "СЛЕДУЕТ" слишком серьезно. IE в какой-то момент разрешал только 2 одновременных подключения. Даже в тот момент была возможность убрать лимит (через «хак»).

В настоящее время ограничение составляет 8 в большинстве браузеров (включая Firefox, Safari). IE8 имеет ограничение на 6 подключений на хост.

Как вы можете себе представить, 2 соединения на хост слишком мало. Вы не сможете загрузить страницу с хоста, у вас было 2 загрузки с одного хоста!

И в случае, если вы используете заголовок connection: keep-alive, все пять ваших изображений будут загружаться в одно и то же TCP-соединение, а не прерывать соединение и повторно делать его, в случае соединения: close

Это неэффективно, так как трехстороннее рукопожатие TCP должно быть переделано каждый раз, когда вы запрашиваете изображение!

В соответствии с HTTP 1.1 все соединения остаются активными, если не указано иное со следующим заголовком: Подключение: закрыть

С другой стороны, у вас также есть HTTP Pipelining (см. Ответ Майка Карона), который не ожидает возврата одного запроса перед отправкой другого. Это реализовано с помощью Firefox (как вы можете увидеть / отключить в about: config), но это не та проблема, что Максимальное количество подключений на хост.

Также: Если вы не используете постоянные соединения с конвейерной передачей, вы будете делать несколько соединений. Отправка одного запроса перед закрытием предыдущего. Это заблокирует из-за ограничения макс-соединений.

...