Пример запроса запроса конвейеризации HTTP

Ниже приведен пример вызова HTTP 1.1 с запрошенной одной страницей:

GET /jq.js HTTP/1.1
Host: 127.0.0.1
Accept: */*

Я понимаю, что Консолидация HTTP может быть отправлено несколько запросов без нарушения соединения.

Может кто-то опубликовать, какой-нибудь текстовый пример того, как этот запрос будет отправлен на сервер, я хочу иметь возможность сделать это через командную строку или с помощью сокетов PHP. Поддерживается ли поддержка конвейеризации на веб-сервере? По умолчанию используется конвейерная обработка, поддерживаемая основными веб-серверами (apache, nginx) или она должна быть включена.

Ответ 1

Из подробности протокола w3c:

8.1.2.2 Конвейерная обработка

Клиент, который поддерживает постоянные соединения МОЖЕТ "конвейер" своих запросов (т.е. отправлять несколько запросов без ожидания каждого ответа). Сервер ДОЛЖЕН отправлять свои ответы на эти запросы в том же порядке, в котором были получены запросы.

Клиенты, которые предполагают постоянные соединения и конвейер сразу после установления соединения СЛЕДУЕТ, готовы к повторному соединению, если первая попытка конвейера не удалась. Если клиент выполняет такую ​​попытку, конвейер НЕ ДОЛЖЕН, прежде чем он узнает, что соединение является постоянным. Клиенты ДОЛЖНЫ также готовы отправить свои запросы, если сервер закрывает соединение, прежде чем отправлять все соответствующие ответы.

Клиенты НЕ ДОЛЖНЫ конвейерные запросы с использованием методов, отличных от idempotent, или неидемпотентных последовательностей методов (см. раздел 9.1.2). В противном случае преждевременное прекращение транспортного соединения может привести к неопределенным результатам. Клиент, который хочет отправить запрос без idempotent СЛЕДУЕТ, ждать, чтобы отправить этот запрос, пока он не получил статус ответа для предыдущего запроса.

Итак, во-первых, вы должны быть в состоянии KeepAlive. Таким образом, вы должны добавить Connection: keep-alive ключевое слово в заголовки запроса, но некоторые веб-серверы могут по-прежнему принимать конвейерную обработку, не поддерживая этот статус. С другой стороны, это может быть отклонено сервером, сервер может или не может принять ваше соединение в режиме keepalive. Таким образом, в любое время, находясь в состоянии keepalived или нет, вы можете отправить 3 запроса, конвейеризованных в одном соединении, и получить только один ответ.

Из этот смысл мы можем найти хороший способ проверить его с помощью telnet.

Запрос на keepalive с заголовком Connection: keep-alive:

(echo -en "GET /index.html HTTP/1.1\nHost: foo.com\nConnection: keep-alive\n\nGET /index.html HTTP/1.1\nHost: foo.com\n\n"; sleep 10) | telnet localhost 80

Trying 127.0.0.1...
Connected to localhost.lan.
Escape character is '^]'.
HTTP/1.1 200 OK
Date: Sun, 27 Oct 2013 17:51:58 GMT
Server: Apache/2.2.22 (Debian)
Last-Modified: Sun, 04 Mar 2012 15:00:29 GMT
ETag: "56176e-3e-4ba6c121c4761"
Accept-Ranges: bytes
Content-Length: 62
Vary: Accept-Encoding
Keep-Alive: timeout=5, max=100  <======= Keepalive!
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

<html>
    <body>
        <h1>test</h1>
    </body>
</html>
HTTP/1.1 200 OK
Date: Sun, 27 Oct 2013 17:51:58 GMT
Server: Apache/2.2.22 (Debian)
Last-Modified: Sun, 04 Mar 2012 15:00:29 GMT
ETag: "56176e-3e-4ba6c121c4761"
Accept-Ranges: bytes
Content-Length: 62
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8

<html>
    <body>
        <h1>test</h1>
    </body>
</html>

Он работает.

Без запроса Keepalive:

(echo -en "GET /index.html HTTP/1.1\nHost: foo.com\nConnection: keep-alive\n\nGET /index.html HTTP/1.1\nHost: foo.com\n\n"; sleep 10) | telnet localhost 80

Trying 127.0.0.1...
Connected to localhost.lan.
Escape character is '^]'.
HTTP/1.1 200 OK
Date: Sun, 27 Oct 2013 17:49:37 GMT
Server: Apache/2.2.22 (Debian)
Last-Modified: Sun, 04 Mar 2012 15:00:29 GMT
ETag: "56176e-3e-4ba6c121c4761"
Accept-Ranges: bytes
Content-Length: 62
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8

<html>
    <body>
        <h1>test</h1>
    </body>
</html>
HTTP/1.1 200 OK
Date: Sun, 27 Oct 2013 17:49:37 GMT
Server: Apache/2.2.22 (Debian)
Last-Modified: Sun, 04 Mar 2012 15:00:29 GMT
ETag: "56176e-3e-4ba6c121c4761"
Accept-Ranges: bytes
Content-Length: 62
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8

<html>
    <body>
        <h1>test</h1>
    </body>
</html>
Connection closed by foreign host.

Тот же результат, я не просил об этом, но он выглядит как ответ Keepalive (закрытие после 5 секунд, которое является значением, установленным в Apache). И конвейерный ответ, я получаю две страницы.

Теперь, если я запретил использование любого Keepalive-соединения в Apache, установив:

Keepalive Off

И перезапустив его:

(echo -en "GET /index.html HTTP/1.1\nHost: foo.com\nConnection: keep-alive\n\nGET /index.html HTTP/1.1\nHost: foo.com\n\n"; sleep 10) | telnet localhost 80

Trying 127.0.0.1...
Connected to localhost.lan.
Escape character is '^]'.
HTTP/1.1 200 OK
Date: Sun, 27 Oct 2013 18:02:41 GMT
Server: Apache/2.2.22 (Debian)
Last-Modified: Sun, 04 Mar 2012 15:00:29 GMT
ETag: "56176e-3e-4ba6c121c4761"
Accept-Ranges: bytes
Content-Length: 62
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8

<html>
    <body>
        <h1>test</h1>
    </body>
</html>
Connection closed by foreign host.

Только один ответ... Поэтому сервер может отклонить мой запрос на конвейерную обработку.

Теперь, для поддержки на серверах и браузерах, я думаю, что ваш источник в wikipedia достаточно говорит: -)