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
下圖所示為POST請(qǐng)求的格式,有狀態(tài)行、請(qǐng)求頭、請(qǐng)求正文三部分。
二、 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í)例如下圖:
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)文
請(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)文
響應(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)擊閱讀原文