詳解HTTP協議

目錄

HTTP協議

URL

HTTP報文

請求報文:

響應報文:

HTTP工作原理


HTTP協議

一、協議簡介

  • HTTP協議(超文本傳輸協議),是用於從萬維網(WWW)服務器傳輸超文本到本地瀏覽器的傳送協議。
  • HTTP是一個基於TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。
  • HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分佈式超媒體信息系統。它於1990年提出,目前在WWW中使用的是HTTP/1.0的第六版.
  • HTTP協議工作於客戶端-服務端架構爲上。瀏覽器作爲HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。Web服務器根據接收到的請求後,向客戶端發送響應信息。

         

 

二、主要特點

  1. 簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、POST、HEAD。每種方法規定了客戶與服務器聯繫的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快
  2. 靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
  3. 無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
  4. 無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
  5. 支持B/S及C/S模式

URL

  • HTTP使用統一資源標識符(URI)來傳輸數據和建立連接URL是一種特殊類型的URI,包含了用於查找某個資源的足夠的信息。
  • URL:統一資源定位符,在互聯網上用來標識某一處資源的地址。簡單來說,URL就是我們平時說的“網址”。

下面以這個URL爲例,介紹下普通URL的各部分組成:

        http://www.le.com/ptv/vplay/20167941.html?ch=sogou_sv&fromvsogou=1

  • 協議部分:該URL的協議部分爲“http:”,這代表網頁使用的是HTTP協議。在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在"HTTP"後面的“//”爲分隔符。
  • 域名部分:該URL的域名部分爲“www.le.com”。一個URL中,也可以使用IP地址作爲域名使用
  • 虛擬目錄部分:從域名後的第一個“/”開始到最後一個“/”爲止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是“/ptv/vplay”。
  • 文件名部分:從域名後的最後一個“/”開始到“?”爲止(如果沒有“?”,則是從域名後的最後一個“/”開始到“#”爲止),本例中的文件名是“20167941.html”。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名。
  • 參數部分:從“?”開始到“#”爲止之間的部分爲參數部分,又稱搜索部分、查詢部分。本例中的參數部分爲“ch=sogou_sv&fromvsogou=1。參數可以允許有多個參數,參數與參數之間用“&”作爲分隔符。

URI和URL的區別:

       URI用字符串唯一標識某一互聯網資源,URL標識了資源的地點(在互聯網上所處的位置),也就是說:URL是URI的子集。

  • URI:Web上可用的每種資源如HTML文檔、圖像、視頻片段、程序等都是一個來URI來定位的。

        URI一般由三部組成:

                ①訪問資源的命名機制
                ②存放資源的主機名
                ③資源自身的名稱,由路徑表示,着重強調於資源

  • URL:是Internet上用來描述信息資源的字符串,主要用在各種WWW客戶程序和服務器程序上,特別是著名的馬賽克(Mosaic)。採用URL可以用一種統一的格式來描述各種信息資源,包括文件、服務器的地址和目錄等。

        URL一般由三部組成:

                ①協議(或稱爲服務方式)
                ②存有該資源的主機IP地址(有時也包括端口號)
                ③主機資源的具體地址。如目錄和文件名等


HTTP報文

  • 用於HTTP協議交互的信息被稱爲HTTP報文。
  • 請求端(客戶端)的HTTP報文叫做請求報文;響應端(服務器端)的HTTP報文叫做響應報文。

請求報文:

 

客戶端發送一個HTTP請求到服務器的請求消息包括以下四個部分:

  1. 請求行:用來說明 請求方法(method)、要訪問的資源(URI)、所使用的HTTP版本。
  2. 請求頭部:用來說明 服務器要使用的附加信息。其中Content-Length標識了請求數據的長度。
  3. 空行:將請求頭部與有效載荷分隔開,請求頭部後面的空行是必須的。
  4. 請求數據:請求數據也叫報文主體,可以添加任意的其他數據,也可以爲空。

 

HTTP中常見的請求頭部:

  • Content-Type: 數據類型(text/html等); 
  • Content-Length: 報文主體的長度;
  • Host: 客戶端告知服務器, 所請求的資源是在哪個主機的哪個端口上;
  • User-Agent: 聲明用戶的操作系統和瀏覽器版本信息;
  • referer: 當前頁⾯是從哪個頁⾯跳轉過來的;
  • location: 搭配3xx狀態碼使用, 告訴客戶端接下來要去哪⾥訪問;
  • Cookie: ⽤於在客戶端存儲少量信息. 通常用於實現會話(session)的功能;

 

請求報文中請求行的請求方法(method):

根據HTTP標準,HTTP請求可以使用多種請求方法。
HTTP1.0定義了三種請求方法: GET, POSTHEAD方法。
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACECONNECT 方法。

GET     請求指定的頁面信息,並返回實體主體。
HEAD     類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
POST     向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
PUT     從客戶端向服務器傳送的數據取代指定的文檔的內容。
DELETE      請求服務器刪除指定的頁面。
CONNECT     HTTP/1.1協議中預留給能夠將連接改爲管道方式的代理服務器。
OPTIONS     允許客戶端查看服務器的性能。
TRACE     回顯服務器收到的請求,主要用於測試或診斷。

 

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,[/562f25980001b1b106000338.jpg]爲要訪問的資源,最後一部分說明使用的是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版本。
  • 第二部分:請求頭部,包括第二行至第六行。
  • 第三部分:空行,第七行的空行。
  • 第四部分:請求數據,第八行。

GET和POST請求的區別:

  1. GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息。
  2. GET提交的數據會放在URL之後,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數據放在HTTP包的報文主體中。
  3. GET提交的數據大小有限制(因爲瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制。
  4. GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。
  5. GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該用戶的賬號和密碼。

 

響應報文:

一般情況下,服務器接收並處理客戶端發過來的請求後會返回一個HTTP的響應消息,響應也由四個部分組成:

  1. 狀態行:由 HTTP協議版本號、 狀態碼、狀態消息 三部分組成。
  2. 響應頭部:用來說明 客戶端要使用的附加信息。
  3. 空行:將響應頭部與有效載荷分隔開,消息報頭後面的空行是必須的。
  4. 響應正文:響應正文,服務器返回給客戶端的文本信息。(空行後面的html部分爲響應正文)

響應報文中狀態行的狀態碼:

狀態碼有三位數字組成,第一個數字定義了響應的類別,共分五種類別:

  • 1xx:指示信息--表示請求已接收,繼續處理
  • 2xx:成功--表示請求已被成功接收、理解、接受
  • 3xx:重定向--要完成請求必須進行更進一步的操作
  • 4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
  • 5xx:服務器端錯誤--服務器未能實現合法的請求

常見狀態碼:

200 OK                        //客戶端請求成功
400 Bad Request               //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized              //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用 
403 Forbidden                 //服務器收到請求,但是拒絕提供服務
404 Not Found                 //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error     //服務器發生不可預期的錯誤
503 Server Unavailable        //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常

更多狀態碼http://www.runoob.com/http/http-status-codes.html

響應報文例子:

HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8

<html>
      <head></head>
      <body>
            <!--body goes here-->
      </body>
</html>
  • 第一部分:第一行是狀態行,(HTTP/1.1)表明HTTP版本爲1.1版本,狀態碼爲200,狀態消息爲(ok)
  • 第二部分:第二行和第三行爲消息報頭,用來說明客戶端要使用的一些附加信息。   Date:生成響應的日期和時間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8
  • 第三部分:空行,消息報頭後面的空行是必須的
  • 第四部分:響應正文,服務器返回給客戶端的文本信息。空行後面的html部分爲響應正文。

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內容

         客戶端瀏覽器首先解析狀態行,查看錶明請求是否成功的狀態代碼。然後解析每一個響應頭,響應頭告知以下爲若干字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,並在瀏覽器窗口中顯示。

 

例如:在瀏覽器地址欄鍵入URL,按下回車之後會經歷以下流程:

1、瀏覽器向 DNS 服務器請求解析該 URL 中的域名所對應的 IP 地址;

2、解析出 IP 地址後,根據該 IP 地址和默認端口 80(http端口號爲80),和服務器建立TCP連接;

3、瀏覽器發出讀取文件(URL 中域名後面部分對應的文件)的HTTP 請求,該請求報文作爲TCP三次握手的第三個報文的數據發送給服務器;

4、服務器對瀏覽器請求作出響應,並把對應的 html 文本發送給瀏覽器;

5、釋放TCP連接;

6、瀏覽器將該 html 文本解析並顯示內容; 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章