HTTP就是這麼簡單

爲何要學HTTP?

咱們絕大多數的Web應用都是基於HTTP來進行開發的。咱們對Web的操做都是經過HTTP協議來進行傳輸數據的。html

簡單來講,HTTP協議就是客戶端和服務器交互的一種通迅的格式程序員

HTTP的誕生主要是爲了可以讓文檔之間相互關聯,造成超文本能夠互相傳閱數據庫

能夠說,Http就是Web通訊的基礎,這是咱們必學的。apache

HTTP基礎概念

咱們學計算機網絡的時候就知道,咱們把計算機網絡分層了5層,通常咱們如今用的都是TCP/IP這麼一個分層結構。瀏覽器

雖然官方的是ISO 提出的7層結構,可是僅僅是理論基礎,在實際上大多人都是使用TCP/IP的分層結構緩存

首先,咱們先得知道,爲何咱們要在計算機網絡中分層次???tomcat

由於若是兩臺計算機可以相互通訊的話,實際實現起來是很是困難操做的...咱們分層的目的就是爲了將困難的問題簡單化,而且若是咱們分層了,咱們在使用的時候就可以僅僅關注咱們須要關注的層次,而不用理會其餘層安全

若是須要改動設計的時候,咱們只須要把變更的層替換便可,並不用涉及到其餘的層次。這與咱們程序設計中的低耦合是一個概念。服務器

而咱們的HTTP協議是在最上層,也就是應用層。這是最貼近咱們的程序員的層次。微信

網站通訊粗略過程

咱們知道HTTP是在應用層中的,顯然,咱們在Web通訊的過程當中,不只僅是須要HTTP協議的,還會涉及到其餘的協議的

DNS:負責解析域名

  • 咱們訪問一個網頁的時候,每每是經過域名來訪問的www.zhongfucheng.site,而計算機通訊只認的是咱們的主機地址(192.168.xxx.xxx),所以,當咱們輸入域名的時候,須要DNS把域名解析成主機來進行訪問。

HTTP:產生請求報文數據

  • 當咱們對Web頁面進行操做的時候,就會產生HTTP報文數據,請求對應的服務端進行響應。

這裏寫圖片描述

TCP協議:分割HTTP數據,保證數據運輸

  • TCP協議採用了三次握手的方式來保證數據的準確運輸,在運輸的數據的時候,發送標識過去給服務器,服務器也返回標識給客戶端,而客戶端收到消息後再次返回標識給服務器。這樣一來就保證了數據運輸是可靠的。

IP協議:傳輸數據包,找到通訊目的地地址。

  • IP協議把咱們的產生的數據包發送給對方,IP地址指明瞭節點被分配的地址,但IP地址可能會變換,咱們可使用ARP協議來將IP地址反射爲MAC地址。MAC地址是不會更改的,是網卡所屬的固定地址。
  • 在找到通訊目的地以前,咱們是須要不斷的中轉的,這過程咱們稱做爲:「路由中轉」,咱們並不知道路由中轉了多少次的。所以是不能全面瞭解到互聯網中的傳輸情況的。

接下來就離咱們比較遠了,屬於硬件相關的了,也就是鏈路層和物理層。之後複習到計算機網絡的時候再來補充吧!

咱們網頁上請求數據就是上邊這麼一個流程

告知服務器請求的意圖

咱們若是開發過Web程序的話,咱們知道經常使用的提交方式有POST和GET方法

咱們也知道GET是用來獲取數據的,POST是用來提交數據的。

其實HTTP協議中還支持着其餘的方法,好比:Input、Delete、OPTIONS不少這樣的方法。而因爲經常使用,因而咱們也可能僅僅知道GET和POST方法了。

HTTP提供方法的目的就是爲了告知服務器該客戶端想進行什麼操做。當HTTP是OPTIONS方法的時候,服務器端就會返回它支持什麼HTTP方法。

固然了,如今RESTful盛行,也就是充分利用了HTTP協議的這些方法

HTTP是不保存狀態的協議

HTTP是無狀態的,也就是說,它是不對通訊狀態進行保存的。它並不知道以前通訊的對方是誰。這樣設計的目的就是爲了讓HTTP簡單化,可以快速處理大量的事務!

可是,咱們常常是須要知道訪問的人是誰,因而就有了Cookie技術了。

  • 要是服務器端想要記住客戶端是誰,那麼就頒發一個cookie給客戶端
  • 客戶端把Cookie保存在硬盤中,當下次訪問服務器的時候,瀏覽器會自動把客戶端的cookie帶過去。
  • 就這樣,服務器就可以知道這傢伙是誰了。

持久鏈接

在HTTP1.0的時候,每一次進行HTTP通訊就會斷開一次鏈接。若是容量不多的文本傳輸是沒有問題的。可是若是咱們訪問一個網頁,該網頁有很是多的圖片。一個圖片就算上一個HTTP請求了。那麼在中途中就不斷地創建TCP鏈接、獲取圖片、斷開TCP鏈接。

這樣是很是浪費資源的,所以在HTTP1.1版本,就是持久鏈接了。一次HTTP鏈接可以處理多個請求

持久鏈接爲「管線化」方式發送成爲了可能:在一次HTTP鏈接裏面,不須要等待服務器響應請求,就可以繼續發送第二次請求

提高傳輸效率

在說明以前,首先咱們要知道什麼是實體主體

  • 實體主體就是做爲數據在HTTP中傳輸的數據

通常地,實體主體能夠等價爲報文主體,報文主體是HTTP中的一部分

咱們若是不使用任何手段,服務器返回的數據實體主體是原樣返回的。咱們可使用兩種方式來提升傳輸效率

  • 使用壓縮技術把實體主體壓小,在客戶端再把數據解析
  • 使用分塊傳輸編碼,將實體主體分塊傳輸,當瀏覽器解析到實體主體就可以顯示了。

咱們若是在下載東西的過程當中斷了,按照之前咱們是須要從新下載的,可是如今能夠在中斷中繼續下載。咱們能夠使用到獲取範圍數據,這種叫作範圍請求

這種請求只會下載資源的一部分。

  • 好比個人圖片下載到一半了,咱們只須要下載另外一半就能夠組成一張完整的圖片了。那麼請求的時候請求沒有下載的一部分便可。

經常使用的狀態碼簡述

2XX

通常是請求成功

200 正常處理

204 成功處理,但服務器沒有新數據返回,顯示頁面不更新

206 對服務器進行範圍請求,只返回一部分數據

3XX

通常表示重定向

301 請求的資源已分配了新的URI中,URL地址改變了。【永久重定向】

302 請求的資源臨時分配了新的URI中,URL地址沒變【臨時重定向】

303 與302相同的功能,但明確客戶端應該採用GET方式來獲取資源

304 發送了附帶請求,但不符合條件【返回未過時的緩存數據】

307 與302相同,但不會把POST請求變成GET

4XX

表示客戶端出錯了。

400 請求報文語法錯誤了

401 須要認證身份

403 沒有權限訪問

404 服務器沒有這個資源

5XX

服務器出錯了

500 內部資源出錯了

503 服務器正忙

服務器與客戶端之間的應用程序

首先要說的是,一個HTTP服務器能夠擁有多個站點,也就是說:HTTP下能夠配置多個虛擬主機。當用戶訪問不一樣主機的時候,實際上都是訪問同一臺HTTP服務器。

在客戶端和服務器中還有一些用於通訊數據轉發的應用程序

  • 代理
    • 能夠用來緩存數據,當代理緩存了數據之後,客戶端就能夠直接用代理獲取數據
    • 能夠用來對網站進行訪問控制,獲取訪問日誌記錄
  • 網關
    • 可以提供非HTTP請求的操做,訪問數據庫什麼的
  • 隧道
    • 創建一條安全的通訊路徑,可使用SSL等加密手段進行通訊。

HTTP首部簡述

HTTP請求報文

HTTP請求報文:在請求中,HTTP報文由方法、URI、HTTP版本、HTTP首部字段等部分組成。

  1. 請求行【描述客戶端的請求方式請求的資源名稱,以及使用的HTTP協議版本號
  2. 首部字段【描述客戶端請求哪臺主機,以及客戶端的一些環境信息等】
  3. 一個空行

首部字段例子:

  • Accept: text/html,image/* 【瀏覽器告訴服務器,它支持的數據類型】
  • Accept-Charset: ISO-8859-1 【瀏覽器告訴服務器,它支持哪一種字符集
  • Accept-Encoding: gzip,compress 【瀏覽器告訴服務器,它支持的壓縮格式
  • Accept-Language: en-us,zh-cn 【瀏覽器告訴服務器,它的語言環境】
  • Host: www.it315.org:80【瀏覽器告訴服務器,它的想訪問哪臺主機】
  • If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT【瀏覽器告訴服務器,緩存數據的時間】
  • Referer: http://www.it315.org/index.jsp【瀏覽器告訴服務器,客戶機是從那個頁面來的---反盜鏈
  • 8.User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)【瀏覽器告訴服務器,瀏覽器的內核是什麼】
  • Cookie【瀏覽器告訴服務器,帶來的Cookie是什麼
  • Connection: close/Keep-Alive 【瀏覽器告訴服務器,請求完後是斷開連接仍是保持連接】
  • Date: Tue, 11 Jul 2000 18:23:51 GMT【瀏覽器告訴服務器,請求的時間】

HTTP響應報文

HTTP響應報文:在響應中,HTTP報文由HTTP版本、狀態碼(數字和緣由短語)、HTTP首部字段3部分組成。

  1. 一個狀態行【用於描述服務器對請求的處理結果。
  2. 首部字段【用於描述服務器的基本信息,以及數據的描述服務器經過這些數據的描述信息,能夠通知客戶端如何處理等一下子它回送的數據
  3. 一個空行
  4. 實體內容【服務器向客戶端回送的數據

狀態行:

  • 格式: HTTP版本號 狀態碼 緣由敘述
  • 狀態行:HTTP/1.1 200 OK
  • 狀態碼用於表示服務器對請求的處理結果,它是一個三位的十進制數。響應狀態碼分爲5類

首部字段例子:

  • Location: http://www.it315.org/index.jsp 【服務器告訴瀏覽器要跳轉到哪一個頁面
  • Server:apache tomcat【服務器告訴瀏覽器,服務器的型號是什麼】
  • Content-Encoding: gzip 【服務器告訴瀏覽器數據壓縮的格式
  • Content-Length: 80 【服務器告訴瀏覽器回送數據的長度】
  • Content-Language: zh-cn 【服務器告訴瀏覽器,服務器的語言環境】
  • Content-Type: text/html; charset=GB2312 【服務器告訴瀏覽器,回送數據的類型
  • Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT【服務器告訴瀏覽器該資源上次更新時間】
  • Refresh: 1;url=http://www.it315.org【服務器告訴瀏覽器要定時刷新
  • Content-Disposition: attachment; filename=aaa.zip【服務器告訴瀏覽器如下載方式打開數據
  • Transfer-Encoding: chunked 【服務器告訴瀏覽器數據以分塊方式回送】
  • Set-Cookie:SS=Q0=5Lb_nQ; path=/search【服務器告訴瀏覽器要保存Cookie
  • Expires: -1【服務器告訴瀏覽器不要設置緩存
  • Cache-Control: no-cache 【服務器告訴瀏覽器不要設置緩存
  • Pragma: no-cache 【服務器告訴瀏覽器不要設置緩存
  • Connection: close/Keep-Alive 【服務器告訴瀏覽器鏈接方式】
  • Date: Tue, 11 Jul 2000 18:23:51 GMT【服務器告訴瀏覽器回送數據的時間】

對於HTTP首部這一部分是很是龐大的一個章節,知識點也不少,我就沒有一一去記錄了。用到的時候再查吧。我看的是《圖解HTTP》。

HTTPS簡述

HTTP在安全上是不足的

  • 通訊使用明文【沒有加密過內容的】
  • 不驗證通訊方身份,不管是客戶端和服務器,都是隨意通訊的
  • 沒法證實報文的完整性【別人監聽後,能夠篡改】

咱們通常在上網時,使用抓包工具就很容易獲取到HTTP請求的信息了,這是TCP/IP在網絡通訊中沒法避免的。

假設咱們對HTTP報文進行加密了, 那也僅僅是是內容的加密。別人獲取到了HTTP內容了,即便沒法破解HTTP內容,仍是可以篡改的。

咱們最好就是使用SSL創建安全的通訊線路,就能夠在這條線路上進行HTTP通訊了。

其實HTTPS就是披着SSL的HTTP...

HTTPS使用的是共享密鑰和公開私有密鑰混合來進行加密的。因爲公開私有密鑰須要太多的資源,不可能一直以公開私有密鑰進行通訊。所以,HTTP在創建通訊線路的時候使用公開私有密鑰,當創建完鏈接後,隨後就使用共享密鑰進行加密和解密了

對於認證方面,HTTPS是基於第三方的認證機構來獲取認受承認的證書、所以,能夠從中認證該服務器是不是合法的。

而客戶端方面則須要本身購買認證證書、這實施起來難度是很大的【認證證書須要錢】。

因此,通常的網站都是使用表單認證就算了,這是用得最普遍的客戶端認證了。


若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章的同窗,能夠關注微信公衆號:Java3y

相關文章
相關標籤/搜索