HTTP協議的論述

前言

  在日常生活中,我們經常使用瀏覽器來瀏覽各種各樣的網站,而通常我們使用瀏覽器都是進行百度。但有時我們直接輸入網址。然後就能看見我們要訪問網址的內容,我們輸入網址,看到結果,殊不知這裏面發生了更加動人的故事,我們先從瀏覽器訪問服務器的流程開始進行介紹。

B/C訪問流程

  B/S結構(瀏覽器/服務器)是WEB興起後的一種網絡結構模式,WEB瀏覽器是客戶端最主要的應用軟件,這種模式統一了客戶端,將系統功能能實現的核心部分集中到服務器上,簡化了系統的開發,維護和使用。

這裏寫圖片描述

  當系統是Windows系統時,hosts的絕對路徑是C:\Windows\System32\drivers\etc,瀏覽器會到這個文件中去瀏覽,看是否有映射關係。

  DNS:因特網上作爲域名和IP地址相互映射的一個分佈式數據庫,能夠使用戶更方便的訪問物聯網,而不用去記住能夠被機器直接讀取的ip數串。通過主機名,最終得到該主機名對應的IP地址。

  其中標紅的部分就是使用http協議的部分。

HTTP連接的七個步驟:

  1. 建立TCP/IP連接
  2. 客戶端向服務端發送HTTP請求
  3. 客戶端發送請求頭信息,請求內容,最後發送一行空白行
  4. 服務器會做出響應,表示對客戶端請求的響應。
  5. 服務器向客戶端發送響應頭信息。
  6. 服務器向客戶端發送響應頭信息後,也會發送一空白行,表示響應信息發送完畢,接着就以Content-Type要求的數據格式發送數據給客戶端。
  7. 服務器關閉連接。但是服務器和客戶端增加了ConnectionKeep-alive就表示長連接。

  上面的七個步驟簡潔的說是瀏覽器發送了一個請求,服務器根據接受的請求給瀏覽器返回一個響應,而HTTP協議定義了請求和響應的規範或標準。接下來我們詳細介紹HTTP協議的請求和響應部分。

HTTP協議

  我們可以用瀏覽器的開發者工具進行抓包,看一下請求頭和響應頭。(以Chome爲例)

當訪問一個頁面的時候可以看到請求頭和響應頭。

這裏寫圖片描述

我們可以看到在請求和響應中有很多信息,這些內容就是http協議,可以說是一種規則或者格式。

  HTTP協議:HTTP是一個屬於應用層的面向對象的協議。所有的www文件都必須遵守這個標準。(百度解釋一大堆)

HTTP請求

  一個http請求報文由請求行、請求頭部、空行和請求數據4個部分組成,

請求行

  請求行:由請求方法、URL和HTTP協議版本3個字段組成,它們用空格分隔。例如,GET /index.html HTTP/1.1。HTTP協議的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。而在我們的開發中經常使用到的兩種請求方式是GET和post方式。

GET:

  1. GET方法要求服務器將URL定位的資源放在響應報文的數據部分,回送給客戶端。

  2. 使用GET方法時,請求參數和對應的值附加在URL後面,利用一個問號(“?”)代表URL的結尾與請求參數的開始,請求數據以地址的形式表現在請求行。

  3. 地址中”?”之後的部分就是通過GET發送的請求數據,我們可以在地址欄中清楚的看到,各個數據之間用”&”符號隔開。顯然這種方式不適合傳送私密數據
  4. 如果是中文/其他字符,則直接把字符串加密

POST:

  1. 允許客戶端給服務器提供信息較多。

  2. POST方法將請求參數封裝在HTTP請求數據中,以名稱/值的形式出現,可以傳輸大量數據,不會顯示在URL中。

  3. POST方式請求行中不包含數據字符串,這些數據保存在“請求內容”部分,各數據之間也是使用”&“符號隔開。

  4. POST方式大多用於頁面的表單中。

GET和POST發送數據說明:

傳輸數據的大小:HTTP協議沒有對傳輸的數據大小進行限制,HTTP協議規範也沒有對URL長度進行限制。而在實際開發中存在的限制主要有:

GET:特定瀏覽器和服務器對URL長度有限制,例如IE對URL長度的限制是2083字節(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操作系統的支持。

POST:由於不是通過URL傳值,理論上數據不受限。

請求頭部

  請求頭部:由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號”:“分隔。請求頭部通知服務器有關於客戶端請求的信息。典型的請求頭有:

  1. User-Agent:產生請求的瀏覽器類型,版本等。

  2. Accept:客戶端可識別的內容類型列表。星號 “ * ” 用於按範圍將類型分組,用 “ / ” 指示可接受全部類型,用“ type/* ”指示可接受 type 類型的所有子類型。

  3. Host:要請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。

  4. Accept-Language:客戶端可接受的語言。

  5. Accept-Encoding:客戶端可接受的壓縮格式。

  6. Accept-Charset:可接受的響應的字符集。

  7. connection:連接方式(close 或 keepalive)。

  8. Cookie:存儲於客戶端擴展字段,向同一域名的服務端發送屬於該域的cookie。

  9. Referer:告訴瀏覽器,我上一個頁面的url可以防止用戶盜鏈;

  10. IF-Modified-Since:瀏覽器告訴服務器,我請求資源,目前最新的修改時間是什麼。

空行

  空行:最後一個請求頭部之後是一個空行,發送回車符和換行符,通知服務器以下不再有請求頭部。

請求數據

  請求數據:請求數據不在GET方法中使用,而在POST方法中使用。POST方法適用於需要客戶填寫表單的場合。與請求數據相關的最常使用的請求頭部是Content-Type和Content-Length。

HTTP響應

  一個http響應報文由狀態行、響應頭部、空行和響應數據4個部分組成。

狀態行

  狀態行:用於表示服務器對請求的處理結果,它是一個三位數的十進制。響應狀態碼分爲5類:

這裏寫圖片描述

  • 200 OK 表示客戶端請求成功

  • 204 No Content 成功,但不返回任何實體的主體部分

  • 206 Partial Content 成功執行了一個範圍(Range)請求

  • 301 Moved Permanently 永久性重定向,響應報文的Location首部應該有該資源的新URL

  • 302 Found 臨時性重定向,響應報文的Location首部給出的URL用來臨時定位資源

  • 303 See Other 請求的資源存在着另一個URI,客戶端應使用GET方法定向獲取請求的資源

  • 304 Not Modified 客戶端發送附帶條件的請求(請求首部中包含如If-Modified-Since等指定首部)時,服務端有可能返回304,此時,響應報文中不包含任何報文主體。

  • 307 Temporary Redirect 臨時重定向。與302 Found含義一樣。302禁止POST變換爲GET,但實際使用時並不一定,307則更多瀏覽器可能會遵循這一標準,但也依賴於瀏覽器具體實現

  • 400 Bad Request 表示客戶端請求有語法錯誤,不能被服務器所理解

  • 401 Unauthonzed 表示請求未經授權,該狀態代碼必須與 WWW-Authenticate 報頭域一起使用

  • 403 Forbidden 表示服務器收到請求,但是拒絕提供服務,通常會在響應正文中給出不提供服務的原因

  • 404 Not Found 請求的資源不存在,例如,輸入了錯誤的URL

  • 500 Internel Server Error 表示服務器發生不可預期的錯誤,導致無法完成客戶端的請求

  • 503 Service Unavailable 表示服務器當前不能夠處理客戶端的請求,在一段時間之後,服務器可能會恢復正常

響應頭部

  響應頭部:由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號”:“分隔,典型的響應頭有:

  1. Location:用於重定向接受者到一個新的位置。例如:客戶端所請求的頁面已不存在原先的位置,爲了讓客戶端重定向到這個頁面新的位置,服務器端可以發回Location響應報頭後使用重定向語句,讓客戶端去訪問新的域名所對應的服務器上的資源

  2. Server:包含了服務器用來處理請求的軟件信息及其版本。

  3. Vary:指示不可緩存的請求頭列表

  4. Connection:連接方式(close 或 keepalive)。

  5. Content-Length:返回長度;
  6. Refresh:用來返回告訴瀏覽器幾秒後,將跳轉到那個頁面。

空行

  空行:最後一個響應頭部之後是一個空行,發送回車符和換行符,通知瀏覽器以下不再有響應頭部。

響應數據

  響應數據:服務器返回給客戶端的文本信息。

總結

  上面的HTTP協議的論述,都是一些基本的HTTP協議知識,這時候再看瀏覽器訪問服務器的流程,感覺更加清晰。掌握HTTP協議後,對於開發有很好的作用,明白B/C的數據傳輸機制。對於錯誤的處理也有一定的幫助。

發佈了38 篇原創文章 · 獲贊 28 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章