微信公眾號:碼農充電站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 算法
。其協議層結構如下:
(完。)
歡迎關注作者公眾號,獲取更過技術干貨。