【轉(zhuǎn)】HTTP協(xié)議詳解

HTTP--Hyper Text Transfer Protocol,超文本傳輸協(xié)議,是一種建立在TCP上的無狀態(tài)連接,整個(gè)基本的工作流程是客戶端發(fā)送一個(gè)HTTP請(qǐng)求,說明客戶端想要訪問的資源和請(qǐng)求的動(dòng)作,服務(wù)端收到請(qǐng)求之后,服務(wù)端開始處理請(qǐng)求,并根據(jù)請(qǐng)求做出相應(yīng)的動(dòng)作訪問服務(wù)器資源,最后通過發(fā)送HTTP響應(yīng)把結(jié)果返回給客戶端。其中一個(gè)請(qǐng)求的開始到一個(gè)響應(yīng)的結(jié)束稱為事務(wù),當(dāng)一個(gè)事物結(jié)束后還會(huì)在服務(wù)端添加一條日志條目。


目錄

  • HTTP請(qǐng)求

  • HTTP響應(yīng)

  • HTTP報(bào)文格式

  • HTTP協(xié)議版本更替

  • 網(wǎng)站訪問量


一、HTTP請(qǐng)求

HTTP請(qǐng)求是客戶端往服務(wù)端發(fā)送請(qǐng)求動(dòng)作,告知服務(wù)器自己的要求。

HTTP請(qǐng)求由狀態(tài)行、請(qǐng)求頭、請(qǐng)求正文三部分組成:

狀態(tài)行:包括請(qǐng)求方式Method、資源路徑URL、協(xié)議版本Version;

請(qǐng)求頭:包括一些訪問的域名、用戶代理、Cookie等信息;

請(qǐng)求正文:就是HTTP請(qǐng)求的數(shù)據(jù)。

    備注:請(qǐng)求方式Method一般有GET、POST、PUT、DELETE,含義分別是獲取、修改、上傳、刪除,其中GET方式僅僅為獲取服務(wù)器資源,方式較為簡(jiǎn)單,因此在請(qǐng)求方式為GET的HTTP請(qǐng)求數(shù)據(jù)中,請(qǐng)求正文部分可以省略,直接將想要獲取的資源添加到URL中。下圖所示就是GET的請(qǐng)求,沒有請(qǐng)求正文。詳細(xì)的說明在下邊。

現(xiàn)在大多數(shù)協(xié)議版本為http/1.1

blob.png

下圖所示為POST請(qǐng)求的格式,有狀態(tài)行、請(qǐng)求頭、請(qǐng)求正文三部分。

blob.png

二、 HTTP響應(yīng)

2.1 響應(yīng)數(shù)據(jù)格式

服務(wù)器收到了客戶端發(fā)來的HTTP請(qǐng)求后,根據(jù)HTTP請(qǐng)求中的動(dòng)作要求,服務(wù)端做出具體的動(dòng)作,將結(jié)果回應(yīng)給客戶端,稱為HTTP響應(yīng)。

    HTTP響應(yīng)由三部分組成:狀態(tài)行、響應(yīng)頭、響應(yīng)正文;

狀態(tài)行:包括協(xié)議版本Version、狀態(tài)碼Status Code、回應(yīng)短語(yǔ);

響應(yīng)頭:包括搭建服務(wù)器的軟件,發(fā)送響應(yīng)的時(shí)間,回應(yīng)數(shù)據(jù)的格式等信息;

響應(yīng)正文:就是響應(yīng)的具體數(shù)據(jù)。

    備注:我們主要關(guān)心并且能夠在客戶端瀏覽器看得到的是三位數(shù)的狀態(tài)碼,不同的狀態(tài)碼代表不同的含義,其中

| 1xx | 表示HTTP請(qǐng)求已經(jīng)接受,繼續(xù)處理請(qǐng)求 |
| 2xx | 表示HTTP請(qǐng)求已經(jīng)處理完成 |
| 3xx | 表示把請(qǐng)求訪問的URL重定向到其他目錄 |
| 4xx | 表示客戶端出現(xiàn)錯(cuò)誤 |
| 5xx | 表示服務(wù)端出現(xiàn)錯(cuò)誤 |

具體HTTP響應(yīng)實(shí)例如下圖:

blob.png

2.2 常見狀態(tài)碼的含義

    200---OK/請(qǐng)求已經(jīng)正常處理完畢

    301---/請(qǐng)求永久重定向

    302---/請(qǐng)求臨時(shí)重定向

    304---/請(qǐng)求被重定向到客戶端本地緩存

    400---/客戶端請(qǐng)求存在語(yǔ)法錯(cuò)誤

    401---/客戶端請(qǐng)求沒有經(jīng)過授權(quán)

    403---/客戶端的請(qǐng)求被服務(wù)器拒絕,一般為客戶端沒有訪問權(quán)限

    404---/客戶端請(qǐng)求的URL在服務(wù)端不存在

    500---/服務(wù)端永久錯(cuò)誤

    503---/服務(wù)端發(fā)生臨時(shí)錯(cuò)誤

2.3 HTTP響應(yīng)模型

    服務(wù)器收到HTTP請(qǐng)求之后,會(huì)有多種方法響應(yīng)這個(gè)請(qǐng)求,下面是HTTP響應(yīng)的四種模型:

單進(jìn)程I/O模型

服務(wù)端開啟一個(gè)進(jìn)程,一個(gè)進(jìn)程僅能處理一個(gè)請(qǐng)求,并且對(duì)請(qǐng)求順序處理;

多進(jìn)程I/O模型

服務(wù)端并行開啟多個(gè)進(jìn)程,同樣的一個(gè)進(jìn)程只能處理一個(gè)請(qǐng)求,這樣服務(wù)端就可以同時(shí)處理多個(gè)請(qǐng)求;

復(fù)用I/O模型

服務(wù)端開啟一個(gè)進(jìn)程,但是呢,同時(shí)開啟多個(gè)線程,一個(gè)線程響應(yīng)一個(gè)請(qǐng)求,同樣可以達(dá)到同時(shí)處理多個(gè)請(qǐng)求,線程間并發(fā)執(zhí)行;

復(fù)用多線程I/O模型

服務(wù)端并行開啟多個(gè)進(jìn)程,同時(shí)每個(gè)進(jìn)程開啟多個(gè)線程,這樣服務(wù)端可以同時(shí)處理進(jìn)程數(shù)M*每個(gè)進(jìn)程的線程數(shù)N個(gè)請(qǐng)求。


三、HTTP報(bào)文格式

    HTTP報(bào)文是HTTP應(yīng)用程序之間傳輸?shù)臄?shù)據(jù)塊,HTTP報(bào)文分為HTTP請(qǐng)求報(bào)文和HTTP響應(yīng)報(bào)文,但是無論哪種報(bào)文,他的整體格式是類似的,大致都是由起始、首部、主體三部分組成,起始說明報(bào)文的動(dòng)作,首部說明報(bào)文的屬性,主體則是報(bào)文的數(shù)據(jù)。接下來具體說明。

3.1 HTTP請(qǐng)求報(bào)文

blob.png
    請(qǐng)求報(bào)文的起始由請(qǐng)求行構(gòu)成(有些資料稱為狀態(tài)行,名字不一樣而已,都是指的一個(gè)東西),用來說明該請(qǐng)求想要做什么,由<Method>、<URL>、<Version> 三個(gè)字段組成,注意每個(gè)字段之間都有一個(gè)空格。

    其中<Method>字段有不同的值:

GET --- 訪問服務(wù)器的資源

POST --- 向服務(wù)器發(fā)送要修改的數(shù)據(jù)

HEAD --- 獲取服務(wù)器文檔的首部

            PUT   --- 向服務(wù)器上傳資源

            DELETE--- 刪除服務(wù)器的資源

<URL>字段表示服務(wù)器的資源目錄定位

<Version>字段表示使用的http協(xié)議版本

首部部分由多個(gè)請(qǐng)求頭(也叫首部行)構(gòu)成,那些首部字段名有如下,不全:

            Accept     指定客戶端能夠接收的內(nèi)容格式類型

Accept-Language 指定客戶端能夠接受的語(yǔ)言類型

Accept-Ecoding 指定客戶端能夠接受的編碼類型

User-Agent 用戶代理,向服務(wù)器說明自己的操作系統(tǒng)、瀏覽器等信息

Connection 是否開啟持久連接(keepalive)

Host 服務(wù)器域名

...

    主體部分就是報(bào)文的具體數(shù)據(jù)。                      

3.2 HTTP響應(yīng)報(bào)文

blob.png
    響應(yīng)報(bào)文的起始由狀態(tài)行構(gòu)成,用來說明服務(wù)器做了什么,由<Version>、<Status-Code>、<Phrase>三個(gè)字段組成,同樣的每個(gè)字段之間留有空格;

    <Status-Code> 上邊已經(jīng)說明; 

    首部由多個(gè)響應(yīng)頭(也叫首部行)組成, 首部字段名如下,不全:

            Server    服務(wù)器軟件名,Apache/Nginx

            Date      服務(wù)器發(fā)出響應(yīng)報(bào)文的時(shí)間

            Last-Modified   請(qǐng)求資源的最后的修改時(shí)間

            ...

主體部分是響應(yīng)報(bào)文的具體數(shù)據(jù)。

小tips:關(guān)于更多請(qǐng)求頭和響應(yīng)頭(即首部字段名)的說明請(qǐng)參考http://tools.jb51.net/table/http_header


四、 HTTP協(xié)議版本更替

HTTP/0.9

    HTTP協(xié)議的最初版本,功能簡(jiǎn)陋,僅支持請(qǐng)求方式GET,并且僅能請(qǐng)求訪問HTML格式的資源。

HTTP/1.0

    在0.9版本上做了進(jìn)步,增加了請(qǐng)求方式POST和HEAD;不再局限于0.9版本的HTML格式,根據(jù)Content-Type可以支持多種數(shù)據(jù)格式,即MIME多用途互聯(lián)網(wǎng)郵件擴(kuò)展,例如text/html、image/jpeg等;同時(shí)也開始支持cache,就是當(dāng)客戶端在規(guī)定時(shí)間內(nèi)訪問統(tǒng)一網(wǎng)站,直接訪問cache即可。

但是1.0版本的工作方式是每次TCP連接只能發(fā)送一個(gè)請(qǐng)求,當(dāng)服務(wù)器響應(yīng)后就會(huì)關(guān)閉這次連接,下一個(gè)請(qǐng)求需要再次建立TCP連接,就是不支持keepalive。

HTTP/1.1

    解決了1.0版本的keepalive問題,1.1版本加入了持久連接,一個(gè)TCP連接可以允許多個(gè)HTTP請(qǐng)求; 加入了管道機(jī)制,一個(gè)TCP連接同時(shí)允許多個(gè)請(qǐng)求同時(shí)發(fā)送,增加了并發(fā)性;新增了請(qǐng)求方式PUT、PATCH、DELETE等。

    但是還存在一些問題,服務(wù)端是按隊(duì)列順序處理請(qǐng)求的,假如一個(gè)請(qǐng)求處理時(shí)間很長(zhǎng),則會(huì)導(dǎo)致后邊的請(qǐng)求無法處理,這樣就造成了隊(duì)頭阻塞的問題;同時(shí)HTTP是無狀態(tài)的連接,因此每次請(qǐng)求都需要添加重復(fù)的字段,降低了帶寬的利用率。

HTTP/2.0

為了解決1.1版本利用率不高的問題,提出了HTTP/2.0版本。增加雙工模式,即不僅客戶端能夠同時(shí)發(fā)送多個(gè)請(qǐng)求,服務(wù)端也能同時(shí)處理多個(gè)請(qǐng)求,解決了隊(duì)頭堵塞的問題;HTTP請(qǐng)求和響應(yīng)中,狀態(tài)行和請(qǐng)求/響應(yīng)頭都是些信息字段,并沒有真正的數(shù)據(jù),因此在2.0版本中將所有的信息字段建立一張表,為表中的每個(gè)字段建立索引,客戶端和服務(wù)端共同使用這個(gè)表,他們之間就以索引號(hào)來表示信息字段,這樣就避免了1.0舊版本的重復(fù)繁瑣的字段,并以壓縮的方式傳輸,提高利用率。

另外也增加服務(wù)器推送的功能,即不經(jīng)請(qǐng)求服務(wù)端主動(dòng)向客戶端發(fā)送數(shù)據(jù)。

當(dāng)前主流的協(xié)議版本還是HTTP/1.1版本。


五、 網(wǎng)站訪問量

    IP IP訪問量

相同的公網(wǎng)IP計(jì)算一次,就是同一個(gè)局域網(wǎng)內(nèi)的所有用戶訪問一個(gè)網(wǎng)站,但是他們都是借助一個(gè)公網(wǎng)IP去訪問那個(gè)網(wǎng)站的(NAT),因此這也只能算作一個(gè)IP訪問量。換一次公網(wǎng)IP則會(huì)加1。

    PV 網(wǎng)頁(yè)訪問量

用戶訪問的頁(yè)面數(shù)就是PV訪問量,同一個(gè)局域網(wǎng)的不同用戶,而且就算是同一個(gè)用戶,只要刷新一次網(wǎng)站頁(yè)面,PV訪問量就加1,三個(gè)訪問量的值往往數(shù)PV的值最大。

    UV 訪客訪問量

這里的訪客不是用戶,而是電腦,一臺(tái)電腦算一個(gè)訪客,即使是同一臺(tái)電腦的不同用戶,訪問同一個(gè)網(wǎng)站UV也只能加1,只有更換電腦才會(huì)使UV加1,因?yàn)榉?wù)端會(huì)記錄客戶端電腦的信息。

本文為轉(zhuǎn)載,只做知識(shí)記錄。點(diǎn)擊閱讀原文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容