prefazione
Il protocollo HTTP è uno dei protocolli più importanti su Internet, anche se sembra semplice, ma in pratica spesso incontra problemi, e lo abbiamo incontrato diverse volte. Ci sono connessioni lunghe e parsing di pacchetti. Non puoi sapere nulla del protocollo HTTP, devi capirlo a fondo. Quindi ho scritto questa serie per condividere i problemi e le esperienze del protocollo HTTP.
Il protocollo HTTP ha un'intestazione e un corpo sia per i pacchetti di richiesta che per quelli di risposta, e il corpo è la risorsa che si desidera ottenere, come una pagina html, un'immagine jpeg, e l'intestazione viene usata per stabilire certe convenzioni. Ad esempio, client e server concordano alcuni formati di trasmissione, e il client prima riceve l'intestare, conosce alcune informazioni sul formato e poi inizia a leggere il corpo.
Client: Accept-Encoding:gzip (comprimilo per me, sto usando il traffico, scaricalo prima e poi scomprimilo lentamente)
Server 1: Content-Encoding: null (Nessun header Content-Encoding.) Non do compressione, la CPU non è gratuita, la vuoi?)
Server 2: Content-Encoding:gzip (salva il traffico per te, comprimilo) Cliente: Connessione: keep-alive (Fratello maggiore, finalmente abbiamo costruito una connessione TCP, la useremo la prossima volta)
Server 1: Connessione: keep-alive (non facile, continua a usare)
Server 2: Connessione: chiusa (Chiunque continui a usarlo con te, il nostro TCP è una tantum, e dovremo riconnetterci la prossima volta che lo troveremo) Il protocollo HTTP non prevede tre handshake e, quando un client richiede risorse al server, prevale il lato server. Ci sono anche alcune header che non hanno un processo di negoziazione, ma il server dice direttamente al client cosa fare. Ad esempio, la Longitudine del Contenuto sopra è ciò che il server indica al client quanto è grande il corpo. Ma! Il cameriere potrebbe non essere in grado di dirti esattamente quanto sia grande il corpo in anticipo. Il server deve prima scrivere l'header, poi il corpo; se vuoi scrivere il body case nell'header, devi conoscere la dimensione del corpo in anticipo. Se il corpo è generato dinamicamente, il server finirà e inizierà a scrivere l'intestazione (header), il che richiede molto overhead aggiuntivo, quindi potrebbe non esserci una lunghezza di contenuto nell'header.
Quindi, come fa il cliente a sapere la dimensione del corpo? Il server te lo dice in tre modi.
1. Il server conosce già la dimensione della risorsa e ti informa tramite l'intestazione di contenuto lungo.
Content-Length:1076(body的大小是1076B,你读取1076B就可以完成任务了)
Transfer-Encoding: null
2. Il server non può conoscere in anticipo la dimensione della risorsa, o non è disposto a spendere risorse per calcolarne la dimensione in anticipo, quindi aggiungerà un'intestazione al messaggio di risposta http chiamata Transfer-Encoding:chunked, che significa trasferimento a blocchi. Ogni blocco utilizza un formato fisso, con la dimensione del blocco davanti, i dati dietro di esso e poi l'ultimo blocco con una dimensione 0. In questo modo, quando il client analizza le analisi, deve prestare attenzione alla rimozione di alcuni campi inutili.
Content-Length:null
Transfer-Encoding:chunked (接下来的body我要一块一块的传,每一块开始是这一块的大小,等我传到大小为0的块时,就没了)
3. Il server non conosce la dimensione della risorsa e non supporta la modalità di trasmissione a blocchi, quindi non esiste né l'intestazione content-length né l'intestazione di transfer-encoding. In questo momento, l'intestazione restituita dal server deve essere vicina.
Content-Length:null
Transfer-Encoding:null
Connection:close(我不知道大小,我也用不了chunked,啥时候我关了tcp连接,就说明传输结束了)
|