Web填坑之路 --- http協議詳解

Http協議詳解

轉載自:http://blog.51cto.com/13570193/2108347

http --- hyper text transfer protocol,超文本傳輸協議,是一種建立在TCP上的無狀態連接,整個基本的工作流程是客戶端發送一個HTTP請求,說明客戶端想要訪問的資源和請求的動作,服務端收到請求之後,服務端開始處理請求,並根據請求做出相應的動作訪問服務器資源,最後通過發送HTTP響應把結果返回給客戶端。其中一個請求的開始到一個響應的結束成爲事務,當一個事務結束後還會在服務器端添加一條日誌條目。

1.http請求

  • http請求是客戶端往服務端發送請求動作,告知服務器自己的要求。
  • http請求由狀態行、請求頭、請求正文三部分組成:
    • 狀態行:包括請求方式Method、資源路徑URL、協議版本Version;
    • 請求頭:包括一些訪問的域名、用戶代理、Cookie等信息;
    • 請求正文:就是HTTP請求的數據。
    • (備註:請求方式Method一般有GET、POST、DELETE,含義分別是獲取、修改、上傳、刪除,其中GET方式僅僅爲獲取服務器資源,方式較爲簡單,因此在請求方式爲GET的HTTP請求數據中,請求正文部分可以省略,直接將想要獲取的資源添加到URL中。)
      下圖所示是GET的請求,沒有請求正文。(現在大多數協議版本爲http/1.1)
      在這裏插入圖片描述
      下圖展示爲POST請求的格式,有狀態行、請求頭、請求正文三部分:
      在這裏插入圖片描述

2.http響應

2.1 響應數據格式

服務器收到了客戶端發來的HTTP請求後,根據HTTP請求中的動作要求,服務端做出具體的動作,將結果迴應給客戶端,稱爲HTTP響應。
http響應由三部分組成:狀態行、響應頭、響應正文:

  • 狀態行: 包括協議版本Version、狀態碼Status Code、迴應短語;
  • 響應頭:包括搭建服務器的軟件,發送響應的時間,迴應數據的格式等信息;
  • 響應正文:就是響應的具體數據。
  • (備註:我們主要關心並且能夠在客戶端瀏覽器看到的是三位數的狀態碼,不同的狀態碼代表不同的含義,其中:)
1xx 表示HTTP請求已經接受,繼續處理請求
2xx 表示HTTP請求已經處理完成
3xx 表示把請求訪問的URL重定向到其他目錄
4xx 表示客戶端出現錯誤
5xx 表示服務端出現錯誤

2.2 常見狀態碼的含義

 - 200 --- OK/請求已經正常處理完畢
 - 301 --- /請求永久重定向
 - 302 --- /請求臨時重定向
 - 304 --- /請求被重定向到客戶端本地緩存
 - 400 --- /客戶端請求存在語法錯誤
 - 401 --- /客戶端請求沒有經過授權
 - 403 --- /客戶端的請求被服務器拒絕,一般爲客戶端沒有訪問權限
 - 404 --- /客戶端請求的URL在服務端不存在
 - 500 --- /服務端永久錯誤
 - 503 --- /服務端發生臨時錯誤

2.3 http響應模型

服務器收到HTTP請求之後,會有多種方法響應這個請求,下面是HTTP響應的四種模型:

1. 單進程I/O模型(服務端開啓一個進程,一個進程僅能處理一個請求,並且對請求順序處理)
2. 多進程I/O模型(服務端並行開啓多個進程,同樣的一個進程只能處理一個請求,這樣服務端可以同時處理多個請求)
3. 複用I/O模型(服務端開啓一個進程,但是,同時開啓多個線程,一個線程響應一個請求,同樣可以達到同時處理多個請求,線程間併發執行)
4. 複用多線程I/O模型(服務端並行開啓多個進程,同時每個進程開啓多個線程,這樣服務端可以同時處理進程數M*每個進程的線程數N個請求)

3. 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   請求資源的最後修改時間
 - ...

主體部分是響應報文的具體數據。


4. http協議版本更替

  1. http/0.9
    http協議的最初版本,功能簡陋,僅支持請求方式GET,並且僅能請求訪問html格式的資源

  2. http/1.0
    在0.9版本上做了進步,增加了請求方式POST和HEAD;不再侷限於0.9版本的HTML格式,根據Content-Type可以支持多種數據格式,即MIME多用途互聯網郵件擴展,例如text/html、image/jpeg等;同時也開始支持cache,就是當客戶端在規定時間內訪問統一網站,直接訪問cache即可。
    但是1.0版本的工作方式是每次TCP連接只能發送一個請求,當服務器響應後就會關閉這次連接,下一個請求需要再次建立TCP連接,就是不支持keepalive.

  3. http/1.1
    解決了1.0版本的keepalive問題,1.1版本加入了持久連接,一個TCP連接可以允許多個HTTP請求;加入了管道機制,一個TCP連接同時允許多個請求同時發送,增加了併發性;新增了請求方式PUT、PATCH、DELETE等。
    但是還存在一些問題,服務端是按照隊列順序處理請求的,加入一個請求處理時間很長,則會導致後面的請求無法處理,這樣就造成了隊頭阻塞的問題;同時HTTP是無狀態的連接,因此每次請求都需要添加重複的字段,降低了寬帶的利用率。

  4. http/2.0
    爲了解決1.1版本利用率不高的問題,提出了HTTP/2.0版本。增加雙工模式,即不僅客戶端能夠同時發送多個請求,服務端也能同時處理多個請求,解決了隊頭堵塞的問題;HTTP請求和響應中,狀態行和請求/響應頭都是些信息字段,並沒有真正的數據,因此在2.0版本中將所有的信息字段建立一張表,爲表中的每個字段建立索引,客戶端和服務端共同使用這個表,他們之間就以索引號表示信息字段,這樣就避免了1.0舊版本的重複繁瑣的字段,並以壓縮的方式傳輸,提高利用率。
    另外也增加了服務器推送的功能,即不經請求,服務端主動向客戶端發送數據。當前主流的協議版本還是HTTP/1.1版本。


5. 網站訪問量

  • IP(Internet Protocol) — IP訪問量
    相同的公網IP計算一次,就是同一個局域網內的所有用戶訪問一個網站,但是他們都是藉助一個公網IP去訪問那個網站的(NAT),因此這也只能算作一個IP訪問量。換一次公網IP則會加1。

  • PV(Page View) — 網頁訪問量
    用戶訪問的頁面數就是PV訪問量,同一個局域網的不同用戶,而且就算是同一個用戶,只要刷新一次網站頁面,PV訪問量就加1,三個訪問量的值往往數PV的值最大。

  • UV(Unique Visitor) — 訪客訪問量
    這裏的訪客不是用戶,而是電腦,一臺電腦算一個訪客,即使是同一臺電腦的不同用戶,訪問同一個網站UV也只能加1,只有更換電腦纔會使UV加1,因爲服務端會記錄客戶端電腦的信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章