2013-10-27 13 views
11

Unten ist ein Beispiel HTTP 1.1-Aufruf mit einer einzigen Seite angefordert:HTTP Pipelining Anfrage Text Beispiel

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

ich mit HTTP Pipelining verstehen, können mehrere Anfragen, ohne die Verbindung zu unterbrechen gesendet werden.

  • Kann jemand Post, einige Text Beispiel, wie diese Anfrage an den Server gesendet werden, ich möchte es über die Befehlszeile oder mit PHP-Sockets tun können.
  • Muss die Unterstützung für das Pipelining auch auf dem Webserver aktiviert werden?
  • Ist Pipelining von großen Web-Server (Apache, nginx) standardmäßig unterstützt oder es
  • Antwort

    17

    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 :-)

    +0

    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

    +0

    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

    +0

    @Sotn völlig zustimmen, Probleme wie HTTP-Schmuggel zum Beispiel. – regilero