1. 程式人生 > >HTTP協議-HTTP協議詳解

HTTP協議-HTTP協議詳解

HTTP協議是一個網際網路協議,不僅用來傳輸網頁。也被很多的軟體用來與伺服器通訊,在協議中包含了許多的通訊樣式的規定等,接下來就讓我們從頭開始瞭解它。

3.1. 在TCP/IP協議棧中的位置

HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端伺服器模型。HTTP是一個無狀態的協議。HTTP協議通常承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了我們常說的HTTPS。如下圖所示: 在這裡插入圖片描述 預設HTTP的埠號為80,HTTPS的埠號為443。上圖說明HTTP於TCP協議之上,也就意味著每次的網頁請求都是需要經過三次握手的,但是他很好的遮蔽了下面的細節,我們也不需要仔細研究有關TCP的細節,這跟HTTP協議內容是沒有什麼關係的。

3.2 HTTP的請求響應模型

HTTP協議永遠都是客戶端發起請求,伺服器回送響應。見下圖: 在這裡插入圖片描述 這樣就限制了使用HTTP協議,無法實現在客戶端沒有發起請求的時候,伺服器將訊息推送給客戶端。HTTP協議是一個無狀態的協議,同一個客戶端的這次請求和上次請求是沒有對應關係。

一次HTTP操作稱為一個事務,其工作過程可分為四步: 1)首先客戶機與伺服器需要建立連線。只要單擊某個超級連結,HTTP的工作開始。 2)建立連線後,客戶機發送一個請求給伺服器,請求方式的格式為:統一資源識別符號(URL)、協議版本號,後邊是MIME資訊包括請求修飾符、客戶機資訊和可能的內容。 3)伺服器接到請求後,給予相應的響應資訊,其格式為一個狀態行,包括資訊的協議版本號、一個成功或錯誤的程式碼,後邊是MIME資訊包括伺服器資訊、實體資訊和可能的內容。 4)客戶端接收伺服器所返回的資訊通過瀏覽器顯示在使用者的顯示屏上,然後客戶機與伺服器斷開連線。

如果在以上過程中的某一步出現錯誤,那麼產生錯誤的資訊將返回到客戶端,有顯示屏輸出。對於使用者來說,這些過程是由HTTP和瀏覽器自己完成的,使用者只要用滑鼠點選,等待資訊顯示就可以了。

3.3 HTTP之請求request

HTTP協議也是一種普通的協議,通過欄位屬性控制協議的有關詳情,下圖為HTTP協議的請求基本構成: 在這裡插入圖片描述 Get請求例子,使用Charles抓取的request:

GET /562f25980001b1b106000338.jpg HTTP/1.1
Host    img.mukewang.com
User-Agent    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept    image/webp,image/*,*/*;q=0.8
Referer    http://www.imooc.com/
Accept-Encoding    gzip, deflate, sdch
Accept-Language    zh-CN,zh;q=0.8

第一部分:請求行,用來說明請求型別,要訪問的資源以及所使用的HTTP版本.GET說明請求型別為GET,後面的路徑為要訪問的資源,該行的最後一部分說明使用的是HTTP1.1版本。 第二部分:請求頭部,緊接著請求行(即第一行)之後的部分,用來說明伺服器要使用的附加資訊。從第二行起為請求頭部,HOST將指出請求的目的地.User-Agent,伺服器端和客戶端指令碼都能訪問它,它是瀏覽器型別檢測邏輯的重要基礎.該資訊由你的瀏覽器來定義,並且在每個請求中自動傳送等等 第三部分:空行,請求頭部後面的空行是必須的 即使第四部分的請求資料為空,也必須有空行。 第四部分:請求資料也叫主體,可以新增任意的其他資料。 這個例子的請求資料為空。

POST請求例子,使用Charles抓取的request:

POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley

第一部分:請求行,第一行明瞭是post請求,以及http1.1版本。 第二部分:請求頭部,第二行至第六行。 第三部分:空行,第七行的空行。 第四部分:請求資料,第八行。 在HTTP協議中,定義了數種請求方法。根據HTTP標準,HTTP請求可以使用一下的方式:HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。 在這裡插入圖片描述

3.4 HTTP之響應訊息Response

一般情況下,瀏覽器發請求資訊之後,伺服器接收並處理髮過來的請求後會返回一個HTTP的響應訊息。HTTP響應也由四個部分組成,分別是:狀態行、訊息報頭、空行和響應正文。 在這裡插入圖片描述 第一部分:狀態行,由HTTP協議版本號, 狀態碼, 狀態訊息 三部分組成。第一行為狀態行,(HTTP/1.1)表明HTTP版本為1.1版本,狀態碼為200,狀態訊息為(ok) 第二部分:訊息報頭,用來說明客戶端要使用的一些附加資訊 第二行和第三行為訊息報頭,Date:生成響應的日期和時間;Content-Type:指定了MIME型別的HTML(text/html),編碼型別是UTF-8。 第三部分:空行,訊息報頭後面的空行是必須的 第四部分:響應正文,伺服器返回給客戶端的文字資訊。 空行後面的html部分為響應正文。 在返回的響應資訊中,比較重要之一的就是HTTP之狀態碼,它會通知客戶瀏覽器本次請求的結果,常用的狀態碼及表示如下所述 狀態程式碼有三位數字組成,第一個數字定義了響應的類別,共分五種類別: 在這裡插入圖片描述 常見狀態碼如下: 在這裡插入圖片描述

3.5 HTTP工作原理

HTTP協議定義Web客戶端如何從Web伺服器請求Web頁面,以及伺服器如何把Web頁面傳送給客戶端。HTTP協議採用了請求/響應模型。客戶端向伺服器傳送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求資料。伺服器以一個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤程式碼、伺服器資訊、響應頭部和響應資料。 以下是 HTTP 請求/響應的步驟:

1、客戶端連線到Web伺服器 一個HTTP客戶端,通常是瀏覽器,與Web伺服器的HTTP埠(預設為80)建立一個TCP套接字連線。例如,http://www.oakcms.cn。 2、傳送HTTP請求 通過TCP套接字,客戶端向Web伺服器傳送一個文字的請求報文,一個請求報文由請求行、請求頭部、空行和請求資料4部分組成。 3、伺服器接受請求並返回HTTP響應 Web伺服器解析請求,定位請求資源。伺服器將資源複本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應資料4部分組成。 4、釋放連線TCP連線 若connection 模式為close,則伺服器主動關閉TCP連線,客戶端被動關閉連線,釋放TCP連線;若connection 模式為keepalive,則該連線會保持一段時間,在該時間內可以繼續接收請求; 5、 客戶端瀏覽器解析HTML內容 6、 客戶端瀏覽器首先解析狀態行,查看錶明請求是否成功的狀態程式碼。然後解析每一個響應頭,響應頭告知以下為若干位元組的HTML文件和文件的字符集。客戶端瀏覽器讀取響應資料HTML,根據HTML的語法對其進行格式化,並在瀏覽器視窗中顯示。

例如:在瀏覽器位址列鍵入URL,按下回車之後會經歷以下流程: 1、瀏覽器向DNS伺服器請求解析該 URL 中的域名所對應的 IP 地址; 2、解析出IP地址後,根據該IP地址和預設埠80,和伺服器建立TCP連線; 3、瀏覽器發出讀取檔案(URL中域名後面部分對應的檔案)的HTTP 請求,該請求報文作為TCP 三次握手的第三個報文的資料傳送給伺服器; 4、伺服器對瀏覽器請求作出響應,並把對應的 html 文字傳送給瀏覽器; 5、釋放TCP連線; 6、瀏覽器將該 html 文字並顯示內容;