我們絕大多數的Web應用都是基於HTTP來進行開發的。我們對Web的操作都是通過HTTP協議來進行傳輸數據的。
簡單來說,HTTP協議就是客戶端和伺服器交互的一種通迅的格式。
HTTP的誕生主要是為了能夠讓文檔之間相互關聯,形成超文本可以互相傳閱
可以說,Http就是Web通信的基礎,這是我們必學的。
我們學計算機網絡的時候就知道,我們把計算機網絡分層了5層,一般我們現在用的都是TCP/IP這麼一個分層結構。
雖然官方的是ISO 提出的7層結構,但是僅僅是理論基礎,在實際上大多人都是使用TCP/IP的分層結構
首先,我們先得知道,為什麼我們要在計算機網絡中分層次???
因為如果兩台計算機能夠相互通信的話,實際實現起來是非常困難操作的…我們分層的目的就是為了將困難的問題簡單化,並且如果我們分層了,我們在使用的時候就可以僅僅關注我們需要關注的層次,而不用理會其他層。
如果需要改動設計的時候,我們只需要把變動的層替換即可,並不用涉及到其他的層次。這與我們程序設計中的低耦合是一個概念。
而我們的HTTP協議是在最上層,也就是應用層。這是最貼近我們的程式設計師的層次。
網站通信粗略過程
我們知道HTTP是在應用層中的,顯然,我們在Web通信的過程中,不僅僅是需要HTTP協議的,還會涉及到其他的協議的。
DNS:負責解析域名
HTTP:產生請求報文數據
這裡寫圖片描述
TCP協議:分割HTTP數據,保證數據運輸
IP協議:傳輸數據包,找到通信目的地地址。
接下來就離我們比較遠了,屬於硬體相關的了,也就是鏈路層和物理層。以後複習到計算機網絡的時候再來補充吧!
我們網頁上請求數據就是上邊這麼一個流程。
我們如果開發過Web程序的話,我們知道常用的提交方式有POST和GET方法
我們也知道GET是用來獲取數據的,POST是用來提交數據的。
其實HTTP協議中還支持著其他的方法,比如:Input、Delete、OPTIONS很多這樣的方法。而由於常用,於是我們也可能僅僅知道GET和POST方法了。
HTTP提供方法的目的就是為了告知伺服器該客戶端想進行什麼操作。當HTTP是OPTIONS方法的時候,伺服器端就會返回它支持什麼HTTP方法。
當然了,現在RESTful盛行,也就是充分利用了HTTP協議的這些方法。
HTTP是無狀態的,也就是說,它是不對通信狀態進行保存的。它並不知道之前通信的對方是誰。這樣設計的目的就是為了讓HTTP簡單化,能夠快速處理大量的事務!
但是,我們經常是需要知道訪問的人是誰,於是就有了Cookie技術了。
在HTTP1.0的時候,每一次進行HTTP通信就會斷開一次連接。如果容量很少的文本傳輸是沒有問題的。但是如果我們訪問一個網頁,該網頁有非常多的圖片。一個圖片就算上一個HTTP請求了。那麼在中途中就不斷地建立TCP連接、獲取圖片、斷開TCP連接。
這樣是非常浪費資源的,因此在HTTP1.1版本,就是持久連接了。一次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請求報文
HTTP請求報文:在請求中,HTTP報文由方法、URI、HTTP版本、HTTP首部欄位等部分組成。
首部欄位例子:
HTTP響應報文
HTTP響應報文:在響應中,HTTP報文由HTTP版本、狀態碼(數字和原因短語)、HTTP首部欄位3部分組成。
狀態行:
首部欄位例子:
對於HTTP首部這一部分是非常龐大的一個章節,知識點也很多,我就沒有一一去記錄了。用到的時候再查吧。我看的是《圖解HTTP》。
HTTP在安全上是不足的
我們一般在上網時,使用抓包工具就很容易獲取到HTTP請求的信息了,這是TCP/IP在網絡通信中無法避免的。
假設我們對HTTP報文進行加密了, 那也僅僅是是內容的加密。別人獲取到了HTTP內容了,即使無法破解HTTP內容,還是能夠篡改的。
我們最好就是使用SSL建立安全的通信線路,就可以在這條線路上進行HTTP通信了。
其實HTTPS就是披著SSL的HTTP…
HTTPS使用的是共享密鑰和公開私有密鑰混合來進行加密的。由於公開私有密鑰需要太多的資源,不可能一直以公開私有密鑰進行通信。因此,HTTP在建立通信線路的時候使用公開私有密鑰,當建立完連接後,隨後就使用共享密鑰進行加密和解密了
對於認證方面,HTTPS是基於第三方的認證機構來獲取認受認可的證書、因此,可以從中認證該伺服器是否是合法的。
而客戶端方面則需要自己購買認證證書、這實施起來難度是很大的【認證證書需要錢】。
所以,一般的網站都是使用表單認證就算了,這是用得最廣泛的客戶端認證了。
原文地址:https://dwz.cn/Y5JClvg9作者:Java3y