HTTP 協議是一個非常重要的網路協議
,我們平時能夠使用瀏覽器瀏覽網頁,其中一個非常重要的條件就是HTTP 協議
。
0,什麼是網路協議
網際網路的目的是分享資訊,網路協議是網際網路的重要組成部分。
在網際網路誕生之前,計算機中的資訊是無法跨機器傳輸的。為了更方便的分享資訊,誕生了網際網路。
資訊能夠在不同的計算機之間快速傳輸,其基礎技術就是網路
。資訊的傳輸
,則涉及到資訊的傳送
與接收
,那我們就得知道如何傳送資訊
與如何接收資訊
。
協議
就是約定
,網路協議
就約定了資訊在網路之間是如何傳輸
的,即如何傳送
與如何接收
。
協議分層
網路協議不是一個協議,而是一堆協議。
網路是分層的,分層的好處是,層與層之間分工明確,互不干預。其可分為四層網路協議
或五層網路協議
或七層網路協議
,粗略一點可以分為四層,詳細一點則可以分為五層或七層。
每一層網路都有一組協議,被稱為協議簇
。
1,什麼是HTTP 協議
HTTP 全稱為HyperText Transfer Protocol
,即超文字傳輸協議
。從字面上理解,其作用就是傳輸超文字
。超文字
即超級文字
,它用超級連結
的方式,將網際網路中無數的文件連結在一起。
可以簡單的將超文字
理解為我們平時上網瀏覽的網頁
,所以可以認為HTTP 協議的作用就是傳輸
網頁。
2,HTTP 的發展歷史
HTTP 協議由英國電腦科學家蒂姆·伯納斯
於1989年在歐洲發起,蒂姆·伯納斯
作為HTTP 的發明者,對HTTP 的發展起到了至關重要的作用,他被稱為網際網路之父
。2017年,他因發明全球資訊網、第一個瀏覽器和使全球資訊網得以擴充套件的基本協議和演算法
而獲得2016年度的圖靈獎
。
HTTP 協議標準由W3C
和IETF
共同制定,最終釋出一系列的RFC
。
HTTP 協議重要的發展階段如下:
- 1989年,由
蒂姆·伯納斯
發起 - 1991年,釋出
HTTP/0.9
,這是HTTP 協議的第一個版本,也是最簡單的版本,只支援一個GET
方法,並且只能傳輸簡單的文字字串。 - 1996年,釋出
HTTP/1.0
,其內容大大增加,可傳輸影像
,視訊
,二進位制格式
等豐富的網頁。支援GET
,POST
,HEAD
三種方法,增加了HTTP Header
頭資訊,狀態碼
,內容編碼
等功能。 - 1997年,釋出
HTTP1.1
,是較為完整的版本。在之前的基礎上,其主要引入了持久連線
,分塊傳輸
等功能。另外,增加了OPTIONS
、PUT
、PATCH
、DELETE
、TRACE
和CONNECT
方法。對於客戶端,引入了重要的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
為請求方法,/
為URL
,HTTP1.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 種請求方法
,最常用的是GET
和POST
方法。
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
鍵,調出瀏覽器開發者工具
。
- 點選
Network
,可檢視網路請求 - 點選
某個請求
,可檢視該請求資訊 - 點選
Response Header
,可檢視響應頭內容 - 點選
Request Header
,可檢視請求頭資訊 - 點選
點選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 演算法
。其協議層結構如下:
(完。)