Contenuto Lunghezza viene usato per descrivere la lunghezza di trasferimento del corpo del messaggio. Nel protocollo HTTP, c'è una differenza tra la lunghezza dell'entità del messaggio e la lunghezza di trasmissione dell'entità del messaggio; ad esempio, con la compressione gzip, la lunghezza dell'entità del messaggio è la lunghezza prima della compressione, e la lunghezza di trasmissione dell'entità del messaggio è la lunghezza dopo la compressione gzip.
Nelle interazioni HTTP specifiche, il modo in cui il client ottiene la lunghezza del messaggio si basa principalmente sulle seguenti regole:
Se la risposta è 1xx, 204, 304 o la richiesta principale, il contenuto dell'entità del messaggio viene ignorato direttamente. Se esiste la Transfer-Encoding, il metodo in Transfer-Encoding è preferito per trovare la lunghezza corrispondente. Ad esempio, il modello Chunked. "Se c'è una Lunghezza di Contenuto nella testa, allora questa Lunghezza di Contenuto rappresenta sia la lunghezza del corpo che quella di trasmissione. Se la lunghezza dell'entità e la lunghezza di trasferimento non sono uguali (ad esempio la Transfer-Encoding è impostata), allora la Content-Length non può essere impostata.Se la Transfer-Encoding è impostata, allora Content-Length verrà ignorata”。 Il vantaggio di questa traduzione di frasi è che c'è un solo punto: con la Transfer-Encoding, non può esserci Contenuto Lungo. Trasmissione della distanza. Non ci ho prestato attenzione, non l'ho letto in dettaglio :) Chiudere la connessione attraverso il server determina la lunghezza del messaggio trasmesso. (Il richiedente non può indicare la fine del corpo della richiesta chiudendo la connessione, poiché ciò lascerebbe il server senza possibilità di continuare a rispondere.) Questa situazione corrisponde principalmente a connessioni brevi, cioè modalità non-keep-alive. HTTP 1.1 deve supportare la modalità chunk. Perché quando la lunghezza del messaggio è incerta, questa situazione può essere gestita tramite il meccanismo del chunk. Nell'intestazione contenente il contenuto del messaggio, se c'è un campo di lunghezza del contenuto, il corrispondente valore del campo deve corrispondere esattamente alla lunghezza dell'argomento del messaggio. "La lunghezza di entità di un messaggio è la lunghezza del corpo del messaggio prima che siano state applicate eventuali codifica di trasferimento" CioèSe c'è un blocco, non può esserci una lunghezza di contenuto 。
Il meccanismo di connessione persistente di HTTP/1.0 è stato introdotto successivamente ed è implementato tramite l'intestazione Connection: keep-alive, che può essere usata sia dal server che dal client per comunicarsi a vicenda che non è necessario disconnettere la connessione TCP dopo aver inviato i dati per un uso successivo.HTTP/1.1 richiede che tutte le connessioni siano persistenti,A meno che tu non aggiunga esplicitamente Connection: vicino all'intestazione。 Quindi, in realtà, il campo di intestazione Connection in HTTP/1.1 non ha più il valore di keep-alive, ma per ragioni storiche, molti server web e browser mantengono ancora l'abitudine di inviare connessioni Connection: keep-alive a HTTP/1.1 lunghe.
In effetti, gli ultimi possono essere quasi ignorati, e un breve riassunto è il seguente:
1. Lunghezza del contenuto: Se esiste ed è valido, deve essere esattamente uguale alla lunghezza di trasmissione del contenuto del messaggio. (Testato per troncare se troppo breve e troppo lungo per causare un timeout.) ) 2. Se c'è Transfer-Encoding (il focus è a blocchi), non può esserci Content-Length nell'intestazione e verrà ignorato. 3. Se viene utilizzata una connessione breve, la lunghezza di trasmissione del messaggio può essere determinata direttamente chiudendo la connessione attraverso il server. (È facile da capire) Combinato con altre funzionalità del protocollo HTTP, ad esempio, Http1.1 non supportava il keep alive. Allora si possono trarre le seguenti conclusioni: 1. Nelle versioni Http 1.0 e precedenti, il campo contenuto è opzionale. 2. In http1.1 e versioni successive. Se resti vivo, allora contenuto e blocco devono essere uno dei due. Se non viene mantenuto vivo, è uguale a http1.0. contenuto di lunghezza.
|