本篇瞭解 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 還可以看到它的安全證照,長這樣:
可以看到證照的頒發機構是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 的請求資訊如下圖。
迴應資訊(報文)
迴應資訊是指 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種。
-
GET.獲取相關資源,這是最常見的方法之一,它只要求 URL 中包含請求資源的位置和伺服器返回資源的必要資訊。
-
POST.向伺服器提交資料,可能是新增新資源或修改已存在資源,要新增的資訊包含在請求資訊 Headers 中,這類方法常見情景有提交表單,上傳檔案等。
-
PUT.更新指定資源,上傳其最新版本,上傳的資料仍然會包含在請求資訊 Headers 中。
-
DELETE.刪除一個已存在的資源。
-
HEAD.與 PUT 類似,只不過它不會新增資訊到請求資訊中,所以經常用於一些資源的檢驗與驗證工作。
-
TRACE.經常用於診斷工作。
-
OPTIONS.這個方法可使伺服器傳回該資源所支援的所有 HTTP 請求方法。
其中,前四種比較常用。
總結
本文通過了解 HTTP 的基本概念:一個在客戶端和伺服器端交換超文字檔案(當然還有其他功能)的應用層協議;
然後接著瞭解了在一次 HTTP 請求中會發生什麼:客戶端傳送一個請求資訊(可能包括請求方法,資源路徑,協議版本號,Headers,請求Body等),請求資訊通過路由器等中間層的幾微秒的漫長旅程,到達伺服器(也可能到不了,404之類的你懂的),伺服器接受到請求後,會根據請求 Headers 以及 Body 的內容進行相關操作(資料新增,更新,刪除等),然後同樣返回一個響應訊息回去,這個響應訊息裡包含了客戶端需要的資訊,主要是 Body(可能是一個 HTML 頁面),當然還有狀態碼,狀態資訊,Headers 等,這樣,一次完整的 HTTP 請求就完成了。
我們會發現,如果前面這篇Web開發學習筆記——瀏覽器是如何工作的中我們瞭解了從 URL 輸入位址列開始,瀏覽器如何與 DNS 伺服器配合,完成 URL 到 IP 的匹配過程,從而定位到伺服器的位置,那麼今天,我們瞭解的東西,則是在知道伺服器的位置之後,瀏覽器是如何在 HTTP 協議的約定下,去完成傳送與取得資料的過程。也就是說,昨天我們研究了路線,今天我們研究了在路上的故事。
我們的學習過程,也將是這樣一個循序漸進的過程,希望我可以踏踏實實走好每一步路,文章中的謬誤之處,希望大家多多指出,不勝感激。