咱們絕大多數的Web應用都是基於HTTP來進行開發的。咱們對Web的操做都是經過HTTP協議來進行傳輸數據的。html
簡單來講,HTTP協議就是客戶端和服務器交互的一種通迅的格式。程序員
HTTP的誕生主要是爲了可以讓文檔之間相互關聯,造成超文本能夠互相傳閱數據庫
能夠說,Http就是Web通訊的基礎,這是咱們必學的。apache
咱們學計算機網絡的時候就知道,咱們把計算機網絡分層了5層,通常咱們如今用的都是TCP/IP這麼一個分層結構。瀏覽器
雖然官方的是ISO 提出的7層結構,可是僅僅是理論基礎,在實際上大多人都是使用TCP/IP的分層結構緩存
首先,咱們先得知道,爲何咱們要在計算機網絡中分層次???tomcat
由於若是兩臺計算機可以相互通訊的話,實際實現起來是很是困難操做的...咱們分層的目的就是爲了將困難的問題簡單化,而且若是咱們分層了,咱們在使用的時候就可以僅僅關注咱們須要關注的層次,而不用理會其餘層。安全
若是須要改動設計的時候,咱們只須要把變更的層替換便可,並不用涉及到其餘的層次。這與咱們程序設計中的低耦合是一個概念。服務器
而咱們的HTTP協議是在最上層,也就是應用層。這是最貼近咱們的程序員的層次。微信
咱們知道HTTP是在應用層中的,顯然,咱們在Web通訊的過程當中,不只僅是須要HTTP協議的,還會涉及到其餘的協議的。
DNS:負責解析域名
www.zhongfucheng.site
,而計算機通訊只認的是咱們的主機地址(192.168.xxx.xxx),所以,當咱們輸入域名的時候,須要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中的一部分。
咱們若是不使用任何手段,服務器返回的數據實體主體是原樣返回的。咱們可使用兩種方式來提升傳輸效率
咱們若是在下載東西的過程當中斷了,按照之前咱們是須要從新下載的,可是如今能夠在中斷中繼續下載。咱們能夠使用到獲取範圍數據,這種叫作範圍請求!
這種請求只會下載資源的一部分。
通常是請求成功
200 正常處理
204 成功處理,但服務器沒有新數據返回,顯示頁面不更新
206 對服務器進行範圍請求,只返回一部分數據
通常表示重定向
301 請求的資源已分配了新的URI中,URL地址改變了。【永久重定向】
302 請求的資源臨時分配了新的URI中,URL地址沒變【臨時重定向】
303 與302相同的功能,但明確客戶端應該採用GET方式來獲取資源
304 發送了附帶請求,但不符合條件【返回未過時的緩存數據】
307 與302相同,但不會把POST請求變成GET
表示客戶端出錯了。
400 請求報文語法錯誤了
401 須要認證身份
403 沒有權限訪問
404 服務器沒有這個資源
服務器出錯了
500 內部資源出錯了
503 服務器正忙
首先要說的是,一個HTTP服務器能夠擁有多個站點,也就是說:HTTP下能夠配置多個虛擬主機。當用戶訪問不一樣主機的時候,實際上都是訪問同一臺HTTP服務器。
在客戶端和服務器中還有一些用於通訊數據轉發的應用程序:
HTTP請求報文:在請求中,HTTP報文由方法、URI、HTTP版本、HTTP首部字段等部分組成。
首部字段例子:
HTTP響應報文:在響應中,HTTP報文由HTTP版本、狀態碼(數字和緣由短語)、HTTP首部字段3部分組成。
狀態行:
首部字段例子:
對於HTTP首部這一部分是很是龐大的一個章節,知識點也不少,我就沒有一一去記錄了。用到的時候再查吧。我看的是《圖解HTTP》。
HTTP在安全上是不足的
咱們通常在上網時,使用抓包工具就很容易獲取到HTTP請求的信息了,這是TCP/IP在網絡通訊中沒法避免的。
假設咱們對HTTP報文進行加密了, 那也僅僅是是內容的加密。別人獲取到了HTTP內容了,即便沒法破解HTTP內容,仍是可以篡改的。
咱們最好就是使用SSL創建安全的通訊線路,就能夠在這條線路上進行HTTP通訊了。
其實HTTPS就是披着SSL的HTTP...
HTTPS使用的是共享密鑰和公開私有密鑰混合來進行加密的。因爲公開私有密鑰須要太多的資源,不可能一直以公開私有密鑰進行通訊。所以,HTTP在創建通訊線路的時候使用公開私有密鑰,當創建完鏈接後,隨後就使用共享密鑰進行加密和解密了
對於認證方面,HTTPS是基於第三方的認證機構來獲取認受承認的證書、所以,能夠從中認證該服務器是不是合法的。
而客戶端方面則須要本身購買認證證書、這實施起來難度是很大的【認證證書須要錢】。
因此,通常的網站都是使用表單認證就算了,這是用得最普遍的客戶端認證了。
若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章的同窗,能夠關注微信公衆號:Java3y