Web開發學習筆記——HTTP 概述

西流河發表於2018-04-05

本篇瞭解 HTTP 的一些基礎知識。

什麼是HTTP

如果說 TCP/IP 是一套約定計算機如何交流通訊的規則的話,HTTP 起初設計的初衷則是約定客戶端(Client,也就是瀏覽器)和主機(Host,也就是伺服器)之間的通訊規則,當然,現在,它不止是這個功能咯!

那麼,如何給 HTTP 下一個定義呢?

HTTP,全稱是 HyperText Transfer Protocol,翻譯過來就是超文字傳輸協議,它是一種在client-server之間,用於傳輸超媒體文件的、無狀態 的應用層協議。所謂的超媒體文件,指的就是 HTML 等超文字檔案以及 Web 中的文字、圖片、視訊、指令碼和樣式等。而無狀態,則意味著它不能夠儲存資料,這在電商網站的購物車功能中表現最明顯,如果我們從一個頁面向購物車新增了一件商品,在換一個頁面後,這件商品並不會實時更新,這個問題如何解決呢?——解決辦法當然是有的,就是通過 HTTP cookies,把商品資訊新增 cookies 到 HTTP 頭部,建立一個會話共享這個資訊。

HTTP 請求(request)從 client 端(瀏覽器)發出,到 server 端(伺服器)的指定埠(預設80埠),伺服器端接受到請求後,根據請求頭部資訊,做出響應(response),返回一個響應狀態和對應的請求資源(檔案、錯誤資訊之類的)。HTTP 位於七層協議的最上層——應用層。當然,這整個過程並不只是客戶端和伺服器兩個點的事情,期間還有路由器、調節器等許多實體節點。

Http 與 Https

我們一直談到 http,但是,當你在瀏覽器中看到的 URL 中,經常會看到前面的協議名是https,那麼,http 和 https 有什麼關係呢?(我想絕不是 java 和 javascript 的關係滴)。

在查閱了一些資料之後,我知道後面多餘的 s 指的是 secure,也就是說後者是前者的安全版本。那麼為什麼 https 會更安全呢?原來,開發 https 的主要目的是為了在網路傳輸資料的過程中,保證資料的隱私和完整性。

在 http 的時代,所有的網路請求對話其實是公開的,別人可以知道你們之間傳輸的對話內容是什麼,這在今天可不得了,現在使用的密碼如此之多,如果你的密碼別人都能看見還了得?

所以,https 出現了。它的主要設計思想是,通過在公開的網路通道上建立一條安全通道,並且通過使用一些安全證照和加密包的方式,對資料提供保護。所以,會有一些專門的機構(如 VeriSign 以及 Microsoft 等)負責頒發信任證照給網站,並且將這些信任協議預先安裝在瀏覽器中,所以說,這兩個機構相當於德高望重的值得被信賴的人。我們進入一個網站時,在瀏覽器位址列的一側,經常會有一個鎖子,這個鎖子就代表網站的是否安全,例如我們在 Chrome 中輸入百度的網址,會看到左側綠色的鎖子和安全兩個字。在 Firefox 還可以看到它的安全證照,長這樣:

Firefox中的百度安全證照

可以看到證照的頒發機構是Global Sign.

Https 是通過叫做 SSL/TLS 技術來加密資料包,TLS,叫做傳輸層安全協議(Transport Layer Security),它的前身是 SSL,叫做安全套接層(Secure Sockets Layer),其實,Https 歷史淵源很久了,這是1994年網景推出第一代瀏覽器網景導航者時提出的,當時,它們就用 SSL 加密,後來 IETF 將這項技術標準化,於1999年推出 TLS。所以說,Https 的安全保障是建立在 SSL/TLS 技術的基礎上的。

另外,Http 和 Https 的一個區別是,前者使用 80 埠傳輸,而後者使用 443 埠。

下面的內容是在一次完整的 HTTP 請求中的過程以及相關概念。

  • 請求資訊(報文)
  • 迴應資訊(報文)
  • 請求方法(動作)
  • 狀態碼(status code)

請求資訊(報文)

請求資訊是包含了一個 HTTP 請求的基本資訊的報文,其第一行包括請求方法(下面詳述),資源路徑(一般指URL地址),HTTP協議版本號 三部分,下面是請求的Headers(主機名和一些告訴伺服器處理資訊的引數,例如接收的語言之類的)資訊。另外,在 POST 等請求方法中可以出現 Body 資訊,也就是發過去的資料。可以在 Chrome 的開發者工具下的 Network 皮膚左側的 Name 子皮膚下點選網址,然後在右側的 Headers 選項卡下檢視請求資訊。例如 google.com 的請求資訊如下圖。

Request Headers

迴應資訊(報文)

迴應資訊是指 server 端接受到請求資訊後,經過處理而返回的響應資訊,和請求資訊一樣,它同樣通過一個報文來實現,其主要內容是第一行是:HTTP協議版本號狀態碼狀態資訊,下面是 Headers,比請求更常見的 返回內容Body 。迴應資訊與請求資訊的最大不同是,它會返回一個狀態碼和狀態資訊,其它的差不多意思~其實狀態碼和狀態資訊,是比較常見的。

狀態碼(Status Code)

HTTP狀態碼(英語:HTTP Status Code)是用以表示網頁伺服器HTTP響應狀態的3位數字程式碼。它由 RFC 2616 規範定義的,並得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774 與 RFC 4918 等規範擴充套件。 所有狀態碼的第一個數字代表了響應的五種狀態之一。——來自維基百科.

那麼,我們不禁要問了,這五個數字和它所對應的五種狀態到底是什麼呢?打個比方好了,這就像戀愛中的表白,假如一位男士寫了一封極其浪漫的告白信向一個姑娘表白,那麼這封信就是請求資訊了,而回信則是迴應資訊,其中的內容就包含了狀態碼,接下來,我們來模擬一下,這位女士回覆以下幾種數字打頭的資訊,對應表白的成功與否。

  • 1XX,以1打頭的狀態碼錶示伺服器已經接受到請求,需要繼續處理,這是一種臨時響應狀態,這種狀態碼是不會傳送到客戶端來的~也就是說,女方收到了信,她還沒看呢,她總不會回一封信說:你的信我收到了,還沒拆!

  • 2XX,以2打頭的狀態碼代表請求已經被接收,並且完全懂了什麼意思並且接受了請求。也就是說,如果男士收到的回信內容是以2打頭的,那麼恭喜,告白成功了!

  • 3XX,以3打頭的狀態碼錶示需要客戶端需要進一步的操作才能完成請求~也就是說,這位姑娘的意思是,你必須要在北京有一套房才能答應你呢,或者說,我移居到美帝了,抓緊辦簽證找我吧~

  • 4XX,以4打頭的狀態碼錶示客戶端發生錯誤,妨礙了伺服器的處理。這就糟糕了,你的表白信估計寫的不大好,寫了一大堆表揚另外一位姑娘的話,所以,告白失敗!

  • 5XX,以5打頭的狀態表示伺服器在處理的過程中由於某些原因發生了錯誤,導致請求失敗。這回就是姑娘的問題,這位姑娘大概已經名花有主了,所以,告白失敗!

一共有以上五大類狀態碼,其中我們最常見的狀態碼是 200(請求成功,資料也將會返回),301(Moved permanently,資源被永久移動到新位置了),401(當前請求需要使用者驗證),404(請求失敗,所需的資源在伺服器上沒找到)。

而狀態資訊(State message),則指的是伺服器端根據狀態碼做出的描述性資訊,這是可以自定義的,例如我們常見的“404,糟糕,你要找的頁面走丟了”之類的~

請求方法(動作)

請求方法,也叫請求動作,就是客戶端向伺服器傳送請求時所用的對話方式,因為方法的不同,所能採取的操作也大大不同,HTTP 請求方法一共有8種。

  1. GET.獲取相關資源,這是最常見的方法之一,它只要求 URL 中包含請求資源的位置和伺服器返回資源的必要資訊。

  2. POST.向伺服器提交資料,可能是新增新資源或修改已存在資源,要新增的資訊包含在請求資訊 Headers 中,這類方法常見情景有提交表單,上傳檔案等。

  3. PUT.更新指定資源,上傳其最新版本,上傳的資料仍然會包含在請求資訊 Headers 中。

  4. DELETE.刪除一個已存在的資源。

  5. HEAD.與 PUT 類似,只不過它不會新增資訊到請求資訊中,所以經常用於一些資源的檢驗與驗證工作。

  6. TRACE.經常用於診斷工作。

  7. OPTIONS.這個方法可使伺服器傳回該資源所支援的所有 HTTP 請求方法。

其中,前四種比較常用。

總結

本文通過了解 HTTP 的基本概念:一個在客戶端和伺服器端交換超文字檔案(當然還有其他功能)的應用層協議;

然後接著瞭解了在一次 HTTP 請求中會發生什麼:客戶端傳送一個請求資訊(可能包括請求方法,資源路徑,協議版本號,Headers,請求Body等),請求資訊通過路由器等中間層的幾微秒的漫長旅程,到達伺服器(也可能到不了,404之類的你懂的),伺服器接受到請求後,會根據請求 Headers 以及 Body 的內容進行相關操作(資料新增,更新,刪除等),然後同樣返回一個響應訊息回去,這個響應訊息裡包含了客戶端需要的資訊,主要是 Body(可能是一個 HTML 頁面),當然還有狀態碼,狀態資訊,Headers 等,這樣,一次完整的 HTTP 請求就完成了。

我們會發現,如果前面這篇Web開發學習筆記——瀏覽器是如何工作的中我們瞭解了從 URL 輸入位址列開始,瀏覽器如何與 DNS 伺服器配合,完成 URL 到 IP 的匹配過程,從而定位到伺服器的位置,那麼今天,我們瞭解的東西,則是在知道伺服器的位置之後,瀏覽器是如何在 HTTP 協議的約定下,去完成傳送與取得資料的過程。也就是說,昨天我們研究了路線,今天我們研究了在路上的故事。

我們的學習過程,也將是這樣一個循序漸進的過程,希望我可以踏踏實實走好每一步路,文章中的謬誤之處,希望大家多多指出,不勝感激。

參考資料

相關文章