Da w3c protocol details:
8.1.2.2 pipelining
Un client che supporta le connessioni persistenti MAGGIO "pipeline" le sue richieste (ad esempio, inviare più richieste senza attendere per ogni risposta). Un server DEVE inviare le sue risposte a tali richieste nello stesso ordine in cui sono state ricevute le richieste.
I client che presuppongono connessioni e pipeline persistenti subito dopo la creazione della connessione DOVREBBE essere pronti a riprovare la connessione se il primo tentativo pipeline fallisce. Se un cliente fa un esempio di tentativi, è NON DEVE gasdotto prima che conosce la connessione è persistente. I clienti MUST anche essere pronti a inviare nuovamente le loro richieste se il server chiude la connessione prima di inviare tutte le risposte corrispondenti.
I clienti NON DEVONO inviare richieste di pipeline utilizzando metodi non idempotenti o sequenze di metodi non identi che (vedere la sezione 9.1.2). In caso contrario, una cessazione anticipata della connessione di trasporto potrebbe portare a risultati indeterminati. Un cliente che desidera inviare una richiesta non idempotente DOVREBBE attendere per inviare quella richiesta fino a quando non ha ricevuto lo stato di risposta per la richiesta precedente.
Quindi, il primo dato è che si dovrebbe essere in uno stato KeepAlive. Quindi devi aggiungere aggiungere la parola chiave Connection: keep-alive
nelle intestazioni di richiesta, ma alcuni server Web potrebbero ancora accettare il pipelining senza questo stato di mantenimento. D'altra parte, questo potrebbe essere rifiutato dal server, il server può o non può accettare la connessione in modalità keepalive. Pertanto, in qualsiasi momento, essendo in mantenimento o meno, è possibile inviare 3 richieste pipeline in una connessione e ottenere solo una risposta.
Da this gist possiamo trovare un buon modo per testarlo con telnet.
Chiedendo keepalive con Connection: keep-alive
intestazione:
(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>
Funziona.
Senza chiedere 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.
Stesso risultato, non ho chiesto per esso, ma sembra che una risposta Keepalive (chiusura dopo 5s che è il valore impostato in Apache). E una risposta pipeline, ottengo le mie due pagine.
Ora, se posso evitare l'uso di qualsiasi connessione Keepalive in Apache impostando:
Keepalive Off
e riavviandolo:
(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.
Solo una risposta ... Quindi il server può respingere la mia richiesta di pipelining.
Ora, per il supporto su server e browser, penso che la tua fonte wikipedia dice abbastanza :-)
Vorrei che avevano messo le molteplici intestazioni di richiesta in là .. immagino che dovrei provare e poi mettere questo in là. Grazie per la risposta dettagliata! – DMin
Penso che keep-alive sia l'ultima cosa di cui dovresti preoccuparti. Connessione: keep-alive è il comportamento predefinito in HTTP/1.1. Ci sono problemi più importanti in corso con la pipeline http. – sotn
@sotn sono completamente d'accordo, ad esempio problemi come il contrabbando di HTTP. – regilero