HTTP 協議圖解

碼農充電站發表於2020-05-02

在這裡插入圖片描述

HTTP 協議是一個非常重要的網路協議,我們平時能夠使用瀏覽器瀏覽網頁,其中一個非常重要的條件就是HTTP 協議

0,什麼是網路協議

在這裡插入圖片描述

網際網路的目的是分享資訊,網路協議是網際網路的重要組成部分。

在網際網路誕生之前,計算機中的資訊是無法跨機器傳輸的。為了更方便的分享資訊,誕生了網際網路。

資訊能夠在不同的計算機之間快速傳輸,其基礎技術就是網路。資訊的傳輸,則涉及到資訊的傳送接收,那我們就得知道如何傳送資訊如何接收資訊

協議就是約定網路協議就約定了資訊在網路之間是如何傳輸的,即如何傳送如何接收

協議分層

網路協議不是一個協議,而是一堆協議。

網路是分層的,分層的好處是,層與層之間分工明確,互不干預。其可分為四層網路協議五層網路協議七層網路協議,粗略一點可以分為四層,詳細一點則可以分為五層或七層。

每一層網路都有一組協議,被稱為協議簇

在這裡插入圖片描述

1,什麼是HTTP 協議

HTTP 全稱為HyperText Transfer Protocol,即超文字傳輸協議。從字面上理解,其作用就是傳輸超文字超文字超級文字,它用超級連結的方式,將網際網路中無數的文件連結在一起。

可以簡單的將超文字理解為我們平時上網瀏覽的網頁,所以可以認為HTTP 協議的作用就是傳輸網頁。

2,HTTP 的發展歷史

在這裡插入圖片描述

HTTP 協議由英國電腦科學家蒂姆·伯納斯於1989年在歐洲發起,蒂姆·伯納斯 作為HTTP 的發明者,對HTTP 的發展起到了至關重要的作用,他被稱為網際網路之父。2017年,他因發明全球資訊網、第一個瀏覽器和使全球資訊網得以擴充套件的基本協議和演算法而獲得2016年度的圖靈獎

HTTP 協議標準由W3CIETF 共同制定,最終釋出一系列的RFC

HTTP 協議重要的發展階段如下:

  • 1989年,由蒂姆·伯納斯 發起
  • 1991年,釋出HTTP/0.9,這是HTTP 協議的第一個版本,也是最簡單的版本,只支援一個GET 方法,並且只能傳輸簡單的文字字串。
  • 1996年,釋出HTTP/1.0,其內容大大增加,可傳輸影像視訊二進位制格式等豐富的網頁。支援GETPOSTHEAD 三種方法,增加了HTTP Header頭資訊,狀態碼內容編碼等功能。
  • 1997年,釋出HTTP1.1,是較為完整的版本。在之前的基礎上,其主要引入了持久連線分塊傳輸等功能。另外,增加了OPTIONSPUTPATCHDELETETRACECONNECT方法。對於客戶端,引入了重要的Host 頭部欄位,用來指定伺服器的域名,使得一個請求可以發往同一臺伺服器上的不同網站,為虛擬主機的流行打下基礎。
  • 2009年,谷歌公開了其自主研發的SPDY 協議,主要解決HTTP1.1 效率不高的問題。SPDY 協議的主要特性被引入了HTTP/2 中。
  • 2015年,釋出HTTP/2,而不是HTTP/2.0,是因為標準委員會不打算再發布子版本,下一個新版本將直接是 HTTP/3
年份 事件
1989年 蒂姆·伯納斯 發起
1991年 釋出HTTP/0.9
1996年 釋出HTTP/1.0
1997年 釋出HTTP/1.1
2009年 谷歌公佈SPDY
2015年 釋出HTTP/2

3,HTTP 所在的網路層次

HTTP 協議建立在Tcp/Ip 協議之上,HTTP 屬於應用層協議。其協議層結構如下:

在這裡插入圖片描述

4,HTTP 請求與響應

HTTP 協議是一個請求-響應式協議,一般由客戶端(比如瀏覽器)向服務端發起,服務端處理後,再向客戶端返回資訊。

客戶端發出的訊息稱為HTTP 請求Request),服務端返回的訊息稱為HTTP 響應Response)。

在這裡插入圖片描述

每種協議都有它的訊息結構,有了訊息結構,傳送方就知道以怎樣的結構傳送訊息,接收方就知道以怎樣的結構接收訊息。下面介紹HTTP 訊息結構。

5,HTTP 請求訊息結構

在這裡插入圖片描述
由上圖可看出,HTTP 請求由四部分組成:

  • 請求行:分別是請求方法+空格+URL+空格+協議版本+\r\n
  • 請求頭部:由多個請求頭部鍵值對組成,中間以冒號:隔開,每個鍵值對最後是\r\n
  • 空行:即\r\n
  • 請求包體:包體部分

例子:

GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*

其中:

  • 第1行是請求行GET 為請求方法,/URLHTTP1.0 為協議版本,中間以空格隔開。
  • 第2行與第3行是請求頭
  • 請求頭下面的空行,這裡沒有顯示。
  • 一般GET 請求不包含請求體,所以本請求中沒有請求體。

6,HTTP 請求響應結構

在這裡插入圖片描述

由上圖可看出,HTTP 響應由四部分組成:

  • 狀態行:分別是協議版本+空格+狀態碼+空格+狀態碼描述+\r\n
  • 響應頭部:由多個響應頭部鍵值對組成,中間以冒號:隔開,每個鍵值對最後是\r\n
  • 空行:即\r\n
  • 響應包體:包體部分

例子:

HTTP/1.0 200 OK 
Content-Type: text/plain
Content-Length: 82
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84

<html>
  <body>Hello HTTP</body>
</html>

其中:

  • 第1行為響應狀態行HTTP/1.0 為協議版本,200 是響應狀態碼OK狀態碼描述,中間用空格隔開。
  • 第2行到第6行為響應頭
  • 第7行為空行
  • 第8行到第10行為響應內容

7,HTTP 請求方法

HTTP 協議支援9 種請求方法,最常用的是GETPOST 方法。

HTTP 方法 含義
GET 獲取指定頁面資訊
HEAD 類似GET 請求,但響應中沒有具體內容,只有響應Header
POST 向指定URL 提交資訊
PUT 向伺服器傳送資料
DELETE 請求伺服器刪除指定內容
OPTIONS 檢視伺服器資訊
TRACE 回顯伺服器收到的請求,主要用於測試或診斷
PATCH 是對PUT 方法的補充,用來對已知資源進行區域性更新
CONNECT HTTP/1.1 協議中預留給能夠將連線改為管道方式的代理伺服器

8,HTTP GET 與POST 方法

GET 方法POST 方法是最常用的兩個HTTP 方法,來看下其異同點:

  • 請求內容存放位置不同:GET 方法一般沒有請求體,其請求內容放在URL 引數中,POST 方法則將請求內容放在請求體中。
  • POST 方法 安全性更高:GET 請求一般是明文傳輸,不利於傳輸敏感資料。POST 請求內容在請求體中,更方便加密,提高安全性。
  • POST 方法傳輸的資料量更大:GET 請求內容在URL 中,因此有大小限制,而POST 請求 內容在請求體中,理論上沒有大小限制。

9,HTTP 請求頭欄位

這裡介紹一些常用的HTTP 請求頭欄位:

Host:客戶端端請求的域名。

Connection:告訴服務端,處理完本請求後,是否關閉連線。

User-Agent:客戶端使用的瀏覽器或APP 型別/版本。

Accept:客戶端支援哪些型別的文件。

Accept-Encoding :客戶端支援的編碼型別。

Accept-Language :客戶端支援的語言型別。

Referer :客戶端從哪個網頁過來的。

Cache-Control:指定快取機制。

10,HTTP 響應頭欄位

這裡介紹一些常用的HTTP 響應頭欄位:

Allow:表明伺服器支援哪些請求方法,如GET,POST 等。

Content-Encoding:響應內容編碼方法。

Content-Type:響應內容屬於什麼MIME 型別。

Content-Length:響應內容的長度。

Date:當前GMT 時間。

Expiress:響應內容過期時間,過期後將不再快取內容。

Last-Modified:文件的最後改動時間。

Location:告訴客戶端到哪裡獲取文件,一般用於重定向。

Refresh:瀏覽器在多少秒後重新整理文件。

Server:伺服器名字。

Set-Cookie:設定和頁面關聯的Cookie。

Date:表示訊息傳送時間。

11,HTTP 響應狀態碼

伺服器在向客戶端返回內容時,會帶有一個HTTP Status Code(狀態碼),用於告訴客戶端的返回狀態。

HTTP 狀態碼分為5 種型別,由三個十進位制數字組成。第一個數字(1-5)代表狀態碼的分類,後兩位是其含義。

狀態碼型別 含義
1xx 表明伺服器已經收到請求
2xx 表明伺服器已經成功接收並處理請求
3xx 表明請求的資源已重定向到其它地方
4xx 表明客戶端的請求有錯誤
5xx 表明服務端出現錯誤

常見狀態碼:

常見狀態碼 狀態碼描述 含義
100 Continue 客戶端應繼續其請求
200 OK 請求成功,一般用於GET與POST請求
301 Moved Permanently 請求的資源已被永久重定向到新地址
302 Found 請求的資源已被臨時重定向到新地址
304 Not Modified 客戶端訪問的內容未修改,應從快取中獲取內容
400 Bad Request 客戶端的請求有誤
401 Unauthorized 請求要求客戶端進行身份認證
403 Forbidden 伺服器拒絕客戶端訪問
404 Not Found 客戶端請求的資源,服務端不存在
405 Method Not Allowed 客戶端請求中的方法被禁止
500 Internal Server Error 伺服器內部錯誤
501 Not Implemented 伺服器不支援該請求
503 Service Unavailable 伺服器過載,暫時不可用
505 HTTP Version not supported 客戶端使用的HTTP版本,服務端不支援

12,用瀏覽器演示HTTP

下面通過一個例子實際感受以下HTTP 協議。

在瀏覽器(我這裡用的是Chrome)中訪問新浪網https://www.sina.com.cn/,通過F12鍵,調出瀏覽器開發者工具

在這裡插入圖片描述

  1. 點選Network,可檢視網路請求
  2. 點選某個請求,可檢視該請求資訊
  3. 點選Response Header,可檢視響應頭內容
  4. 點選Request Header,可檢視請求頭資訊
  5. 點選點選Response,可檢視響應內容

13,用curl 命令演示HTTP

curl 命令可以傳送HTTP(S) 協議,這裡curl 命令的常用方法。

我們使用 curl -v 引數 來顯示詳細的HTTP 協議包資訊:

在這裡插入圖片描述

14,什麼是HTTP/2

HTTP/2 可看作是HTTP1.x 的增強版,其主要解決HTTP1.x 的效率等問題,其訊息結構也已經發生了改變。

我們來訪問https://http2.akamai.com/demo,來感受下HTTP2的速度。HTTP/1.1 耗時15 秒多,HTTP/2耗時6 秒多。

在這裡插入圖片描述

HTTP2 有如下特點:

  • HTTP2 是一個徹底的二進位制協議,所有資訊以二進位制格式傳輸。
  • HTTP2 支援多工(Multiplexing),在一個TCP 連結中可同時處理多個HTTP 請求。
  • HTTP2 中的資料流不是按照順序傳送的,是亂序的。
  • HTTP2 支援頭資訊壓縮
  • HTTP2 支援服務端主動向客戶端傳送資訊。

15,什麼是HTTPS

在這裡插入圖片描述

HTTPS 中的S 是指Security,即是安全的意思,所以HTTPS 就是安全的HTTP

HTTPS 在HTTP 協議的基礎上加入了一層SSL/TLS,用於對HTTP 資訊加密,其加密採用非對稱加密演算法RSA 演算法。其協議層結構如下:

在這裡插入圖片描述

(完。)

相關文章