
微信公眾號:碼農充電站pro
個人主頁:https://codeshellme.github.io
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 算法。其協議層結構如下:

(完。)
歡迎關注作者公眾號,獲取更過技術干貨。

