首頁 > 軟體

關於HTTP協定深入理解

2020-06-16 16:49:25

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


IT145.com E-mail:sddin#qq.com