08.Web服務器-2.HTTP協議介紹

HTTP是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫。它的發展是萬維網協會(World Wide Web Consortium)和Internet工作小組IETF(Internet Engineering Task Force)合作的結果,(他們)最終發布了一系列的RFC,RFC 1945定義了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定義了今天普遍使用的一個版本——HTTP 1.1。

HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用于從WWW服務器傳輸超文本到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先于圖形)等。

HTTP是一個基于TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。

HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器模型。HTTP是一個無狀態的協議。

HTTP協議永遠都是客戶端發起請求,服務器回送響應。見下圖:


image

這樣就限制了使用HTTP協議,無法實現在客戶端沒有發起請求的時候,服務器將消息推送給客戶端。

HTTP協議是一個無狀態的協議,同一個客戶端的這次請求和上次請求是沒有對應關系。

1、使用谷歌/火狐瀏覽器分析

在Web應用中,服務器把網頁傳給瀏覽器,實際上就是把網頁的HTML代碼發送給瀏覽器,讓瀏覽器顯示出來。而瀏覽器和服務器之間的傳輸協議是HTTP,所以:

  • HTML是一種用來定義網頁的文本,會HTML,就可以編寫網頁;
  • HTTP是在網絡上傳輸HTML的協議,用于瀏覽器和服務器的通信。

Chrome瀏覽器提供了一套完整地調試工具,非常適合Web開發。(F12)

2、http協議的分析

當我們在地址欄輸入www.sina.com時,瀏覽器將顯示新浪的首頁。在這個過程中,瀏覽器都干了哪些事情呢?通過Network的記錄,我們就可以知道。在Network中,找到www.sina.com那條記錄,點擊,右側將顯示Request Headers,點擊右側的view source,我們就可以看到瀏覽器發給新浪服務器的請求:

2.1瀏覽器請求

當我們在地址欄輸入www.sina.com時,瀏覽器將顯示新浪的首頁。在這個過程中,瀏覽器都干了哪些事情呢?通過Network的記錄,我們就可以知道。在Network中,找到www.sina.com那條記錄,點擊,右側將顯示Request Headers,點擊右側的view source,我們就可以看到瀏覽器發給新浪服務器的請求:

最主要的頭兩行分析如下,第一行:

GET / HTTP/1.1

GET表示一個讀取請求,將從服務器獲得網頁數據,/表示URL的路徑,URL總是以/開頭,/就表示首頁,最后的HTTP/1.1指示采用的HTTP協議版本是1.1。目前HTTP協議的版本就是1.1,但是大部分服務器也支持1.0版本,主要區別在于1.1版本允許多個HTTP請求復用一個TCP連接,以加快傳輸速度。


從第二行開始,每一行都類似于Xxx: abcdefg:

Host: www.sina.com

表示請求的域名是 www.sina.com。如果一臺服務器有多個網站,服務器就需要通過Host來區分瀏覽器請求的是哪個網站。

image

2.2服務器響應

繼續往下找到Response Headers,點擊view source,顯示服務器返回的原始響應數據:

HTTP響應分為Header和Body兩部分(Body是可選項),我們在Network中看到的Header最重要的幾行如下:

HTTP/1.1 200 OK

200表示一個成功的響應,后面的OK是說明。

如果返回的不是200,那么往往有其他的功能,例如:

  • 失敗的響應有404 Not Found:網頁不存在
  • 500 Internal Server Error:服務器內部出錯
  • ...等等...
Content-Type: text/html

Content-Type指示響應的內容,這里是text/html表示HTML網頁。

請注意,瀏覽器就是依靠Content-Type來判斷響應的內容是網頁還是圖片,是視頻還是音樂。瀏覽器并不靠URL來判斷響應的內容,所以,即使URL是http://www.baidu.com/meimei.jpg,它也不一定就是圖片。

HTTP響應的Body就是HTML源碼

2.3瀏覽器解析過程

當瀏覽器讀取到新浪首頁的HTML源碼后,它會解析HTML,顯示頁面,然后,根據HTML里面的各種鏈接,再發送HTTP請求給新浪服務器,拿到相應的圖片、視頻、Flash、JavaScript腳本、CSS等各種資源,最終顯示出一個完整的頁面。所以我們在Network下面能看到很多額外的HTTP請求。

3、總結

3.1HTTP請求流程

我們來總結一下HTTP請求的流程:

==步驟1:瀏覽器首先向服務器發送HTTP請求,請求包括:==

方法:GET還是POST,GET僅請求資源,POST會附帶用戶數據;

路徑:/full/url/path;

域名:由Host頭指定:Host: www.sina.com

以及其他相關的Header;

如果是POST,那么請求還包括一個Body,包含用戶數據

==步驟2:服務器向瀏覽器返回HTTP響應,響應包括:==

響應代碼:200表示成功,3xx表示重定向,
          4xx表示客戶端發送的請求有錯誤,
          5xx表示服務器端處理時發生了錯誤;

響應類型:由Content-Type指定;

以及其他相關的Header;

通常服務器的HTTP響應會攜帶內容,也就是有一個Body,
包含響應的內容,網頁的HTML源碼就在Body中。

==步驟3:如果瀏覽器還需要繼續向服務器請求其他資源,比如圖片,就再次發出HTTP請求,重復步驟1、2。==

Web采用的HTTP協議采用了非常簡單的請求-響應模式,從而大大簡化了開發。
當我們編寫一個頁面時,我們只需要在HTTP請求中把HTML發送出去,不需要考慮如何附帶圖片、視頻等,
瀏覽器如果需要請求圖片和視頻,它會發送另一個HTTP請求,
因此,一個HTTP請求只處理一個資源
(此時就可以理解為TCP協議中的短連接,每個鏈接只獲取一個資源,如需要多個就需要建立多個鏈接)

HTTP協議同時具備極強的擴展性,雖然瀏覽器請求的是http://www.sina.com的首頁,但是新浪在HTML中可以鏈入其他服務器的資源,比如《img src="http://i1.sinaimg.cn/home/2013/1008/U8455P30DT20131008135420.png"》,從而將請求壓力分散到各個服務器上,并且,一個站點可以鏈接到其他站點,無數個站點互相鏈接起來,就形成了World Wide Web,簡稱WWW。

3.2HTTP格式

image
image

每個HTTP請求和響應都遵循相同的格式,一個HTTP包含Header和Body兩部分,其中Body是可選的。

HTTP協議是一種文本協議,所以,它的格式也非常簡單。

==HTTP GET請求的格式:==

GET /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3

每個Header一行一個,換行符是\r\n。

==HTTP POST請求的格式:==

POST /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3

body data goes here...

當遇到連續兩個\r\n時,Header部分結束,后面的數據全部是Body。

==HTTP響應的格式:==

200 OK
Header1: Value1
Header2: Value2
Header3: Value3

body data goes here...

HTTP響應如果包含body,也是通過\r\n\r\n來分隔的。

請再次注意,Body的數據類型由Content-Type頭來確定,如果是網頁,Body就是文本,如果是圖片,Body就是圖片的二進制數據。

當存在Content-Encoding時,Body數據是被壓縮的,最常見的壓縮方式是gzip,所以,看到Content-Encoding: gzip時,需要將Body數據先解壓縮,才能得到真正的數據。壓縮的目的在于減少Body的大小,加快網絡傳輸。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容