2021-05-12 14:32:11
關於HTTP協定深入理解
HTTP--Hyper Text Transfer Protocol,超文字傳輸協定,是一種建立在TCP上的無狀態連線,整個基本的工作流程是用戶端傳送一個HTTP請求,說明用戶端想要存取的資源和請求的動作,伺服器端收到請求之後,伺服器端開始處理請求,並根據請求做出相應的動作存取伺服器資源,最後通過傳送HTTP響應把結果返回給用戶端。其中一個請求的開始到一個響應的結束稱為事務,當一個事物結束後還會在伺服器端新增一條紀錄檔條目。
目錄
- HTTP請求
- HTTP響應
- HTTP報文格式
- HTTP協定版本更替
- 網站存取量
一、HTTP請求
HTTP請求是用戶端往伺服器端傳送請求動作,告知伺服器自己的要求。
HTTP請求由狀態行、請求頭、請求正文三部分組成:
狀態行:包括請求方式Method、資源路徑URL、協定版本Version;
請求頭:包括一些存取的域名、使用者代理、Cookie等資訊;
請求正文:就是HTTP請求的資料。
備註:請求方式Method一般有GET、POST、PUT、DELETE,含義分別是獲取、修改、上傳、刪除,其中GET方式僅僅為獲取伺服器資源,方式較為簡單,因此在請求方式為GET的HTTP請求資料中,請求正文部分可以省略,直接將想要獲取的資源新增到URL中。下圖所示就是GET的請求,沒有請求正文。詳細的說明在下邊。
現在大多數協定版本為http/1.1
下圖所示為POST請求的格式,有狀態行、請求頭、請求正文三部分。
二、HTTP響應
2.1 響應資料格式
伺服器收到了用戶端發來的HTTP請求後,根據HTTP請求中的動作要求,伺服器端做出具體的動作,將結果回應給用戶端,稱為HTTP響應。
HTTP響應由三部分組成:狀態行、響應頭、響應正文;
狀態行:包括協定版本Version、狀態碼Status Code、回應短語;
響應頭:包括搭建伺服器的軟體,傳送響應的時間,回應資料的格式等資訊;
響應正文:就是響應的具體資料。
備註:我們主要關心並且能夠在用戶端瀏覽器看得到的是三位數的狀態碼,不同的狀態碼代表不同的含義,其中
1xx | 表示HTTP請求已經接受,繼續處理請求 |
2xx | 表示HTTP請求已經處理完成 |
3xx | 表示把請求存取的URL重定向到其他目錄 |
4xx | 表示用戶端出現錯誤 |
5xx | 表示伺服器端出現錯誤 |
具體HTTP響應範例如下圖:
2.2 常見狀態碼的含義
200---OK/請求已經正常處理完畢
301---/請求永久重定向
302---/請求臨時重定向
304---/請求被重定向到用戶端本地快取
400---/用戶端請求存在語法錯誤
401---/用戶端請求沒有經過授權
403---/用戶端的請求被伺服器拒絕,一般為用戶端沒有存取許可權
404---/用戶端請求的URL在伺服器端不存在
500---/伺服器端永久錯誤
503---/伺服器端發生臨時錯誤
2.3 HTTP響應模型
伺服器收到HTTP請求之後,會有多種方法響應這個請求,下面是HTTP響應的四種模型:
單進程I/O模型
伺服器端開啟一個進程,一個進程僅能處理一個請求,並且對請求順序處理;
多進程I/O模型
伺服器端並行開啟多個進程,同樣的一個進程只能處理一個請求,這樣伺服器端就可以同時處理多個請求;
復用I/O模型
伺服器端開啟一個進程,但是呢,同時開啟多個執行緒,一個執行緒響應一個請求,同樣可以達到同時處理多個請求,執行緒間並行執行;
復用多執行緒I/O模型
伺服器端並行開啟多個進程,同時每個進程開啟多個執行緒,這樣伺服器端可以同時處理進程數M*每個進程的執行緒數N個請求。
三、HTTP報文格式
HTTP報文是HTTP應用程式之間傳輸的資料塊,HTTP報文分為HTTP請求報文和HTTP響應報文,但是無論哪種報文,他的整體格式是類似的,大致都是由起始、首部、主體三部分組成,起始說明報文的動作,首部說明報文的屬性,主體則是報文的資料。接下來具體說明。
3.1 HTTP請求報文
請求報文的起始由請求行構成(有些資料稱為狀態行,名字不一樣而已,都是指的一個東西),用來說明該請求想要做什麼,由<Method>、<URL>、<Version> 三個欄位組成,注意每個欄位之間都有一個空格。
其中<Method>欄位有不同的值:
GET --- 存取伺服器的資源
POST --- 向伺服器傳送要修改的資料
HEAD --- 獲取伺服器文件的首部
PUT --- 向伺服器上傳資源
DELETE--- 刪除伺服器的資源
<URL>欄位表示伺服器的資源目錄定位
<Version>欄位表示使用的http協定版本
首部部分由多個請求頭(也叫首部行)構成,那些首部欄位名有如下,不全:
Accept 指定用戶端能夠接收的內容格式型別
Accept-Language 指定用戶端能夠接受的語言型別
Accept-Ecoding 指定用戶端能夠接受的編碼型別
User-Agent 使用者代理,向伺服器說明自己的作業系統、瀏覽器等資訊
Connection 是否開啟持久連線(keepalive)
Host 伺服器域名
...
主體部分就是報文的具體資料。
3.2 HTTP響應報文
響應報文的起始由狀態行構成,用來說明伺服器做了什麼,由<Version>、<Status-Code>、<Phrase>三個欄位組成,同樣的每個欄位之間留有空格;
<Status-Code> 上邊已經說明;
首部由多個響應頭(也叫首部行)組成, 首部欄位名如下,不全:
Server 伺服器軟體名,Apache/Nginx
Date 伺服器發出響應報文的時間
Last-Modified 請求資源的最後的修改時間
...
主體部分是響應報文的具體資料。
四、HTTP協定版本更替
HTTP/0.9
HTTP協定的最初版本,功能簡陋,僅支援請求方式GET,並且僅能請求存取HTML格式的資源。
HTTP/1.0
在0.9版本上做了進步,增加了請求方式POST和HEAD;不再局限於0.9版本的HTML格式,根據Content-Type可以支援多種資料格式,即MIME多用途網際網路郵件擴充套件,例如text/html、image/jpeg等;同時也開始支援cache,就是當用戶端在規定時間內存取統一網站,直接存取cache即可。
但是1.0版本的工作方式是每次TCP連線只能傳送一個請求,當伺服器響應後就會關閉這次連線,下一個請求需要再次建立TCP連線,就是不支援keepalive。
HTTP/1.1
解決了1.0版本的keepalive問題,1.1版本加入了持久連線,一個TCP連線可以允許多個HTTP請求; 加入了管道機制,一個TCP連線同時允許多個請求同時傳送,增加了併行性;新增了請求方式PUT、PATCH、DELETE等。
但是還存在一些問題,伺服器端是按佇列順序處理請求的,假如一個請求處理時間很長,則會導致後邊的請求無法處理,這樣就造成了隊頭阻塞的問題;同時HTTP是無狀態的連線,因此每次請求都需要新增重複的欄位,降低了頻寬的利用率。
HTTP/2.0
為了解決1.1版本利用率不高的問題,提出了HTTP/2.0版本。增加雙工模式,即不僅用戶端能夠同時傳送多個請求,伺服器端也能同時處理多個請求,解決了隊頭堵塞的問題;HTTP請求和響應中,狀態行和請求/響應頭都是些資訊欄位,並沒有真正的資料,因此在2.0版本中將所有的資訊欄位建立一張表,為表中的每個欄位建立索引,用戶端和伺服器端共同使用這個表,他們之間就以索引號來表示資訊欄位,這樣就避免了1.0舊版本的重複繁瑣的欄位,並以壓縮的方式傳輸,提高利用率。
另外也增加伺服器推播的功能,即不經請求伺服器端主動向用戶端傳送資料。
當前主流的協定版本還是HTTP/1.1版本。
五、網站存取量
IP IP存取量
相同的公網IP計算一次,就是同一個區域網內的所有使用者存取一個網站,但是他們都是借助一個公網IP去存取那個網站的(NAT),因此這也只能算作一個IP存取量。換一次公網IP則會加1。
PV 網頁存取量
使用者存取的頁面數就是PV存取量,同一個區域網的不同使用者,而且就算是同一個使用者,只要重新整理一次網站頁面,PV存取量就加1,三個存取量的值往往數PV的值最大。
UV 訪客存取量
這裡的訪客不是使用者,而是電腦,一台電腦算一個訪客,即使是同一台電腦的不同使用者,存取同一個網站UV也只能加1,只有更換電腦才會使UV加1,因為伺服器端會記錄用戶端電腦的資訊。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址:https://www.linuxidc.com/Linux/2018-08/153439.htm
相關文章