Von w3c protocol details aktiviert werden muss:
8.1.2.2 Pipelining
Ein Client, unterstützt persistente Verbindungen MAY "pipeline" seine Anforderungen (dh mehrere Anfragen senden, ohne auf jede Antwort zu warten). Ein Server MUSS seine Antworten auf diese Anfragen in der gleichen Reihenfolge senden, in der die Anfragen eingegangen sind.
Clients, die nach Verbindungsaufbau dauerhafte Verbindungen und Pipeline annehmen SOLLTEN SOLLTEN sich darauf vorbereiten, ihre Verbindung erneut zu versuchen, wenn der erste Pipeline-Versuch fehlschlägt. Wenn ein Client einen solchen Versuch unternimmt, muss er NICHT pipeline, bevor es die Verbindung kennt, ist persistent. Clients MUSS auch bereit sein, ihre Anforderungen erneut zu senden, wenn der Server die Verbindung vor dem Senden aller entsprechenden Antworten schließt.
Clients SOLLTEN NICHT Anfragen mit nicht-idempotenten oder nicht-idempotenten Methodenfolgen pipettieren (siehe Abschnitt 9.1.2). Andernfalls kann eine vorzeitige Beendigung der Transportverbindung zu unbestimmten Ergebnissen führen. Ein Client, der eine nicht-idempotente Anfrage senden möchte, muss SOLLEN warten, um diese Anfrage zu senden, bis er den Antwortstatus für die vorherige Anfrage erhalten hat.
Also, erste Tatsache ist, dass Sie in einem KeepAlive-Status sein sollten. So sollten Sie Connection: keep-alive
Keyword in Ihrer Anfrage Header hinzufügen, aber einige Webserver können noch Pipelining ohne diesen Status beibehalten. Auf der anderen Seite könnte dies vom Server abgelehnt werden, der Server kann Ihre Verbindung im Keepalive-Modus akzeptieren oder nicht. So können Sie zu jeder Zeit, wenn Sie im Keepaliving sind oder nicht, 3 Anfragen in einer Verbindung verschicken und nur eine Antwort erhalten.
Von this gist können wir eine nette Möglichkeit finden, es mit Telnet zu testen.
Vorstellung für Keep-Alive mit Connection: keep-alive
Header:
(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>
Es funktioniert.
Ohne für Keepalive zu fragen:
(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.
Gleiches Ergebnis, bitte ich um es nicht, aber es sieht aus wie eine Antwort Keepalive (nach 5s schließen, die der Wert in Apache gesetzt ist). Und eine Pipeline-Antwort, ich bekomme meine zwei Seiten.
Nun, wenn ich verhindern Gebrauch der Keepalive-Verbindung in Apache, indem:
Keepalive Off
Und neu zu starten:
(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.
Nur eine Antwort ... So kann der Server meine Anfrage ablehnen für Pipelining.
nun für die Unterstützung auf den Servern und Browsern, ich glaube, Ihre wikipedia Quelle genug :-)
erzählt Ich wünschte, sie die Header dort mehrere Anfrage gestellt hatte .. denke, ich sollte versuchen, und diese dann in dort zu setzen. Danke für die ausführliche Antwort! – DMin
Ich denke, dass Keep-Alive das letzte ist, worüber man sich Sorgen machen sollte. Verbindung: keep-alive ist das Standardverhalten in HTTP/1.1. Es gibt wichtigere Probleme mit HTTP-Pipelining. – sotn
@Sotn völlig zustimmen, Probleme wie HTTP-Schmuggel zum Beispiel. – regilero