天天看點

HTTP協定初識HTTP協定介紹

HTTP協定介紹

當你在浏覽器位址欄敲入“http://www.cnblogs.com/”,然後猛按回車,呈現在你面前的,将是部落格園的首頁了(這真是廢話,你會認為這是理所當然的)。作為一個開發者,尤其是web開發人員,我想你有必要去了解這一系列的處理流程,在這期間,浏覽器和伺服器到底是如何打交道的?伺服器又是如何處理的?浏覽器又是如何将網頁顯示給使用者的呢?......

    細節太多,要學完。。。。。。額

何為http協定(Hypertext Transfer Protocol,超文本傳輸協定)?

所謂協定,就是指雙方遵循的規範。http協定,就是浏覽器和伺服器之間進行“溝通”的一種規範。我們在看空間,刷微網誌...都是在使用http協定,當然,遠遠不止這些應用。

筆者一直聽說http是屬于“應用層的協定”,而且是基于TCP/IP協定的。這個不難了解,如果你上大學時候學過“計算機網絡”的課程,就一定知 道OSI七層參考協定(我當時是死記硬背的)。如果你接觸過socket網絡程式設計,就應該明白TCP和UDP這兩種使用廣泛的通信協定(建立連接配接、三次握 手等等,當然,這不是本文讨論的重點)。如圖:

HTTP協定初識HTTP協定介紹

既然TCP/UDP是廣泛使用的網絡通信協定,那為啥有多出個http協定來呢?

聽人家說:UDP協定具有不可靠性和不安全性,顯然這很難滿足web應用的需要。而TCP協定是基于連接配接和三次握手的,雖然具有可靠性,但任具有一定的缺陷。但試想一下,普通的C/S架構軟體,頂多上千個Client同時連接配接,而B/S架構的網站,十萬人同時線上也是很平常的事兒。如果十萬個用戶端和伺服器一直保持連接配接狀态,那伺服器如何滿足承載呢?

這就衍生出了http協定。基于TCP的可靠性連接配接。通俗點說,就是在請求之後,伺服器端立即關閉連接配接、釋放資源。這樣既保證了資源可用,也吸取了TCP的可靠性的優點。

正因為這點,是以大家通常說http協定是“無狀态”的,也就是“伺服器不知道你用戶端幹了啥”,其實很大程度上是基于性能考慮的。以至于後來有了session之類的玩意。

學習http協定,主要需要了解http的請求和響應(當然,還有get、post等請求方式,狀态碼、URI、MIME等)

首先看看http請求消息(就是浏覽器丢給伺服器的):

一個http請求代表用戶端浏覽器向伺服器發送的資料。一個完整的http請求消息,包含一個請求行,若幹個消息頭(請求頭),換行,實體内容

請求行:描述用戶端的請求方式、請求資源的名稱、http協定的版本号。 例如:GET/BOOK/JAVA.HTML HTTP/1.1

請求頭(消息頭)包含(客戶機請求的伺服器主機名,客戶機的環境資訊等):

Accept:用于告訴伺服器,客戶機支援的資料類型  (例如:Accept:text/html,image/*)

Accept-Charset:用于告訴伺服器,客戶機采用的編碼格式

Accept-Encoding:用于告訴伺服器,客戶機支援的資料壓縮格式

Accept-Language:客戶機語言環境

Host:客戶機通過這個伺服器,想通路的主機名

If-Modified-Since:客戶機通過這個頭告訴伺服器,資源的緩存時間

Referer:客戶機通過這個頭告訴伺服器,它(用戶端)是從哪個資源來通路伺服器的(防盜鍊)

User-Agent:客戶機通過這個頭告訴伺服器,客戶機的軟體環境(作業系統,浏覽器版本等)

Cookie:客戶機通過這個頭,将Coockie資訊帶給伺服器

Connection:告訴伺服器,請求完成後,是否保持連接配接

Date:告訴伺服器,目前請求的時間

(換行)

實體内容:

就是指浏覽器端通過http協定發送給伺服器的實體資料。例如:name=dylan&id=110

(get請求時,通過url傳給伺服器的值。post請求時,通過表單發送給伺服器的值)

再看看HTTP響應消息(伺服器傳回給浏覽器的):

一個http響應代表伺服器端向用戶端回送的資料,它包括:

一個狀态行,若幹個消息頭,以及實體内容

響應頭(消息頭)包含:

Location:這個頭配合302狀态嗎,用于告訴用戶端找誰

Server:伺服器通過這個頭,告訴浏覽器伺服器的類型

Content-Encoding:告訴浏覽器,伺服器的資料壓縮格式

Content-Length:告訴浏覽器,回送資料的長度

Content-Type:告訴浏覽器,回送資料的類型

Last-Modified:告訴浏覽器目前資源緩存時間

Refresh:告訴浏覽器,隔多長時間重新整理

Content-Disposition:告訴浏覽器以下載下傳的方式打開資料。

例如context.Response.AddHeader("Content-Disposition","attachment:filename=aa.jpg");                                    context.Response.WriteFile("aa.jpg");

Transfer-Encoding:告訴浏覽器,傳送資料的編碼格式

ETag:緩存相關的頭(可以做到實時更新)

Expries:告訴浏覽器回送的資源緩存多長時間。如果是-1或者0,表示不緩存

Cache-Control:控制浏覽器不要緩存資料   no-cache

Pragma:控制浏覽器不要緩存資料          no-cache

Connection:響應完成後,是否斷開連接配接。  close/Keep-Alive

Date:告訴浏覽器,伺服器響應時間

狀态行: 例如: HTTP/1.1  200 OK   (協定的版本号是1.1  響應狀态碼為200  響應結果為OK)

實體内容(實體頭):響應包含浏覽器能夠解析的靜态内容,例如:html,純文字,圖檔等等資訊

了解了以上的http請求消息和響應消息,相信你對于http協定已經了解得足夠深刻了。關于http協定的更多具體細節,可以參照http RFC文檔。

大緻步驟就是:浏覽器先向伺服器發送請求,伺服器接收到請求後,做相應的處理,然後封裝好響應封包,再回送給浏覽器。浏覽器拿到響應封包後,再通過 浏覽器引擎去渲染網頁,解析DOM樹,javascript引擎解析并執行腳本操作,插件去幹插件該幹的事兒...關于浏覽器渲染、解析的原理,可以參考http://kb.cnblogs.com/page/129756/

說白了,所謂web的本質,無非是:請求/處理/響應 ,任何的web伺服器,任何的服務端程式設計語言,都沒法脫離這個本質。 而浏覽器端解析html、圖檔等靜态内容,呈現給使用者,腳本引擎執行腳本代碼,完成腳本代碼要做的事兒(例如dom操作,css屬性更改,發送ajax請 求等等)。 

轉載于:https://www.cnblogs.com/xiao-xue-di/p/9664271.html

繼續閱讀