2013-10-27 18 views
11

Di seguito è riportato un esempio HTTP 1.1 chiamata con una singola pagina richiesta:HTTP pipelining richiesta esempio testo

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

ho capito con HTTP Pipelining, più richieste possono essere inviate senza interrompere la connessione.

  • Qualcuno può postare, qualche esempio di testo di come questa richiesta verrà inviata al server, voglio essere in grado di farlo tramite la riga di comando o con i socket PHP.
  • Fa il supporto per il pipelining necessità di permesso sul web-server come bene?
  • Is pipelining supportato dai principali Web-server (Apache, nginx) di default o che ha bisogno di essere attivato
  • risposta

    17

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

    +0

    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

    +0

    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

    +0

    @sotn sono completamente d'accordo, ad esempio problemi come il contrabbando di HTTP. – regilero