2011-09-05 8 views
9

Sto usando Firefox, ma mi piacerebbe sapere come i browser decidono in generale.In quali circostanze il mio browser tenta di riutilizzare una connessione TCP per più richieste?

Sembra che quando accedo allo stesso URL due volte in un breve lasso di tempo, il mio browser tenta di riutilizzare la stessa connessione TCP per entrambe le richieste (questo è chiamato keep-alive). Tuttavia, quando accedo a due URL diversi (ma ancora serviti dallo stesso server), il browser a volte decide di aprire una nuova connessione per ogni richiesta. Ovviamente, il browser non utilizza una politica di una connessione per indirizzo.

Lo chiedo perché sto cercando di implementare un servizio Web che utilizza il polling lungo. Posso immaginare che un utente potrebbe voler aprire questo servizio in più schede sullo stesso browser. Tuttavia, con keep-alive, la seconda richiesta di polling lunga non viene inviata fino al completamento del primo (almeno in Firefox), perché il browser sta cercando di inserirli entrambi nello stesso socket, cosa che non mi aspettavo quando progettato il servizio. Anche se il browser implementa il pipe-lining, non c'è modo che io possa rispondere alla seconda richiesta prima di rispondere al primo, perché l'HTTP richiede che io completi le risposte in ordine.

risposta

6

Quando si utilizza HTTP/1.1, per impostazione predefinita, le connessioni TCP vengono lasciate aperte per il riutilizzo. Questo è per prestazioni migliori rispetto all'avvio di una nuova connessione per richiesta. La connessione può essere riutilizzata ma la connessione potrebbe essere chiusa in qualsiasi momento da una delle parti.

È necessario leggere HTTP1.1 e la parte sulle connessioni permanenti.

Nel tuo caso non è nemmeno usando HTTP pipelining (non ampiamente supportato) perché la richiesta successiva viene inviata dopo la risposta del primo.

I browser dispongono di un pool di connessioni e lo riutilizzano per nome host. In generale, un browser non deve riutilizzare una singola connessione per più nomi host, anche se tali nomi host effettivamente si risolvono con lo stesso indirizzo IP.

La maggior parte dei browser consente all'utente di configurare o sovrascrivere il numero di connessioni permanenti per server; i browser più moderni sono impostati su sei. Se Firefox è veramente bloccando la seconda richiesta perché c'è già una connessione attiva, questo è un bug in Firefox e dovrebbe essere archiviato nel loro sistema di tracciamento dei bug. Ma se un tale errore esistesse, penso che vedresti molti siti danneggiati.

+0

Sebbene io dica a Firefox di inviare una richiesta al server una seconda volta, credo che in realtà non invii una richiesta perché vuole attendere il completamento della prima richiesta, in modo che possa riutilizzare la connessione. Questa è una funzionalità, non un bug, corretta? – Mark

+0

Forse per URL identici cerca di usare la stessa connessione ma per URL cerca di selezionare un'altra connessione nel pool? – Mark

+0

Se il test consiste nell'inviare 2 richieste HTTP simultanee allo stesso URL, è possibile vederle "serializzate" o inviarle tramite 2 diverse connessioni TCP. MA NON li stai vedendo pipeline. Ciò che accadrà, è ora l'implementazione dipendente. Ad esempio. il browser può scegliere di riutilizzare una connessione dal pool, o inviare la seconda richiesta su una nuova connessione. Entrambi gli approcci sono corretti poiché HTTP è un protocollo 'stateless'. Se la tua implementazione dipende da dettagli come questi, allora IMHO c'è un difetto nel tuo design. Potrebbe essere che dovresti scrivere di più su ciò che vuoi ottenere. – Cratylus