Come fa un client http associare una risposta HTTP con una richiesta (con Netty) o in generale?

StackOverflow https://stackoverflow.com/questions/7306497

  •  25-10-2019
  •  | 
  •  

Domanda

E 'un punto finale http supponiamo per rispondere alle richieste provenienti da un particolare client in modo che essi vengono ricevuti?

Che dire se non ha senso nel caso di richieste gestite dal gruppo dietro un proxy o nelle richieste gestite con NIO in cui una sola richiesta è finito più velocemente rispetto agli altri?

C'è un modo standard di associare un ID univoco a ogni richiesta HTTP da associare alla risposta? Come è questo gestito in clienti come http componenets httpclient o arricciare?

La questione si riduce al seguente caso:

Supponiamo, sto scaricando un file da un server e la richiesta non è finito. È un client in grado di portare a termine altre richieste sulla stessa connessione keep-alive?

È stato utile?

Soluzione

Non voglio riscrivere la risposta di CodeCaster perché è molto ben formulato.

In risposta alla tua modifica - no. Non è. Una singola connessione HTTP persistente può essere utilizzato solo per una richiesta alla volta, o sarebbe ottenere molto confuso. Perché HTTP non definisce alcuna forma di meccanismo di monitoraggio richiesta / risposta, semplicemente non sarebbe possibile.

Si dovrebbe notare che ci sono altri protocolli che utilizzano un formato di messaggio simile (conforme alle RFC822 ), che non consentono di questo (utilizzando meccanismi come SIP intestazione CSeq ), e sarebbe possibile realizzare questo in un app HTTP personalizzato, ma HTTP non definisce alcun meccanismo standard per fare questo, e quindi nulla può essere fatto che possa essere assunto al lavoro in tutto il mondo. Sarebbe anche presentare un problema con la risposta per il secondo messaggio - si fa attendere la prima risposta alla fine prima di inviare la seconda risposta, o provare e mettere in pausa la prima risposta, mentre si invia la seconda risposta? Come pensate di comunicarlo in modo che i messaggi garantisce non sarà danneggiato?

Si noti anche che SIP (di solito) opera su UDP, che non garantisce pacchetto ordinazione, rendendo il sistema CSeq più di una necessità.

Se si desidera inviare una richiesta a un server mentre un'altra transazione è ancora in corso, sarà necessario creare una nuova connessione al server, e quindi un nuovo flusso TCP.

Facebook ha fatto qualche ricerca in questo mentre stavano costruendo la loro CDN, e hanno concluso che si può avere in modo efficiente 2 o 3 flussi HTTP aperte in qualsiasi momento, ma non più di quanto che riduce il tempo complessivo di trasferimento a causa del sovraccarico di pacchetto aggiuntivo costo. Vorrei creare un collegamento alla voce del blog se riuscivo a trovare il link ...

Altri suggerimenti

Ogni volta che una connessione TCP viene aperta, la connessione viene riconosciuta dalle porte di origine e di destinazione e gli indirizzi IP. Quindi, se mi collego a www.google.com sulla porta di destinazione 80 (di default per HTTP), ho bisogno di una porta sorgente libera che il sistema operativo genererà.

La risposta del server web viene poi inviato alla porta di origine (e IP). Questo è anche opere come NAT, ricordando che porta sorgente appartiene a quale indirizzo IP interno (e viceversa per connessioni in ingresso).

Per quanto riguarda la tua modifica: no, una singola connessione HTTP può eseguire un comando (GET / POST / etc) allo stesso tempo. Se si invia un altro comando, mentre si sta retreiving i dati da un comando precedentemente rilasciato, i risultati possono variare per client e server di attuazione. Credo che Apache, per esempio, trasmetterà il risultato della seconda richiesta dopo che i dati della prima richiesta viene inviata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top