HTTP協議分析
一、引言
當我們想要訪問一個網頁時,在瀏覽器中輸入對應的網址(例如訪問www.baidu.com),就可以看到我們想要是訪問的頁面,那麼這個背後到底是怎麼實現的呢?作爲普通的上網者不會去關注實現的過程,但是作爲一個運維人員或從事互聯網相關崗位的人員,需要清晰的掌握是其背後實現的過程
二、什麼是http協議
http協議www(萬維網,簡稱web)應用 b/s結構 (browser/server) 瀏覽器/服務器架構
HTTP協議誕生發展到現在已經經歷了若干版本,其中最主要的版本爲HTTP/1.0,HTTP1.1, http1.0是第一個得到廣泛使用的版本,http1.1爲當前使用的主流版本
HTTP/0.9簡介
http0.9版本現在已經過時了,它的組成很簡單,只允許客戶端發送GET這一種請求,而且還不支持請求頭。由於沒有協議頭,造成了http 0.9協議只支持一種內容,即純文本。不過網頁仍然支持用HTML語言。僅於用戶傳輸html文檔,因爲網絡的快速的發展已經不是當初的看個網頁就能滿足日常需求,會有視頻,圖片等來增加情調,所以就出現了升級版本
HTTP/1.0簡介
-
HTTP/1.0是第一個得到廣泛使用的http版本,http/1.0在http/0.9的基礎上增加了HTTP請求頭,可支持更多的請求方法,並且能夠對多媒體對象進行處理(如圖像,視頻)。http/1.0 規定瀏覽器與服務器只保持短暫的連接,瀏覽器的每次請求都需要與服務器建立TCP連接,服務器完成請求處理後斷開TCP連接,服務器不跟蹤每個客戶,也不記錄過去的請求
-
1)引入了MIME((Multipurpose Internet Mail Extesions)機制:是多用途互聯網郵件擴展,引入這個技術之後,http可以發送多媒體(比如視頻 、音頻等)信息。此機制讓http不在單單隻支持html格式,還可以支持其他格式來進行發送了。
-
2)引入了keep-alive機制,支持持久連接的功能(但這個keep-alive原理是在首部添加了某個字段而形成的,並非原生就支持此功能)
-
3)引入支持緩存功能
HTTP/1.1簡介
- http/1.1的重點是修復http設計中的缺陷,從可擴展性、緩存處理、帶寬優化、持久連接、host頭(講解web虛擬主機)、錯誤通知、消息傳遞、內容協商等多個方面都做了相關的改進,http/1.1是當前互聯網主流的http版本
在連接方面http/1.1支持持久連接,在一個tcp連接上可以傳送多個http請求和響應,減少了簡歷和關閉連接的消耗和時間延遲 - 在請求頭方面,http/1.1增加了更多的請求頭和響應信息,用來增強http功能,例如host主機頭功能,可以讓web瀏覽器使用主機頭來明確表示要訪問服務器的哪個web站點,這樣就可以使用web服務器在同一個IP地址和端口號上配置多個虛擬web站點
- http/1.1.的持久連接,也需要增加新的請求頭來幫助實現,例如connection請求頭的值爲keep-alive時,表示客戶端通知服務器返回本次請求結果後保持連接,connection請求頭的值爲close時,表示客戶端通知服務器返回本次請求結果後關閉連接,http/1.1還提供了身份認證和狀態管理和cache緩存機制相關的請求頭和響應頭等
三、WEB頁面資源類型
1、Html文本結構
<html>
<head> -->設置文檔頭部
<title> TITLE </title> -->設置文檔標題
</head>
<body> -->網頁文件內容
<h1>H1</h1> -->一號標題 (最大的標題)
<p></p> -->創建一個段落
<h2>H2</h2> -->二號標題
<p><a href="admin.html">ToGoogle</a> </p> -->創建超鏈接
</body>
</html>
靜態頁面的特點
- 開發者編寫的是什麼,他就顯示的就是什麼,一旦編寫完成,就不會有任何改變,靜態頁面的維護和更新相對比較麻煩,靜態頁面一遍適用於更新較少的宣傳展示網站
1、靜態頁面的特徵
-
1)每個頁面都有一個固定url地址,且url一般以html等形式爲後綴,而且地址中不含有?或&特殊符號
2)網頁內容發佈到網站服務器上,無論是否有用戶訪問,每個頁面的內容都是保存在網站服務器文件系統上,也就是說靜態網頁是實實在在存在服務器上的文件,每個網頁都有一個獨立的文件
3)網頁內容固定不變的,因此,容易被搜索引擎收錄(優點)
4)當網站信息量很大時完全依靠靜態網頁比較困難(缺點)
5)網頁的交互性差,在程序和功能實現方面有很大的限制(缺點)
6)能夠接受更多的併發訪問量
2、 靜態頁面的處理過程
3、靜態頁面常見的擴展名
-
純文本文件: .html .htm .xml .shtml .js .css等
-
圖片類文件或數據文檔: .jpg .gif .png .bmp .txt .doc .ppt等
-
視頻類流媒體文件: .mp4 .swf .avi .wmv .flv等
動態頁面的特點:
-
1)動態網頁的url後綴是.php .jsp .asp .netd並且一遍在動態網頁網址中會有標誌性的符號?&,在大多數情況下後端都需要數據庫支持,服務器上有相應的解析程序來運行動態網頁
-
2)動態網頁可以實現更多的功能(用戶註冊、登錄、在線調查、訂單管理等)
-
3) 動態網頁並不是獨立存在與服務器上的網頁文件,當用戶請求服務器上的動態程序時,服務器解析這些程序並可能通過讀數據庫來返回一個完整的網頁內容,例如每個用戶的登錄賬號密碼
-
4)動態網頁中的?在搜索引擎的收錄方面存在一定的問題,搜索引擎一般不會從一個網站的數據庫訪問全部頁面,或者處於技術方面的考慮,所有蜘蛛一般不會抓取網址中?後面的內容,因此在企業通過搜索引擎進行推廣時,需要針對採用動態網頁的網站做一定的技術處理(僞靜態技術),一遍適應搜索引擎的抓取要求
如果用戶請求的是動態內容,那麼此時http服務器會調用後端服務器,由動態語言去處理用戶的請求,如果需要請求數據的時候,會向內核申請調用,從而向磁盤 中獲取用戶指定的數據,通過解釋器運行,運行的結果通常會生成 html 格式的文件。然後 構建成響應報文,最終發回給客戶端
動態頁面實現的過程
靜態頁面和動態頁面的區別舉例
- 靜態頁面相當於你去餐廳吃火鍋,材料什麼都準備好了,你只需要自己動手去完成想要的結果,靜態頁面的響應速度比較快,消耗cpu資源少,能夠承載高併發
- 動態頁面相當與你去餐廳吃炒菜,首先會給你一個菜單,根據自己的需求選擇你要訪問內容,這個過程中需要與後端的廚師進行交互,這個過程中會消耗後端服務器的資源,cpu需要處理自己的請求
四、HTTP協議的報文
-
HTTP 報文中存在着很多行的內容,一般是由 ASCII 碼串組成,各字段長度是不確定的。HTTP 的報文可分爲兩種:請求報文與響應報文
-
request Message(請求報文)
客戶端 -→ 服務器端
由客戶端向服務器端發出請求,不同的網站用於請求不同的資源(html 文檔) -
response Message(響應報文)
服務器端 -→ 客戶端 是服務器予以響應客戶端的請求1、HTTP請求報文格式
-
HTTP請求報文大致分爲四部分:請求行+請求首部+空白行+請求實體
method 表示請求的方式,常見的方式有get、head、post、put等
-
Get:客戶端向服務器發送請求資源信息,並返回資源信息,通常是可以緩存相當於你問別人借東西,別人需要將東西借給你,你需要得到具體的資源
Head:跟get方法類似,但不需要服務器響應請求資源,而返回頭部響應首部
相當於你問別人借東西,別人只需要告訴你有或者沒有,有的話會告訴你有什麼類型的,而不是將他的東西借給你,Post: 基於html頁面將數據發送給服務器,服務器通常需要存儲提交的數據,通常存放在mysql這種關係型數據庫中
Put:與get方式相反,向服務器發送資源,服務器通常需要存儲此資源(存放位置通常是文件系統)
request-url請求的是那個資源,這裏是相對路徑,如/images /index.html等
- URL:URL(統一資源定位符),對可以從互聯網上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯網上標準資源的地址,互聯網上的每個文件都有一個唯一的url,它包含的信息指出文件的位置以及瀏覽器怎麼處理它,與我們的地址原理相同,如/北京市/昌平區/昌平縣城/商業街xx號
version:http使用的版本號 一般表示爲HTTP/1.1 HTTP/1.0
請求首部:請求首部包含多個信息
Client-IP:客戶端IP地址
Host:請求主機,可以基於域名或者IP
Referer:指明瞭請求當前資源原始資源的url,使用referer可以防盜鏈
User-Agent:用戶代理,一般而言是瀏覽器
Accept首部:指客戶端可以接受那些編碼的類型
Accept:服務端能夠發送的媒體的類型
Accept-Charset:接受的字符集
Accept-Encoding:支持壓縮的壓縮格式
Accept-Lanage:所能接受的語言編碼格式
條件式請求首部:(在http1.1纔會使用到)
當發送請求時,先問問對方是否滿足條件,如果滿足條件就請求,不滿足就不請求
跟安全相關的請求:
Authorization
Cookie
Upgrade-Insecure-Requests:升級不安全的請求
Cookie,有時也用其複數形式 Cookies,指某些網站爲了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端上的數據(通常經過加密) -
1、HTTP響應報文格式
起始行包括:
version:表示http的版本 status:狀態碼 reason-phrase 狀態碼的信息
常見狀態碼
狀態嗎 說明 200 服務器成功返回網頁,這是成功的 HTTP 請求返回的標準狀 201 CREATED 上傳文件成功後顯示 301 Move Permanently,永久重定向,會返回一個新地址,並告訴我們你所請求的地址將永久挪到那個新地址去了 302 Fonud,臨時重定向,臨時放到某個地方,會在響應報文中使用“Location:新位置” 304 Not Modified,資源沒有做任何 403 Forbidden 請求被拒絕 404 Not Found 請求的資源不存在 405 Method Not Allowed 你使用的方法不被允許,不支持 500 Internal Server Error:服務器內部錯誤 502 Bad Gateway,代理服務器從上游服務器收到一條僞響應;上一層服務器返回了一個無法理解的報文,所以代理服務器就會表示錯 503 Service Unavailable,服務暫時不可用 HTTP響應報文格式
響應首部介紹
Accept-Ranges 服務器支持的請求:字節
Cache-Control:緩存類型
No-cache 代表不緩存過期資源,緩存會向源服務器進行有效確認、
No-store 代表不進行任何緩存
Proxy-revalidata 表示共享緩存,如果已經本地已經有緩存,還要去檢查是否有改變
No-transform 不得對資源進行轉換或轉變
Private 用緩存的內容迴應先訪問該資源的用戶
Connection 持久連接 http/1.1中採用的協議
Content-Length 傳輸長度
Content-Type 服務器發送或接受的mime類型
DATE:當前的gmt時間,表示消息發出的時間,相差8個小時
Last-Modified 需要和expires結合使用,用來控制請求文件的有效時間,當請求的資源子有效時間,從本地緩存中獲取數據,當有效時間過期後才從服務器更新數據
Pragma 表示是否緩存
Servre 服務器web服務的版本
Etag 在網絡上有一些緩存服務器,另外,瀏覽器自身也有緩存功能
基於一個前提:圖片不會經常改動,服務器在返回狀態碼時200同時在etag中添加一個標籤,當瀏覽器再次訪問該圖片的時,就會去服務器校驗這個值,如果圖片沒有變化的時,直接使用緩存裏面的值,這樣可以減輕服務器的負擔,有加快了訪問速度 -
Cookie流程
HTTP事務
- 包含了一個 HTTP 請求,和對應請求的響應就叫做一個 http 事務,也可以理解 http 事務就是 一個完整的 HTTP 請求和 HTTP 響應的過程。 http 協議默認情況下每個事務都會打開和關閉一個新的連接,所以會相當耗費時間和帶寬, 由於 TCP 慢啓動特性,所以每條新的連接的性能本身就會有所降低,所以可打開的並行連接 的數量上限是有限的。所以使用持久連接這種模式比默認情況下不使用持久連接的方式會好 一點,他的好處表現在其請求和 tcp 斷開的過程所消耗的時間會被減少。
五、HTTP資源類型
-
HTTP 資源 資源就是通過 HTTP 協議可以讓用戶通過瀏覽器或用戶代理能夠通過基於 http 協議向服務器 端請求並獲取的內容,像 html 文檔,一張圖片等等。 資源類型:是通過 MIME 進行標記 格式:major/minor 主標記和次標記
常見的MIME類型
MIME類型 文件類型 test/html html、htm 文本 text/plain text 文本類型 image/jpeg jpeg 圖像 image/gif gif 圖像類型 vedio/mpeg4 音頻標記類型 application/vnd.ms-powerpointt 動態資源的標記 URI和URL介紹
-
URI(Uniform Resource Identifier) 同一資源標示符
用於標識某一互聯網資源名稱的字符串,通過這種標識來允許你用戶對資源可通
過特定的協議進行交互操作。在 Web 上可用的每種資源,包括 HTML 文檔、圖
像、視頻片段、程序等, 由一個通用資源標識符進行定位。所以我們可以使用
URI 來標識每個資源的名稱 -
URL(Uniform Resource Locator)(統一資源定位符)
用於描述一個特定服務器上某資源的特定位置。
例如:http://www.baidu.com:80/download/bash-4.3.1-1.rpmURL 的格式分爲三個部分
i. scheme(方案)(也叫協議):http://
ii. Internet 地址:一般這個地址指的是服務器:www.baidu.com:8080
iii. 特定服務器上的資源:download/bash-4.3.1-1.rpm
客戶端請求web頁面的具體過程
-
- 客戶端在 Web 瀏覽器輸入需要訪問的地址
- Web 瀏覽器會請求 DNS 服務器,查詢解析到指定域名和 Web 服務器的地址
- 客戶端與請求的 Web 服務器端建立連接(TCP 三次握手)
- TCP 建立成功之後,發起 HTTP 請求
- 服務器端收到客戶端 HTTP 請求之後,會處理該請求
- 處理客戶端指定請求的資源
- 服務器構建響應報文,響應給客戶端
- 服務器端將此信息記錄到日誌中
六、通過瀏覽器查看http協議報文內容
通常瀏覽器緩存調用的過程爲
抓包之前我們要清除瀏覽器緩存,打開瀏覽器按F12(瀏覽器推薦使用Chrome或者Firefox)打開開發者工具,點擊Network選擇All
選擇要訪問的網站,在瀏覽器輸入上方輸入http://www.baidu.com 就可以獲取到百度服務器的報文信息,點擊查看百度的index.html頁面報文信息
Request URL: https://www.baidu.com/ | 請求web服務器地址 |
---|---|
Request Method: GET | 請求的方式 |
Status Code: 200 OK | 請求的狀態碼和狀態的簡略信息 |
Remote Address: 220.181.38.150:443 | 響應服務器IP地址 |
Referrer Policy: no-referrer-when-downgrade | 直接訪問百度頁面 |
##########http響應報文#######
Bdpagetype: 1 | 將http請求升級爲https請求 |
---|---|
Bdqid: 0xde48f6750039cdbc | 連接的id號 |
Cache-Control: private | 緩存的類型公共緩存 |
Connection: Keep-Alive | 連接狀態爲持久連接 |
Content-Encoding: gzip | 頁面的壓縮類型爲gzip壓縮 |
Content-Type: text/html | 頁面類型 html |
Cxy_all: baidu+8577a22a8d60ff4ce2564ad56a4593d0 | 連接時產生的id號 |
Date: Tue, 30 Jul 2019 09:22:02 GMT | 響應時間,與北京時間相差8小時 |
Expires: Tue, 30 Jul 2019 09:21:55 GMT | |
P3p: CP=" OTI DSP COR IVA OUR IND COM " | 使用協議類型 |
Server: BWS/1.1 | 服務提供商和版本號 |
Set-Cookie: | 跟安全相關的設置 |
Transfer-Encoding: chunked | 分塊傳輸 |
Vary: Accept-Encoding | 告訴瀏覽器或者代理服務器當前頁面時壓縮過的 |
X-Ua-Compatible: IE=Edge,chrome=1 | 採用ie引擎的渲染 |
#########http請求報文##########
Accept: | 客戶端接收的類型,默認瀏覽器會接收所有類型 |
---|---|
Accept-Encoding: gzip, deflate, br | 客戶端接受的壓縮類型 |
Accept-Language: zh-CN,zh;q=0.9 | 客戶端接受的語言編碼 |
Connection: keep-alive | 持久連接 |
Cookie: | 跟安全相關 |
Host: www.baidu.com | 請求的web頁面地址 |
Upgrade-Insecure-Requests: 1 | 在進行訪問時將http升級爲https |
User-Agent: | 客戶端通過什麼程序來進行訪問的,通常爲瀏覽器類型 |