天天看點

http協定分析

部落客QQ:819594300

有什麼疑問的朋友可以聯系部落客,部落客會幫你們解答,謝謝支援!

http協定介紹

http:HyperText Transfer Protocol 超文本傳輸協定,是網際網路應用最為廣泛的一種網絡協定,主要用于Web服務。通過計算機處理文本資訊,格式為HTML(Hyper Text Mark Language)超文本标記語言來實作。

http協定的版本

http 0.9:僅于使用者傳輸html文檔

http 1.0

引入了MIME(MultipurposeInternet Mail Extesions)機制:多用途網際網路郵件擴充,引入這個技術之後,http可以發送多媒體(比如視訊、音頻等)資訊。此機制讓http不在單單隻支援html格式,還可以支援其他格式來進行發送了。

引入了keep-alive機制,支援持久連接配接的功能(但這個keep-alive原理是在首部添加了某個字段而形成的,并非原生就支援此功能)

解釋:什麼叫keep-alive?

答:就是保持長連接配接。當用戶端與web服務端建立連接配接後,用戶端可以利用已建立的連接配接,可以發送多個http請求,不用每次請求都需要先建立依次連接配接。這就相當于A和B雙方打電話,A給B打電話,撥通一次B的電話号碼,就可以和B說很多的話,而不是說一句話就挂斷一次,然後A再一次撥通B的号碼再和B說一句話,再挂斷,再撥通,再說一句話,這樣反反複複的撥通挂斷,這樣的通話效率很低,又浪費電話費。Keep-alive就相當于當用戶端和服務端連接配接一次就可以保持長時間的請求和回應。

引入支援緩存功能

http 1.1

支援更多的請求方法(比如:get、post等請求方式,本博文後面會詳細說明請求方法);

更加精細的緩存控制,原生直接支援持久連接配接功能(presistent)(http1.0該功能是非原生)。

http 2.0

提供了HTTP語義優化的傳輸,spdy: google引入了的一個技術,能夠加速http資料互動,尤其是使用ssl 加速機制,但是spdy現在用的還不多。

目前常用的版本就是http 1.1版本,其次是http1.0版本,還需要說明的是,下一個版本會包含上一個版本的全部功能。

html文本架構

<a href="https://s4.51cto.com/wyfs02/M00/92/EC/wKiom1kFTJGA4qDcAADsA-S2dSM958.jpg" target="_blank"></a>

html文檔的生成方式

靜态

就是用html事先就編輯并定義完成的

動态

通過編譯語言編寫的程式和代碼,然後用戶端發送動态網頁請求,則服務端就會執行編寫的代碼和程式,把執行後的結果以html格式輸出到用戶端的螢幕。

動态語言有:php,jsp,asp,.net

備注:這些腳本都必須有相應的解釋器,比如說 php需要有php解釋器等等

靜态和動态的方式

靜态:

<a href="https://s5.51cto.com/wyfs02/M00/92/EA/wKioL1kFTJLBujmUAAFGffILZrU189.jpg" target="_blank"></a>

過程如下:

1、Web伺服器向核心注冊socket

解釋:什麼是socker

     答:是程序套接字。當http服務啟動後,http服務會自動向核心注冊socket套接字程序,用于監聽來通路的用戶端的IP位址和http服務端的80端口(預設),當有用戶端發來通路請求時,socket會重新封裝用戶端的請求給http服務。

2、用戶端通過浏覽器,向Web伺服器發起request請求

3、Web伺服器收到用戶端的request資訊

4、如果使用者請求的資源在伺服器本地的話,http服務會向系統核心申請調用

5、核心調用本地磁盤裡的資料,并将資料發給http服務

6、http将使用者請求的資源通過response封包,最終響應給用戶端

動态:

<a href="https://s5.51cto.com/wyfs02/M01/92/EC/wKiom1kFTJKypDJzAAEqCaivSg4154.jpg" target="_blank"></a>

與靜态不同的是,如果使用者請求的是動态内容,那麼此時http服務會調用後端的解析器,由動态語言去處理使用者的請求,如果需要請求資料的時候,會向核心申請調用,進而向磁盤中擷取使用者指定的資料,通過解釋器運作,運作的結果通常會生成html格式的檔案。然後建構成響應封包,最終發回給用戶端。

http協定的封包

說明:HTTP封包中存在着很多行的内容,一般是由ASCII碼串組成,各字段長度是不确定的。

HTTP的封包可分為兩種:請求封包與響應封包

1.request Message(請求封包)

用戶端  →  伺服器端

由用戶端向伺服器端送出請求,不同的網站用于請求不同的資源(html文檔)

2.response Message(響應封包)

伺服器端 → 用戶端

是伺服器予以響應用戶端的請求

請求封包格式介紹

格式:請求行 + 請求首部 + 空白行 + 請求實體

<a href="https://s5.51cto.com/wyfs02/M01/92/EA/wKioL1kFTJKi8HS3AAE8RJ3MihA291.jpg" target="_blank"></a>

<a href="https://s4.51cto.com/wyfs02/M00/92/EA/wKioL1kFTJOBpZyyAADCSscAlOY324.jpg" target="_blank"></a>

下面分别來介紹請求行、請求首部、空白行、請求實體

1.請求行

說明:由請求方法字段&lt;method&gt;+請求URL字段&lt;request-URL&gt;+HTTP協定版本&lt;version&gt;組成。

用來辨別用戶端請求的資源時使用的請求方法,請求的資源,請求的協定版本是什麼,它們直接使用“空格”進行分隔!

eg:  GET   /    HTTP1.1 \r\n

(“/“就是請求的是http服務端的首頁)

<a href="https://s4.51cto.com/wyfs02/M02/92/EC/wKiom1kFTJODyqyKAAGa53RqMcE094.jpg" target="_blank"></a>

<a href="https://s5.51cto.com/wyfs02/M02/92/EA/wKioL1kFTJTTTDYJAAJxIKP7AhM827.jpg" target="_blank"></a>

說明:上圖是用wireshark工具抓取http請求封包的顯示結果。在首部後的“\r\n”表示一個回車和換行,以此将該首部與下一個首部隔開。

或者用curl指令擷取http請求封包。

<a href="https://s5.51cto.com/wyfs02/M00/92/EC/wKiom1kFTJSio_1iAAD2oZlCNz8204.jpg" target="_blank"></a>

2.請求首部

由關鍵字+關鍵字的值組成,之間使用“:”進行分隔,

格式Name:Value,請求首部的作用是通過用戶端将請求的相關内容告知伺服器端,首部可以不止一個。

<a href="https://s5.51cto.com/wyfs02/M01/92/EC/wKiom1kFTJXwgmyYAABR9nBpXms970.jpg" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M01/92/EA/wKioL1kFTJXzJaL9AAKjKBqzLeo621.jpg" target="_blank"></a>

Host:後面跟的是用戶端請求的服務端的域名

Connection:後面跟的是keep-alive,意思是用戶端請求和服務端建立長連接配接。長連接配接建立成功與否,取決于兩個方面,第一個是服務端的http服務是否開啟了長連接配接功能,第二個是http版本是否支援。

Uggrade-Insecure-Requests:1表示用戶端告訴伺服器,浏覽器可以處理https協定,即發送非安全請求(http請求是非安全請求,https請求是安全請求)

User-Agent:是用戶端的浏覽器的資訊(就是浏覽器是哪種浏覽器和版本号等資訊)

Accept:是用戶端請求的資源的類型

Accept-Encoding:表示用戶端支援服務端對用戶端進行壓縮傳以及類型

Accept-Language:表示用戶端支援的HTML語言

3.空白行

請求首部之後會有一個空白行,通過發送回車字元和換行符。

用于通知伺服器端以下的内容将不會再出現請求首部的資訊。

4.請求實體

你需要請求的内容到底是什麼

<a href="https://s1.51cto.com/wyfs02/M02/92/EC/wKiom1kFTJWRqKZSAAA-uQq2Zgk314.jpg" target="_blank"></a>

<a href="https://s4.51cto.com/wyfs02/M02/92/EA/wKioL1kFTJbRv_2qAAIjh_Q_aAQ857.jpg" target="_blank"></a>

響應封包格式介紹

格式:起始行 + 響應首部 + 空白行 +  響應實體

<a href="https://s4.51cto.com/wyfs02/M00/92/EA/wKioL1kFTJbD29iTAAE4Q5N0d10335.jpg" target="_blank"></a>

<a href="https://s4.51cto.com/wyfs02/M00/92/EC/wKiom1kFTJaQ34jWAADF6pfesRs376.jpg" target="_blank"></a>

下面分别介紹起始行、響應首部、空白行、響應實體

1.起始行

說明:也稱之為狀态行,用于伺服器端響應用戶端請求的狀态資訊,由版本号&lt;version&gt; + 狀态碼&lt;status&gt; + 原因短語&lt;reason-phrase&gt;組成,例如“ HTTP/1.1 200 OK”,另外還有404表示請求的網頁不存在。

<a href="https://s2.51cto.com/wyfs02/M01/92/EC/wKiom1kFTJejrC7iAAFkEDmo5ss150.jpg" target="_blank"></a>

<a href="https://s2.51cto.com/wyfs02/M00/92/EA/wKioL1kFTJjippK_AALaCGzi8fw788.jpg" target="_blank"></a>

2.響應首部

<a href="https://s2.51cto.com/wyfs02/M01/92/EC/wKiom1kFTJjgOwmDAADxHo7CYJA773.jpg" target="_blank"></a>

說明:類似請求封包,起始行後面一般有若幹個頭部字段。每個頭部字段都包含一個名字和一個值,兩者之間用冒号分割。格式Name:Value。

例如:

Content-Type: test/html; charset=utf-8

Content-Length: 78

<a href="https://s2.51cto.com/wyfs02/M01/92/EA/wKioL1kFTJmhQA7RAALU0J6tCqc330.jpg" target="_blank"></a>

Date:是服務端響應用戶端的時間(年月日時分秒)

Content-Type:是響應内容的類型(比如是圖檔、音頻等)

Content-Length:是響應内容的長度(以位元組為機關)

Connection:後面跟keep-alive,表示服務端回應用戶端,它支援長連接配接。(看見了這個,說明用戶端和服務端的長連接配接建立成功)

Set-Cookie:是用戶端第一次發送請求給服務端後,服務端在把用戶端的請求資料回應給用戶端的同時也回應給用戶端一個Set-cookie碼。

(cookie用于統計訪客數,Set-cookie用于唯一辨別同一用戶端。當用戶端第二次再次請求服務端,則要攜帶cookie:xxx碼,作為請求的守護字段,和請求融合在一起,這樣當服務端接收到請求後,可以判斷該用戶端是新使用者還是老使用者)

P3P:P3P 是 The Platform for Privacy Preferences 的簡稱。後面跟的CP,CP 是 CompactPolicy 的簡寫

Location:後面跟的是服務端響應給用戶端通路網頁資源在服務端的位置

Server:後面的BWS/1.1是百度的http服務端為了保護伺服器不被黑客知道了伺服器的類型(是Apache還是nginx)以及http版本号攻擊百度的http伺服器。後面的伺服器類型以及http版本給隐藏了。

X-UA-Compatible:後面跟的是用戶端的浏覽器的資訊,是什麼軟體類型的浏覽器。

最後一個響應首部資訊之後就是一個空行,通過發送回車符和換行符,作用是通知用戶端空行下無首部資訊。

4.響應實體

響應實體中裝載了要傳回給用戶端的資料。這些資料可以是文本,也可以是二進制(例如圖檔,視訊)

<a href="https://s1.51cto.com/wyfs02/M01/92/EA/wKioL1kFTJnyBK1yAAEBMbdLgVo705.jpg" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M02/92/EC/wKiom1kFTJrSfo_hAALtkz-UwZ4515.jpg" target="_blank"></a>

HTTP請求方法

在HTTP通信過程中,每個HTTP請求封包中都會包含一個HTTP請求方法,用于告知用戶端向伺服器端請求執行某些具體的操作。

下面列舉幾項常用的HTTP請求方法:

<a href="https://s4.51cto.com/wyfs02/M02/92/EA/wKioL1kFTJvSAh7SAAHa58zllfs885.jpg" target="_blank"></a>

<a href="https://s4.51cto.com/wyfs02/M00/92/EC/wKiom1kFTJuyAXo_AAFH29LHJRo448.jpg" target="_blank"></a>

說明:後3種請求方法用的最少。

上面有幾個請求方法的描述有點太官方,這裡我通俗的解釋一下:

Head:就是用戶端想服務端發送請求,隻需要服務端回應該資源是有還是沒有,不是要服務端回應資源實體。

Post:比如登入一個網站,要注冊會員使用者,這裡的賬戶和密碼就以post方式發送請求。

Delete:是用戶端請求服務端删除自己上傳的URL指定資源,别人的上傳的資源,你不能用delete請求方法删除。

Trace:跟蹤一次請求,請求在傳遞的過程中,所經曆的的代理伺服器、防火牆或網關等情況。

HTTP的狀态碼

<a href="https://s5.51cto.com/wyfs02/M00/92/EA/wKioL1kFTJyy8m_pAAHhWHokM4U290.jpg" target="_blank"></a>

說明一下5xx,就5xx舉個例子,當web伺服器和php是分離部署的,當有用戶端發送動态請求給web伺服器,而web伺服器需要把這個動态請求轉發給(這裡的web伺服器就相當于是一個代理伺服器)php,讓php來處理動态請求,當web去找php,找不到(也可以說web連接配接不上php),則這時候web伺服器會給用戶端回一個502的狀态碼。

常用狀态碼說明

<a href="https://s5.51cto.com/wyfs02/M02/92/EC/wKiom1kFTJzQB_IDAAEV8ddJsIc092.jpg" target="_blank"></a>

<a href="https://s5.51cto.com/wyfs02/M01/92/EC/wKiom1kFTJ3gcjDCAAD9PzS_gXQ882.jpg" target="_blank"></a>

這裡側重記住幾個狀态碼:

301:永久重定向。告訴用戶端你請求的位址永久挪到了那個新位址。

302:臨時重定向。告訴用戶端你請求的資源臨時存放在某個地方。

304:表示告訴用戶端,你再次通路的該資源沒有被修改(即該資源在web服務端上沒有修改,用戶端可以直接從自己的本地緩存中讀取該資料。)

HTTP首部介紹

通用首部

請求首部

響應首部

實體首部:專門用來表示實體中資源内部的類型、長度、編碼格式等

擴充首部:非标準首部,可有程式員自行建立

   Connection:定義C/S之間關于請求、響應的有關選項

在http1.0 的時候,如果他想使用持久連接配接,那麼他所設定的選項即為

Connection:keep-alive

   Cache-Control:緩存控制,實作更精細的緩存控制方式。在http 1.1上比較常見

   Client-IP :用戶端 IP位址

   Host :請求的主機,這在實作基于主機名的虛拟主機時很有用

   Referer :指明了請求目前資源原始資源的URL,使用referer是可以防盜鍊

   User-Agent:使用者代理,一般而言是浏覽器

   Accept首部:指用戶端可以接受哪些編碼的類型

   Accept:服務端能夠發送的媒體的類型

   Accetp-Charset:接收的字元集

   Accept-Encoding:編碼格式

   Accept-Lanage:所能接受的語言編碼格式

   條件式請求首部:(在http1.1中才會用到)

當發送請求時,先問問對方是否滿足條件,如果滿足條件就請求,不滿足就不請求

   跟安全相關的請求:

   Authorization

   Cookie

   Age:資源響應給你之後可以使用的時長

   Server:向用戶端說明自己用到的程式名稱和版本

   協商類的首部:

   Vary:首部清單,伺服器會根據此清單挑選最适合的版本發給用戶端

   跟安全相關:

   WWW-Authentication

   Set-Cookie

實體首部

   Location:指明資源的新位置,實作302響應碼時通常會用到

   Allow:允許對此資源使用的請求方法

   内容相關的首部

   Content-Encoding

   Content-Language

   Content-Length

   Content-Location:内容所在的位置

   Content-Type

   緩存相關:

   ETag:擴充标簽/标記

   Expires:過期時間

   Last-Modified:最後修改時間

ETag解釋:

在網絡上,有一些緩存伺服器,另外,浏覽器自身也有緩存功能

基于一個前提:圖檔不會經常改動,伺服器在傳回狀态碼200的同時,還會傳回該圖檔的簽名Etag,(可以了解為圖檔的指紋),當浏覽器再次通路該圖檔時,就會去伺服器校驗指紋資訊,如果圖檔沒有變化,直接使用緩存裡的圖檔,這樣減輕了伺服器的負擔,一看到304,浏覽器就知道了,要從本地緩存裡面取圖檔,節省了圖檔在網絡上傳輸的時間

附:

HTTP最常見的請求頭如下:

Accept:浏覽器可接受的MIME類型;

Accept-Charset:浏覽器可接受的字元集;

Accept-Encoding:浏覽器能夠進行解碼的資料編碼方式,比如gzip。

Accept-Language:浏覽器所希望的語言種類

Authorization:授權資訊,通常出現在對伺服器發送的WWW-Authenticate頭的應答中;

Connection:表示 是否需要持久連接配接。值為“Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1預設進行持久連接配接),它就可以利用持久連接配接的優點,當頁面包含多個元素時(例如Applet,圖檔),顯著地減少下載下傳所需要的時間。

Content-Length:表示請求消息正文的長度;

Cookie:這是最重要的請求頭資訊之一;

Cookie相關的HTTP擴充頭

1)Cookie:用戶端将伺服器設定的Cookie傳回到伺服器;

2)Set-Cookie:伺服器向用戶端設定Cookie;

3)Cookie2(RFC2965)):用戶端訓示伺服器支援Cookie的版本;

4)Set-Cookie2(RFC2965):伺服器向用戶端設定Cookie。

Cookie的流程

伺服器在響應消息中用Set-Cookie頭将Cookie的内容回送給用戶端,用戶端在新的請求中将相同的内容攜帶在Cookie頭中發送給伺服器。進而實作會話的保持。

流程如下圖所示:

<a href="https://s5.51cto.com/wyfs02/M02/92/EA/wKioL1kFTJ3j_xX5AAGOICVQ6ac422.jpg" target="_blank"></a>

Host:初始URL中的主機和端口;

If-Modified-Since:隻有當所請求的内容在指定的日期之後又經過修改才傳回它,否則傳回304“Not Modified”應答;

Referer:包含一個URL,使用者從該URL代表的頁面出發通路目前請求的頁面。

User-Agent:浏覽器類型

HTTP最常見的響應頭

HTTP最常見的響應頭如下所示:

Allow:伺服器支援哪些請求方法(如GET、POST等);

Content-Encoding:文檔的編碼(Encode)方法。

Content-Length:表示内容長度。隻有當浏覽器使用持久HTTP連接配接時才需要這個資料。

Content-Type:表 示後面的文檔屬于什麼MIME類型。

Accept-Ranges: bytes  該響應頭表明伺服器支援Range請求,以及伺服器所支援的機關是位元組(這也是唯一可用的機關).我們還能知道:伺服器支援斷點續傳,以及支援同時下載下傳檔案的多個部分,也就是說下載下傳工具可以利用範圍請求加速下載下傳該檔案.Accept-Ranges: none 響應頭表示伺服器不支援範圍請求.

Date:目前的GMT時間。

Expires:指明應該在什麼時候認為文檔已經過期,進而不再緩存它。

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

Location:表示客戶應當到哪裡去提取文檔。

 Refresh:表示浏覽器應該在多少時間之後重新整理文檔,以秒計。

HTTP最常見的實體頭

實體頭用作實體内容的元資訊,描述了實體内容的屬性,包括實體資訊類型,長度,壓縮方法,最後一次修改時間,資料有效性等。

Allow:GET,POST

Content-Encoding:文檔的編碼(Encode)方法,例如:gzip,

Content-Language:内容的語言類型,例如:zh-cn;

Content-Length:表示内容長度,eg:80,可參考“2.5響應頭”;

Content-Location:表示客戶應當到哪裡去提取文檔,例如:http://www.dfdf.org/dfdf.html,

Content-MD5:MD5 實體的一種MD5摘要,用作校驗和。發送方和接受方都計算MD5摘要,接受方将其計算的值與此頭标中傳遞的值進行比較。

Content-Type:标明發送或者接收的實體的MIME類型。Eg:text/html;charset=GB2312       主類型/子類型;

HTTP的事務

包含了一個HTTP請求,和對應請求的響應就叫做一個http事務,也可以了解http事務就是一個完整的HTTP請求和HTTP響應的過程。

http協定預設情況下每個事務都會打開和關閉一個新的連接配接,是以會相當耗費時間和帶寬,由于TCP慢啟動特性,是以每條新的連接配接的性能本身就會有所降低,是以可打開的并行連接配接的數量上限是有限的。是以使用持久連接配接這種模式比預設情況下不使用持久連接配接的方式會好一點,他的好處表現在其請求和tcp斷開的過程所消耗的時間會被減少。

HTTP資源

資源就是通過HTTP協定可以讓使用者通過浏覽器或使用者代理能夠通過基于http協定向伺服器端請求并擷取的内容,像html文檔,一張圖檔等等。

資源類型:是通過MIME進行标記

格式:major/minor 主标記和次标記

常用的MIME類型:

<a href="https://s1.51cto.com/wyfs02/M01/92/EA/wKioL1kFTJ7S_hG0AAFR0ifgI7k072.jpg" target="_blank"></a>

URI和URL的差別

   URI(Uniform Resource Identifier) 同一資源标示符

用于辨別某一網際網路資源名稱的字元串,通過這種辨別來允許你使用者對資源可通過特定的協定進行互動操作。在Web上可用的每種資源,包括HTML文檔、圖像、視訊片段、程式等, 由一個通用資源辨別符進行定位。是以我們可以使用URI來辨別每個資源的名稱

(通俗的說URI就是服務端上每個資源的名稱)

   URL(Uniform Resource Locator)(統一資源定位符)

用于描述一個特定伺服器上某資源的特定位置。

例如:http://www.baidu.com:80/download/bash-4.3.1-1.rpm

URL的格式分為三個部分

i.   scheme(方案)(也叫協定):http://

ii.  Internet位址:一般這個位址指的是伺服器:www.baidu.com:8080

iii. 特定伺服器上的資源:download/bash-4.3.1-1.rpm

(通俗的說URL就是服務端上每個資源的位置)

CGI

是Common Gateway Interface的縮寫,意思是通用網關接口

<a href="https://s1.51cto.com/wyfs02/M00/92/EC/wKiom1kFTJ7RnS_MAAEVw3ZENXs224.jpg" target="_blank"></a>

說明:web伺服器發現需要執行腳本了,就通過CGI協定跟後端的應用程式打交道,把使用者的請求動态交給伺服器,這個伺服器的結果通過CGI協定傳回給http伺服器。

其他需要了解的知識

一次Web資源請求的具體過程:

1.  用戶端在Web浏覽器輸入需要通路的位址

2.  Web浏覽器會請求DNS伺服器,查詢解析到指定域名和Web伺服器的位址

3.  用戶端與請求的Web伺服器端建立連接配接(TCP三向交握)

4.  TCP建立成功之後,發起HTTP請求

5.  伺服器端收到用戶端HTTP請求之後,會處理該請求

6.  處理用戶端指定請求的資源

7.  伺服器建構響應封包,響應給用戶端

8.  伺服器端将此資訊記錄到日志中

http如何并發的接收多個使用者請求:

因為http預設是工作在阻塞模型下的,預設一次隻接收一個請求,處理完請求後再去接收下一個請求,是以隻能一個一個來。

是以我們希望并發響應使用者請求,需要多程序模型。web伺服器自己會生成多個子程序響應使用者請求,也就是說,當一個使用者請求發到Web伺服器,Web主程序不會直接響應使用者請求,而是生成一個子程序響應這個使用者請求,這樣當子程序和此使用者建立連接配接之後。Web的主程序就會再等待另一個使用者的請求,當第二個使用者請求過來之後,再生成一個子程序響應第二個使用者請求。以此類推。是以每一個使用者請求都由一個子程序來處理。

說明一下:這裡說的http采用的阻塞模型,是對于apache來說的,而nginx采用的是非阻塞模型,nginx的主程序可以一次性接受多個請求。

擴充知識點1:利用wireshark分析HTTP協定

實驗步驟

①清空緩存

在進行跟蹤之前,我們首先清空Web 浏覽器的高速緩存來確定Web網頁是從網絡中擷取的,而不是從高速緩沖中取得的。之後,還要在用戶端清空DNS高速緩存,來確定Web伺服器域名到IP位址的映射是從網絡中請求。

清除浏覽器緩存:

在浏覽器→設定,裡面手動清除

清除DNS 緩存:

ipconfig /flushdns

②啟動wireshare

<a href="https://s1.51cto.com/wyfs02/M00/92/EA/wKioL1kFTJ_QeFWdAAHzJ6N8IzY367.jpg" target="_blank"></a>

得到如下截圖:

<a href="https://s5.51cto.com/wyfs02/M02/92/EC/wKiom1kFTKDxxgoIAARJNDLdF6c408.jpg" target="_blank"></a>

④分析資料

在協定框中選擇“GET/ test.html HTTP/1.1”所在的分組會看到這個基本請求行後跟随着一系列額外的請求首部。在首部後的“\r\n”表示一個回車和換行,以此将該首部與下一個首部隔開。

“Host”首部在HTTP1.1版本中是必須的,它描述了URL中機器的域名,本測試中是www.benet.com。這就允許了一個Web伺服器在同一時間支援許多不同的域名。有了這個首部,Web伺服器就可以差別客戶試圖連接配接哪一個Web伺服器,并對每個客戶響應不同的内容。

User-Agent首部描述了提出請求的Web浏覽器及客戶機器。

接下來是一系列的Accpet首部,包括Accept(接受)、Accept-Language(接受語言)、Accept-Encoding(接受編碼)、Accept-Charset(接受字元集)。它們告訴Web伺服器客戶Web浏覽器準備處理的資料類型。Web伺服器可以将資料轉變為不同的語言和格式。這些首部表明了客戶的能力和偏好。

Keep-Alive及Connection首部描述了有關TCP連接配接的資訊,通過此連接配接發送HTTP請求和響應。它表明在發送請求之後連接配接是否保持活動狀态及保持多久。大多數HTTP1.1連接配接是持久的(persistent),意思是在每次請求後不關閉TCP連接配接,而是保持該連接配接以接受從同一台伺服器發來的多個請求。

<a href="https://s2.51cto.com/wyfs02/M01/92/EC/wKiom1kFTKHzvxk2AAF4mmNk16g613.jpg" target="_blank"></a>

我們已經察看了由Web浏覽器發送的請求,現在我們來觀察Web伺服器的應答。響應首先發送“HTTP/1.1 200 ok”,指明它開始使用HTTP1.1版本來發送網頁。同樣,在響應分組中,它後面也跟随着一些首部。最後,被請求的實際資料被發送。第一個Cache-control首部,用于描述是否将資料的副本存儲或高速緩存起來,以便将來引用。一般個人的Web浏覽器會高速緩存一些本機最近通路過的網頁,随後對同一頁面再次進行通路時,如果該網頁仍存儲于高速緩存中,則不再向伺服器請求資料。在HTTP請求中,Web伺服器列出内容類型及可接受的内容編碼。此例中Web伺服器選擇發送内容的類型是test/html

<a href="https://s2.51cto.com/wyfs02/M01/92/EA/wKioL1kFTPyRqQGgAAHx_z1K25Y835.jpg" target="_blank"></a>

擴充知識點2:curl檢視HTTP 響應頭資訊

先看看用戶端(浏覽器)從伺服器請求資料經曆如下基本步驟:

1.使用者發起一個http請求,緩存擷取到URL,根據URL查找是否有比對的副本,這個副本可能在記憶體中,也可能在本地磁盤。 

 2、如果請求命中本地緩存則從本地緩存中擷取一個對應資源的"copy";

 3、檢查這個"copy"是否過期,否則直接傳回,是則繼續向伺服器轉發請求。 HTTP中,通過Cache-Control首部和Expires首部為文檔指定了過期時間,通過對過期時間的判斷,緩存就可以知道文檔是不是在保存期限内。Expires首部和Cache-Control:max-age首部都是來告訴緩存文檔有沒有過期,為什麼需要兩個響應首部來做這件簡單的事情了?其實這一切都是曆史原因,Expires首部是HTTP 1.0中提出來的,因為他使用的是絕對日期,如果服務端和用戶端時鐘不同步的話(實際上這種情況非常常見),緩存可能就會認為文檔已經過了保存期限。

 4、伺服器接收到請求,然後判斷資源是否變更,是則傳回新内容,否則傳回304,未變更,更新過期時間。

<a href="https://s3.51cto.com/wyfs02/M02/92/EA/wKioL1kFTP7BAddRAAMOpIf7eV4031.jpg" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M00/92/EC/wKiom1kFTP7RAa-MAAEqn1iLytk019.jpg" target="_blank"></a>

HTTP 響應頭的資訊

(1). HTTP 傳回碼:

1xx:client的請求server已經接收,正在處理

2xx:成功  表示 client請求,server端已經接收、了解并處理

3xx:client請求被重定向其他的server【其他的URL】

4xx:表示client請求不正确,server不能識别

5xx:server端服務不正常

Cache-Control(緩存控制):

web 站點對緩存的設定: Cache-Control指定請求和響應遵循的緩存機制

緩存分類

1)私有緩存:常見就是我們的浏覽器裡内置的緩存。

2)公有緩存:常見的就是代理緩存

先看Cache-Control可選的參數:private、public 、no-cache、max-age、must-revalidate等

no-cache: 響應不會被緩存,而是實時向伺服器端請求資源

no-store :在任何條件下,響應都不會被緩存,并且不會被寫入到用戶端的磁盤裡,這也是基于安全考慮的某些敏感的響應才會使用這個。

Private:訓示對于單個使用者的整個或部分響應消息,不能被共享緩存處理。這允許伺服器僅僅描述目前使用者的部分響應消息,此響應消息對于其他使用者的請求無效。不能再使用者間共享。

Public:響應會被緩存,并且在多使用者間共享。正常情況, 如果要求 HTTP 認證,響應會自動設定為 private。

max-age:訓示客戶機可以接收生存期不大于指定時間(以秒為機關)的響應,例如: Cache-control: max-age=5 表示當通路此網頁後的5秒内再次通路不會去伺服器。

must-revalidate :響應在特定條件下會被重用,以滿足接下來的請求,但是它必須到伺服器端去驗證它是不是仍然是最新的(強制所有緩存都驗證響應)。

proxy-revalidate :類似于 must-revalidate, 它要求對公共緩存進行驗證

Connection(連接配接):

server 是否支援長連接配接;如果keep-alive 說明web的server支援長連接配接。

但是TCP 的長連接配接是雙向的;必須是client和server 都支援長連接配接;才可以建立長連接配接。

一般client 【浏覽器】都是預設支援長連接配接;是以隻要sever端支援長連接配接;就可以建立長連接配接。

通過curl的-w參數我們可以自定義curl的輸出,%{http_code}代表http狀态碼

<a href="https://s1.51cto.com/wyfs02/M00/92/EA/wKioL1kFTP6h7C3MAABf6vP6RV4668.jpg" target="_blank"></a>

本文轉自Mr大表哥 部落格,原文連結:   http://blog.51cto.com/zpf666/1920794  如需轉載請自行聯系原作者