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.
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
Forse per URL identici cerca di usare la stessa connessione ma per URL cerca di selezionare un'altra connessione nel pool? – Mark
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